`
hkliya
  • 浏览: 83892 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

国王和100个犯人-

阅读更多
ddddddd
分享到:
评论
97 楼 zcy860511 2010-02-04  
打酱油路过,看看
96 楼 fengshihao 2010-01-28  
night_stalker 写道
hanjiangit 写道
myreligion 写道
在我看来,程序内出现System.out.println一般都在1年以内,或者只相当于一年以内。呵呵~~


System.out.println 是没有经验的表现?  诚惶诚恐!


豆大的事情都用 log4j 才是学了点花拳绣腿就来卖弄的表现 ……


这个贴 确实 学院味太浓.... 数据抽象出来那么复杂么 好几个类 还有继承 虚函数 ,有的还搞个字典....


这么抽象是不是简单点  int[100]  一百个囚犯 ,0为计数人 , int[x] == 1 代表关过灯 x也就是出来过。 int[0] == 99的时候就完成了.  Random 出来一个0-99的整数 直接是就是索引啊。

一个函数搞定就行了,工作不是搞研究 需要扩展重构去 ,不要一次想那么久远 永远不知道未来需求是什么 ,迭代重构.....
95 楼 clyman 2010-01-26  
精通各种4j,哈哈....
94 楼 night_stalker 2010-01-21  
hanjiangit 写道
myreligion 写道
在我看来,程序内出现System.out.println一般都在1年以内,或者只相当于一年以内。呵呵~~


System.out.println 是没有经验的表现?  诚惶诚恐!


豆大的事情都用 log4j 才是学了点花拳绣腿就来卖弄的表现 ……
93 楼 yanghao0 2010-01-21  
--
解题思路:
选一个人当证明人,他只负责关灯
其他99个人,只能开灯,并只能开一次。
当证明人记录自己关了99次后,就可确认每个人都出了院子。
--

开始 2010-01-21 17:52:51
运行1次,囚犯共100人
最小的是:9111天
最大的是:9111天
结束 2010-01-21 17:53:44
--
代码附件
92 楼 soni 2010-01-18  
抱歉,不懂java,代码没看。
但我个人认为,发这种帖子的人基本上做开发不会超过一年。
91 楼 hkliya 2010-01-18  
其实这只是一个试验,我是搞网络营销的,在标题里写“你能看出我工作几年吗?”就是为了让大家回复这个帖子而已。
90 楼 hanjiangit 2010-01-18  
myreligion 写道
在我看来,程序内出现System.out.println一般都在1年以内,或者只相当于一年以内。呵呵~~


System.out.println 是没有经验的表现?  诚惶诚恐!
89 楼 mxswl 2010-01-18  
faye.feelcool 写道
从程序本身只能看到你的编程经验,是看不出工作年限的,当然你可以通过规范来显示,但是这个是要看习惯,而不是一段
show的代码。
但从楼主的口气我可以做如下猜测:
如果楼主没有毕业,而且是计算机系的,只有两个结果 1、大二 2、大四
如果楼主已经参与工作,而且是到一个算是正规的软件企业的话,那么楼主工作了2年以上3年以下。
第一年:被大牛所折服,不敢造次,知道山外有山。
第二年:潜心修练
第三年:会做些比较关键的代码,大牛比较信任,会将代码交给你写,开始有点飘。
如果大于三年,又是一个境界。
5年另外一个境界
8年则是一个峰会的情景,我想楼主不会,起码还有执着。

如果是一个作坊的话,或者去一个从别的行业进军软件的话,或者是一个非IT公司的话,那楼主工作年限在1年以下。


我能肯定的是LZ 写过的JAVA代码(纯java代码)没有超过2W行. 
88 楼 tracyhuyan 2010-01-18  
群魔乱舞....
87 楼 faye.feelcool 2010-01-17  
从程序本身只能看到你的编程经验,是看不出工作年限的,当然你可以通过规范来显示,但是这个是要看习惯,而不是一段
show的代码。
但从楼主的口气我可以做如下猜测:
如果楼主没有毕业,而且是计算机系的,只有两个结果 1、大二 2、大四
如果楼主已经参与工作,而且是到一个算是正规的软件企业的话,那么楼主工作了2年以上3年以下。
第一年:被大牛所折服,不敢造次,知道山外有山。
第二年:潜心修练
第三年:会做些比较关键的代码,大牛比较信任,会将代码交给你写,开始有点飘。
如果大于三年,又是一个境界。
5年另外一个境界
8年则是一个峰会的情景,我想楼主不会,起码还有执着。

如果是一个作坊的话,或者去一个从别的行业进军软件的话,或者是一个非IT公司的话,那楼主工作年限在1年以下。
86 楼 hkliya 2010-01-17  
coreymylife 写道
说句实在话,这个帖子是13最多的帖子!

是啊,你不回帖的话还少一个
85 楼 coreymylife 2010-01-17  
说句实在话,这个帖子是13最多的帖子!
84 楼 wannago 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次灯够吗?

为了简单,我是假设灯初始是关着的
这个原帖有讨论

哦。最好在发帖的时候写上这个假设,可以省大家点时间,因为原帖也没说这个条件,可能后来讨论有说(不过数十页的讨论...)。
83 楼 hkliya 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次灯够吗?

为了简单,我是假设灯初始是关着的
这个原帖有讨论
82 楼 hkliya 2010-01-17  
wushexu 写道
要是我写就不会对那么多东西建模,没有必要

要是我就不回这么无聊的帖子,没有必要
81 楼 wannago 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次灯够吗?
80 楼 hkliya 2010-01-17  
metaphy 写道

*********************************************************************
                           不 要 过 度 设 计!
*********************************************************************

太严肃了
79 楼 wushexu 2010-01-17  
要是我写就不会对那么多东西建模,没有必要
78 楼 wannago 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。

相关推荐

Global site tag (gtag.js) - Google Analytics