锁定老帖子 主题:国王和100个犯人-
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-17
metaphy 写道 ********************************************************************* 不 要 过 度 设 计! ********************************************************************* 太严肃了 |
|
返回顶楼 | |
发表时间:2010-01-17
hkliya 写道 题目要求请看原帖http://www.iteye.com/topic/569275
此题的解题思路是:从100个犯人中指定一个作为计数员。当每天随机挑一个犯人放风时,如果是普通犯人,如果他是第一次放风并且灯是关着的,就把灯打开,如果是计数员,他看见灯开着,他就给关掉,并记录总共关了多少次灯,当关到99次时,说明所有人都放过风了。 下面是我自己感觉写的还行的代码,请大牛们帮我挑挑毛病 我的意思是这几个类的设计是否合理,哪个对象里应该持有哪个对象的引用这些方面 或者从扩展性,维护性来说有哪些不足,谢谢大家 =================================== 已更新第二版代码,加入log4j和继承 package com.javaeye.hkliya.prisongame; import java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; /** * 变态的国王 * * @author Administrator * */ public class King { // 参与此变态游戏的犯人数 public static final int COUNT_OF_PRISONERS = 100; // 游戏是否进行中 private AtomicBoolean gameRunning = new AtomicBoolean(); // 游戏进行的天数 private int countOfDays; // 所有犯人 private Prisoner[] prisoners = new Prisoner[COUNT_OF_PRISONERS]; // 放过风的犯人 private Set<Prisoner> outedPrisonersSet = new HashSet<Prisoner>(); /** * 是否所有犯人都已放过风? * * @return */ private boolean isAllOuted() { return outedPrisonersSet.size() == COUNT_OF_PRISONERS; } /** * 某个犯人报告国王他完成了任务 * * @param prisoner * 来报告的犯人 */ public void accomplishTask(Prisoner prisoner) { gameRunning.set(false); System.out.println("犯:我亲爱的国王陛下,您的犯人编号" + prisoner.getUuid() + "可以肯定的告诉您,我的兄弟们全都到院子放过风了!"); System.out.println("王:Oh, 真的吗?等我看一下记录先。。。"); System.out.println("国王查看记录中。。。"); System.out.println("5秒钟后。。。"); if (isAllOuted()) { System.out.println("王:哇靠!真的呢!你不会是蒙的吧?"); System.out.println("犯:My dear king! 吾已是戴罪之身,又岂敢再欺君犯上?且听我慢慢道来。。。"); System.out.println("省略500字。。。"); System.out .println("王:人才!你TM真是个人才!虽然用了" + countOfDays + "天,不过还是达到要求了!I服了You!\n " + "(国王转头对旁边一公公道)小李子,免了他们的罪,每人发一张车票,让他们回家过年吧!\n " + "还有,把这个编号" + prisoner.getUuid() + "的留下,咱们那个软件部不是缺个HR经理吗?\n 就让他去,让他出逻辑题,考死那帮来面试的孙子!\n 哈哈哈。。。就这么办,朕先洗洗睡了。。。"); return; } System.out.println("王:居然敢戏弄寡人,全部拉出去砍了!!!"); System.out.println("犯:大王铙命啊!程序有Bug总是难免的嘛,让我再调试一下啊!"); } /** * 开始游戏 */ public void startGame() { gameRunning.set(true); new Thread(new Runnable() { public void run() { Light light = new Light(); Yard yard = new Yard(); yard.setLight(light); for (int i = 0; i < COUNT_OF_PRISONERS; i++) { Prisoner prisoner = new Prisoner(i, yard, King.this); prisoners[i] = prisoner; } System.out.println("启禀陛下,要参加游戏的犯人已全部就位!"); Random random = new Random(); int randNum = random.nextInt(COUNT_OF_PRISONERS); prisoners[randNum].setAsCounter(); System.out.println("犯人们经过商量,得出计谋,并随机选到编号" + randNum + "的犯人作为计数员。。。"); System.out.println("游戏开始!"); // 没人报道游戏结束时,每天随机选出一个犯人到院子放风 while (gameRunning.get()) { int randIndex = random.nextInt(COUNT_OF_PRISONERS); // System.out.println("今天选到" + randIndex); prisoners[randIndex].outForExercise(); outedPrisonersSet.add(prisoners[randIndex]); countOfDays++; // 休息一天 // TimeUnit.DAYS.sleep(1); } } }).start(); } public static void main(String[] args) { new King().startGame(); } } package com.javaeye.hkliya.prisongame; /** * 路灯 * @author Administrator * */ public class Light { // 灯的状态,一开始是关着的 private boolean state = false; /** * 开灯 */ public void turnOn() { state = true; } /** * 关灯 */ public void turnOff() { state = false; } /** * 灯是否开着? * @return true 表示灯开着 * false 表示灯关着 */ public boolean isOn() { return state; } } package com.javaeye.hkliya.prisongame; /** * 犯人 * @author Administrator * */ public class Prisoner { // 犯人编号 private int uuid; // 是否计数员? true表示此犯人是计数员,false表示此犯人不是计数员 private boolean isCounter; // 关灯次数 private int turnOffTimes; // 此犯人放过风没? private boolean isFirstTime = true; private Yard yard; private King king; public Prisoner(int uuid, Yard yard, King king) { this.uuid = uuid; this.yard = yard; this.king = king; } /** * 指定此犯人为计数人 */ public void setAsCounter() { isCounter = true; } /** * 取得犯人的编号 * @return 该犯人编号 */ public int getUuid() { return uuid; } /** * 放风 */ public void outForExercise() { Light light = yard.getLight(); // 计数员 if (isCounter) { if (light.isOn()) { light.turnOff(); turnOffTimes++; if (turnOffTimes == King.COUNT_OF_PRISONERS-1) { king.accomplishTask(this); } } return; } // 普通犯人 if (isFirstTime && !light.isOn()) { light.turnOn(); isFirstTime = false; } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + uuid; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Prisoner other = (Prisoner) obj; if (uuid != other.uuid) return false; return true; } } package com.javaeye.hkliya.prisongame; /** * 供犯人放风的院子 * * @author Administrator * */ public class Yard { // 院子里有一盏路灯 private Light light; public Light getLight() { return light; } public void setLight(Light light) { this.light = light; } } 如果灯本来就开着的,计数员关99次灯够吗? |
|
返回顶楼 | |
发表时间:2010-01-17
wushexu 写道 要是我写就不会对那么多东西建模,没有必要
要是我就不回这么无聊的帖子,没有必要 |
|
返回顶楼 | |
发表时间:2010-01-17
wannago 写道 hkliya 写道 题目要求请看原帖http://www.iteye.com/topic/569275
此题的解题思路是:从100个犯人中指定一个作为计数员。当每天随机挑一个犯人放风时,如果是普通犯人,如果他是第一次放风并且灯是关着的,就把灯打开,如果是计数员,他看见灯开着,他就给关掉,并记录总共关了多少次灯,当关到99次时,说明所有人都放过风了。 下面是我自己感觉写的还行的代码,请大牛们帮我挑挑毛病 我的意思是这几个类的设计是否合理,哪个对象里应该持有哪个对象的引用这些方面 或者从扩展性,维护性来说有哪些不足,谢谢大家 =================================== 已更新第二版代码,加入log4j和继承 package com.javaeye.hkliya.prisongame; import java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; /** * 变态的国王 * * @author Administrator * */ public class King { // 参与此变态游戏的犯人数 public static final int COUNT_OF_PRISONERS = 100; // 游戏是否进行中 private AtomicBoolean gameRunning = new AtomicBoolean(); // 游戏进行的天数 private int countOfDays; // 所有犯人 private Prisoner[] prisoners = new Prisoner[COUNT_OF_PRISONERS]; // 放过风的犯人 private Set<Prisoner> outedPrisonersSet = new HashSet<Prisoner>(); /** * 是否所有犯人都已放过风? * * @return */ private boolean isAllOuted() { return outedPrisonersSet.size() == COUNT_OF_PRISONERS; } /** * 某个犯人报告国王他完成了任务 * * @param prisoner * 来报告的犯人 */ public void accomplishTask(Prisoner prisoner) { gameRunning.set(false); System.out.println("犯:我亲爱的国王陛下,您的犯人编号" + prisoner.getUuid() + "可以肯定的告诉您,我的兄弟们全都到院子放过风了!"); System.out.println("王:Oh, 真的吗?等我看一下记录先。。。"); System.out.println("国王查看记录中。。。"); System.out.println("5秒钟后。。。"); if (isAllOuted()) { System.out.println("王:哇靠!真的呢!你不会是蒙的吧?"); System.out.println("犯:My dear king! 吾已是戴罪之身,又岂敢再欺君犯上?且听我慢慢道来。。。"); System.out.println("省略500字。。。"); System.out .println("王:人才!你TM真是个人才!虽然用了" + countOfDays + "天,不过还是达到要求了!I服了You!\n " + "(国王转头对旁边一公公道)小李子,免了他们的罪,每人发一张车票,让他们回家过年吧!\n " + "还有,把这个编号" + prisoner.getUuid() + "的留下,咱们那个软件部不是缺个HR经理吗?\n 就让他去,让他出逻辑题,考死那帮来面试的孙子!\n 哈哈哈。。。就这么办,朕先洗洗睡了。。。"); return; } System.out.println("王:居然敢戏弄寡人,全部拉出去砍了!!!"); System.out.println("犯:大王铙命啊!程序有Bug总是难免的嘛,让我再调试一下啊!"); } /** * 开始游戏 */ public void startGame() { gameRunning.set(true); new Thread(new Runnable() { public void run() { Light light = new Light(); Yard yard = new Yard(); yard.setLight(light); for (int i = 0; i < COUNT_OF_PRISONERS; i++) { Prisoner prisoner = new Prisoner(i, yard, King.this); prisoners[i] = prisoner; } System.out.println("启禀陛下,要参加游戏的犯人已全部就位!"); Random random = new Random(); int randNum = random.nextInt(COUNT_OF_PRISONERS); prisoners[randNum].setAsCounter(); System.out.println("犯人们经过商量,得出计谋,并随机选到编号" + randNum + "的犯人作为计数员。。。"); System.out.println("游戏开始!"); // 没人报道游戏结束时,每天随机选出一个犯人到院子放风 while (gameRunning.get()) { int randIndex = random.nextInt(COUNT_OF_PRISONERS); // System.out.println("今天选到" + randIndex); prisoners[randIndex].outForExercise(); outedPrisonersSet.add(prisoners[randIndex]); countOfDays++; // 休息一天 // TimeUnit.DAYS.sleep(1); } } }).start(); } public static void main(String[] args) { new King().startGame(); } } package com.javaeye.hkliya.prisongame; /** * 路灯 * @author Administrator * */ public class Light { // 灯的状态,一开始是关着的 private boolean state = false; /** * 开灯 */ public void turnOn() { state = true; } /** * 关灯 */ public void turnOff() { state = false; } /** * 灯是否开着? * @return true 表示灯开着 * false 表示灯关着 */ public boolean isOn() { return state; } } package com.javaeye.hkliya.prisongame; /** * 犯人 * @author Administrator * */ public class Prisoner { // 犯人编号 private int uuid; // 是否计数员? true表示此犯人是计数员,false表示此犯人不是计数员 private boolean isCounter; // 关灯次数 private int turnOffTimes; // 此犯人放过风没? private boolean isFirstTime = true; private Yard yard; private King king; public Prisoner(int uuid, Yard yard, King king) { this.uuid = uuid; this.yard = yard; this.king = king; } /** * 指定此犯人为计数人 */ public void setAsCounter() { isCounter = true; } /** * 取得犯人的编号 * @return 该犯人编号 */ public int getUuid() { return uuid; } /** * 放风 */ public void outForExercise() { Light light = yard.getLight(); // 计数员 if (isCounter) { if (light.isOn()) { light.turnOff(); turnOffTimes++; if (turnOffTimes == King.COUNT_OF_PRISONERS-1) { king.accomplishTask(this); } } return; } // 普通犯人 if (isFirstTime && !light.isOn()) { light.turnOn(); isFirstTime = false; } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + uuid; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Prisoner other = (Prisoner) obj; if (uuid != other.uuid) return false; return true; } } package com.javaeye.hkliya.prisongame; /** * 供犯人放风的院子 * * @author Administrator * */ public class Yard { // 院子里有一盏路灯 private Light light; public Light getLight() { return light; } public void setLight(Light light) { this.light = light; } } 如果灯本来就开着的,计数员关99次灯够吗? 为了简单,我是假设灯初始是关着的 这个原帖有讨论 |
|
返回顶楼 | |
发表时间:2010-01-17
hkliya 写道 wannago 写道 hkliya 写道 题目要求请看原帖http://www.iteye.com/topic/569275
此题的解题思路是:从100个犯人中指定一个作为计数员。当每天随机挑一个犯人放风时,如果是普通犯人,如果他是第一次放风并且灯是关着的,就把灯打开,如果是计数员,他看见灯开着,他就给关掉,并记录总共关了多少次灯,当关到99次时,说明所有人都放过风了。 下面是我自己感觉写的还行的代码,请大牛们帮我挑挑毛病 我的意思是这几个类的设计是否合理,哪个对象里应该持有哪个对象的引用这些方面 或者从扩展性,维护性来说有哪些不足,谢谢大家 =================================== 已更新第二版代码,加入log4j和继承 package com.javaeye.hkliya.prisongame; import java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; /** * 变态的国王 * * @author Administrator * */ public class King { // 参与此变态游戏的犯人数 public static final int COUNT_OF_PRISONERS = 100; // 游戏是否进行中 private AtomicBoolean gameRunning = new AtomicBoolean(); // 游戏进行的天数 private int countOfDays; // 所有犯人 private Prisoner[] prisoners = new Prisoner[COUNT_OF_PRISONERS]; // 放过风的犯人 private Set<Prisoner> outedPrisonersSet = new HashSet<Prisoner>(); /** * 是否所有犯人都已放过风? * * @return */ private boolean isAllOuted() { return outedPrisonersSet.size() == COUNT_OF_PRISONERS; } /** * 某个犯人报告国王他完成了任务 * * @param prisoner * 来报告的犯人 */ public void accomplishTask(Prisoner prisoner) { gameRunning.set(false); System.out.println("犯:我亲爱的国王陛下,您的犯人编号" + prisoner.getUuid() + "可以肯定的告诉您,我的兄弟们全都到院子放过风了!"); System.out.println("王:Oh, 真的吗?等我看一下记录先。。。"); System.out.println("国王查看记录中。。。"); System.out.println("5秒钟后。。。"); if (isAllOuted()) { System.out.println("王:哇靠!真的呢!你不会是蒙的吧?"); System.out.println("犯:My dear king! 吾已是戴罪之身,又岂敢再欺君犯上?且听我慢慢道来。。。"); System.out.println("省略500字。。。"); System.out .println("王:人才!你TM真是个人才!虽然用了" + countOfDays + "天,不过还是达到要求了!I服了You!\n " + "(国王转头对旁边一公公道)小李子,免了他们的罪,每人发一张车票,让他们回家过年吧!\n " + "还有,把这个编号" + prisoner.getUuid() + "的留下,咱们那个软件部不是缺个HR经理吗?\n 就让他去,让他出逻辑题,考死那帮来面试的孙子!\n 哈哈哈。。。就这么办,朕先洗洗睡了。。。"); return; } System.out.println("王:居然敢戏弄寡人,全部拉出去砍了!!!"); System.out.println("犯:大王铙命啊!程序有Bug总是难免的嘛,让我再调试一下啊!"); } /** * 开始游戏 */ public void startGame() { gameRunning.set(true); new Thread(new Runnable() { public void run() { Light light = new Light(); Yard yard = new Yard(); yard.setLight(light); for (int i = 0; i < COUNT_OF_PRISONERS; i++) { Prisoner prisoner = new Prisoner(i, yard, King.this); prisoners[i] = prisoner; } System.out.println("启禀陛下,要参加游戏的犯人已全部就位!"); Random random = new Random(); int randNum = random.nextInt(COUNT_OF_PRISONERS); prisoners[randNum].setAsCounter(); System.out.println("犯人们经过商量,得出计谋,并随机选到编号" + randNum + "的犯人作为计数员。。。"); System.out.println("游戏开始!"); // 没人报道游戏结束时,每天随机选出一个犯人到院子放风 while (gameRunning.get()) { int randIndex = random.nextInt(COUNT_OF_PRISONERS); // System.out.println("今天选到" + randIndex); prisoners[randIndex].outForExercise(); outedPrisonersSet.add(prisoners[randIndex]); countOfDays++; // 休息一天 // TimeUnit.DAYS.sleep(1); } } }).start(); } public static void main(String[] args) { new King().startGame(); } } package com.javaeye.hkliya.prisongame; /** * 路灯 * @author Administrator * */ public class Light { // 灯的状态,一开始是关着的 private boolean state = false; /** * 开灯 */ public void turnOn() { state = true; } /** * 关灯 */ public void turnOff() { state = false; } /** * 灯是否开着? * @return true 表示灯开着 * false 表示灯关着 */ public boolean isOn() { return state; } } package com.javaeye.hkliya.prisongame; /** * 犯人 * @author Administrator * */ public class Prisoner { // 犯人编号 private int uuid; // 是否计数员? true表示此犯人是计数员,false表示此犯人不是计数员 private boolean isCounter; // 关灯次数 private int turnOffTimes; // 此犯人放过风没? private boolean isFirstTime = true; private Yard yard; private King king; public Prisoner(int uuid, Yard yard, King king) { this.uuid = uuid; this.yard = yard; this.king = king; } /** * 指定此犯人为计数人 */ public void setAsCounter() { isCounter = true; } /** * 取得犯人的编号 * @return 该犯人编号 */ public int getUuid() { return uuid; } /** * 放风 */ public void outForExercise() { Light light = yard.getLight(); // 计数员 if (isCounter) { if (light.isOn()) { light.turnOff(); turnOffTimes++; if (turnOffTimes == King.COUNT_OF_PRISONERS-1) { king.accomplishTask(this); } } return; } // 普通犯人 if (isFirstTime && !light.isOn()) { light.turnOn(); isFirstTime = false; } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + uuid; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Prisoner other = (Prisoner) obj; if (uuid != other.uuid) return false; return true; } } package com.javaeye.hkliya.prisongame; /** * 供犯人放风的院子 * * @author Administrator * */ public class Yard { // 院子里有一盏路灯 private Light light; public Light getLight() { return light; } public void setLight(Light light) { this.light = light; } } 如果灯本来就开着的,计数员关99次灯够吗? 为了简单,我是假设灯初始是关着的 这个原帖有讨论 哦。最好在发帖的时候写上这个假设,可以省大家点时间,因为原帖也没说这个条件,可能后来讨论有说(不过数十页的讨论...)。 |
|
返回顶楼 | |
发表时间:2010-01-17
说句实在话,这个帖子是13最多的帖子!
|
|
返回顶楼 | |
发表时间:2010-01-17
coreymylife 写道 说句实在话,这个帖子是13最多的帖子!
是啊,你不回帖的话还少一个 |
|
返回顶楼 | |
发表时间:2010-01-17
从程序本身只能看到你的编程经验,是看不出工作年限的,当然你可以通过规范来显示,但是这个是要看习惯,而不是一段
show的代码。 但从楼主的口气我可以做如下猜测: 如果楼主没有毕业,而且是计算机系的,只有两个结果 1、大二 2、大四 如果楼主已经参与工作,而且是到一个算是正规的软件企业的话,那么楼主工作了2年以上3年以下。 第一年:被大牛所折服,不敢造次,知道山外有山。 第二年:潜心修练 第三年:会做些比较关键的代码,大牛比较信任,会将代码交给你写,开始有点飘。 如果大于三年,又是一个境界。 5年另外一个境界 8年则是一个峰会的情景,我想楼主不会,起码还有执着。 如果是一个作坊的话,或者去一个从别的行业进军软件的话,或者是一个非IT公司的话,那楼主工作年限在1年以下。 |
|
返回顶楼 | |
发表时间:2010-01-18
群魔乱舞....
|
|
返回顶楼 | |
发表时间:2010-01-18
faye.feelcool 写道 从程序本身只能看到你的编程经验,是看不出工作年限的,当然你可以通过规范来显示,但是这个是要看习惯,而不是一段
show的代码。 但从楼主的口气我可以做如下猜测: 如果楼主没有毕业,而且是计算机系的,只有两个结果 1、大二 2、大四 如果楼主已经参与工作,而且是到一个算是正规的软件企业的话,那么楼主工作了2年以上3年以下。 第一年:被大牛所折服,不敢造次,知道山外有山。 第二年:潜心修练 第三年:会做些比较关键的代码,大牛比较信任,会将代码交给你写,开始有点飘。 如果大于三年,又是一个境界。 5年另外一个境界 8年则是一个峰会的情景,我想楼主不会,起码还有执着。 如果是一个作坊的话,或者去一个从别的行业进军软件的话,或者是一个非IT公司的话,那楼主工作年限在1年以下。 我能肯定的是LZ 写过的JAVA代码(纯java代码)没有超过2W行. |
|
返回顶楼 | |