论坛首页 Java企业应用论坛

国王和100个犯人-

浏览 25937 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-01-16  
代码不规范就是不规范,不规范成了习惯也不能期望一下子就规范,C++很好,可是要是你要那个java去写C++似的代码那我觉得你还是继续C++,而且就算是C++这也不像啊,C++也讲代码规范。OO是否,跟你用C++或Java没什么关心,只是你的肯定不OO.

public static boolean light

这样的东西,有Class不能就说是OO吧
0 请登录后投票
   发表时间:2010-01-16  
这是 Class Oriented ……
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。
1 请登录后投票
   发表时间:2010-01-16  
night_stalker 写道
这是 Class Oriented ……
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。

同意,感觉这么做意思不太大。根据需求来设计比较好。没必要吧简单的问题搞那么复杂
0 请登录后投票
   发表时间: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;
    }
}
0 请登录后投票
   发表时间: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。而且,我认为编程是件很自由的事,如果一定要遵循某种规范的话,那让机器写代码好了。为什么语言的设计者都会留很多并不规范的余地呢,不就是让程序员更自由吗?
0 请登录后投票
   发表时间:2010-01-16  
night_stalker 写道
这是 Class Oriented ……
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。

无聊了不得找点乐子吗
其实你现在逛论坛看贴回贴不也是在将简单的问题复杂化?
0 请登录后投票
   发表时间:2010-01-16   最后修改:2010-01-16
...重新算了下
(100) + 99/99 + 100 + 99/98 + 100 + ... =
512.560374 + 9900 = 10412.56374/10512.56374
28.527571890410958904109589041096/28.801544493150684931506849315068年 我实在无法想象的是第一个操作灯的普通囚犯
28年除了第一天按下了开关之后的28年怎么过的 代码来说我支持这位的...
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;
    }
}

 

 

0 请登录后投票
   发表时间:2010-01-16  

*********************************************************************
                           不 要 过 度 设 计!
*********************************************************************
1 请登录后投票
   发表时间: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。
0 请登录后投票
   发表时间:2010-01-17  
要是我写就不会对那么多东西建模,没有必要
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics