锁定老帖子 主题:国王和100个犯人-
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-16
代码不规范就是不规范,不规范成了习惯也不能期望一下子就规范,C++很好,可是要是你要那个java去写C++似的代码那我觉得你还是继续C++,而且就算是C++这也不像啊,C++也讲代码规范。OO是否,跟你用C++或Java没什么关心,只是你的肯定不OO.
public static boolean light 这样的东西,有Class不能就说是OO吧 |
|
返回顶楼 | |
发表时间:2010-01-16
这是 Class Oriented ……
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。 |
|
返回顶楼 | |
发表时间:2010-01-16
night_stalker 写道 这是 Class Oriented ……
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。 同意,感觉这么做意思不太大。根据需求来设计比较好。没必要吧简单的问题搞那么复杂 |
|
返回顶楼 | |
发表时间:2010-01-16
public class Game { private static final int COUNT_OF_PRISONERS = 100; private Light light; private Prisoner[] prisoners; private int day; public void start() { init(); while (true) { Prisoner prisoner = prisoners[(int)(Math.random()*COUNT_OF_PRISONERS)]; prisoner.freely(light); if (prisoner instanceof Counter) { if (((Counter) prisoner).isfinish(COUNT_OF_PRISONERS)) { break; } } day++; } System.out.println(day / 365); } private void init() { light = new Light(); addPrisoners(); setCounter(); } private void addPrisoners() { prisoners = new Prisoner[COUNT_OF_PRISONERS]; for (int i = 0; i < COUNT_OF_PRISONERS; i++) { prisoners[i] = new Prisoner(); } } private void setCounter() { int randNum = (int)(Math.random()*COUNT_OF_PRISONERS); prisoners[randNum] = new Counter(); } public static void main(String[] args) { new Game().start(); } } public class Prisoner { private boolean turnOnLight = false; public void freely(final Light light){ if(turnOnLight||light.isOpen()){ return ; } light.turnOn(); } } public class Counter extends Prisoner { private int count = 0; @Override public void freely(final Light light) { if(light.isOpen()){ light.turnOff(); count++; } } public boolean isfinish(int prisonerNum){ return count == prisonerNum-1; } } public class Light { private boolean open ; public void turnOn(){ open = true; } public void turnOff(){ open = false; } public boolean isOpen(){ return open; } } |
|
返回顶楼 | |
发表时间:2010-01-16
linhong_1001 写道 代码不规范就是不规范,不规范成了习惯也不能期望一下子就规范,C++很好,可是要是你要那个java去写C++似的代码那我觉得你还是继续C++,而且就算是C++这也不像啊,C++也讲代码规范。OO是否,跟你用C++或Java没什么关心,只是你的肯定不OO.
public static boolean light 这样的东西,有Class不能就说是OO吧 我从来不认为只有Java的规范才是OO而C++的写法就不是OO。OO是一种思想,就像Java中的接口;而Java,C++,甚至JavaScript等语言都是OO的一种实现,就像实现了某个接口的具体的类。OO实现起来每种语言都不一样。 关于那个light,其实您只是用Java的一些所谓的规范来认定OO,您没有想过什么才是OO。而且,我认为编程是件很自由的事,如果一定要遵循某种规范的话,那让机器写代码好了。为什么语言的设计者都会留很多并不规范的余地呢,不就是让程序员更自由吗? |
|
返回顶楼 | |
发表时间:2010-01-16
night_stalker 写道 这是 Class Oriented ……
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。 无聊了不得找点乐子吗 其实你现在逛论坛看贴回贴不也是在将简单的问题复杂化? |
|
返回顶楼 | |
发表时间:2010-01-16
最后修改:2010-01-16
...重新算了下 (100) + 99/99 + 100 + 99/98 + 100 + ... = 512.560374 + 9900 = 10412.56374/10512.56374 guxiao05 写道
已经失业半年的 =================================== 灯 package justforfun; public class Light { private static Light _light; // 电灯 private boolean _state; // 电灯的状态 private Light() { _state = false; // 默认是关闭的 } public static Light creatLight() { if (_light == null) { _light = new Light(); } return _light; } public void open() { _state = true; } public void close() { _state = false; } public boolean isOpen() { return _state; } } 犯人 package justforfun; import java.util.Observable; public class Prisoner extends Observable { protected int _no; // 犯人的编号 private boolean _operationFlag; // 是否进行过操作 public Prisoner(int no) { _no = no; _operationFlag = false; } public void operation(Light light) { if (!_operationFlag && !light.isOpen()) { light.open(); _operationFlag = true; } } public static Counter upgradeToCounter(Prisoner prisoner, int size) { return new Counter(prisoner._no, size); } } 计数者 package justforfun; public class Counter extends Prisoner { private int _count = 0; // 关灯的次数 private int _maxCount; // 监狱中罪犯的人数 public Counter(int no, int maxCount) { super(no); _maxCount = maxCount; } @Override public void operation(Light light) { if (light.isOpen()) { light.close(); _count++; if (isEnd()) { setChanged(); notifyObservers("所有的犯人都出来放过风了"); } } } private boolean isEnd() { return _count == _maxCount - 1; } }
监狱 package justforfun; import java.util.ArrayList; import java.util.List; public class Prison { private List<Prisoner> _prison; // 监狱 private int _size; // 监狱大小 private static final int INIT_SIZE = 100; // 监狱初始大小为100 public Prison() { this(INIT_SIZE); } public Prison(int size) { _size = size; _prison = new ArrayList<Prisoner>(_size); } public boolean addPrisoner(Prisoner prisoner) { if (_prison.size() >= _size) { throw new RuntimeException("监狱已满!请申请扩建。"); } else { _prison.add(prisoner); return true; } } public void replacePrisoner(Prisoner prisoner) { _prison.set(prisoner._no, prisoner); } public Prisoner getPrisoner(int no) { if (no > _prison.size()) { throw new RuntimeException("对不起!没有你要找的人。"); } else { return _prison.get(no); } } public int getPrisonSize() { return _prison.size(); } }
国王 package justforfun; import java.util.Observable; import java.util.Observer; import java.util.Random; public class King implements Observer { boolean isEnd = false; // 是否结束 public static final int PRISON_SIZE = 100; public static void main(String[] args) { King king = new King(); Prison prison = initPrison(king); meeting(king, prison); // 犯人们在开会 int day = start(king, prison); System.out.println("过去了" + day / 365 + "年" + day % 365 + "天, 犯人们都解放了"); } private static int start(King king, Prison prison) { Light light = Light.creatLight(); // 无尽的日子开始了... int day = 0; while (!king.isEnd) { // 煎熬中... prison.getPrisoner(new Random().nextInt(PRISON_SIZE)).operation( light); day++; } return day; } // 先抓点犯人扔进监狱 private static Prison initPrison(King king) { Prison prison = new Prison(PRISON_SIZE); for (int i = 0; i < PRISON_SIZE; i++) { Prisoner prisoner = new Prisoner(i); prisoner.addObserver(king); prison.addPrisoner(prisoner); } return prison; } private static void meeting(King king, Prison prison) { Prisoner specialPrisoner = prison.getPrisoner(new Random() .nextInt(PRISON_SIZE)); // 选出一个犯人 specialPrisoner = Prisoner.upgradeToCounter(specialPrisoner, prison .getPrisonSize()); // 犯人升级为计数者 specialPrisoner.addObserver(king); prison.replacePrisoner(specialPrisoner); } // 接收来自犯人的通知 @Override public void update(Observable prisoner, Object content) { System.out.println(content); isEnd = true; } }
|
|
返回顶楼 | |
发表时间:2010-01-16
********************************************************************* 不 要 过 度 设 计! ********************************************************************* |
|
返回顶楼 | |
发表时间:2010-01-17
红楼一梦 写道 linhong_1001 写道 不知道是怎么个好法?是若是OO,第一种稍微强点,可是代码中那么多废话也要命。还有那个老是C++什么的,现在又不是在C++,既然要写java就像点java。
C++没什么不好的啊,C++也是OO的。Java不也是从c++发展过来的吗?刚学Java,觉得Java规范太多,C++灵活些。我觉得我写的很像Java。等号两边加不加空格,if语句怎么写这完全是个人习惯,无关大局,有必要争论吗? 即使是c或者c++也不推荐用magic number。特别是你一会儿是100,一会儿是99,而且注释里也有这些数字,以后你未必记得到底99是100-1得来的,还是一个不相关的magic number。 |
|
返回顶楼 | |
发表时间:2010-01-17
要是我写就不会对那么多东西建模,没有必要
|
|
返回顶楼 | |