黑马程序员技术交流社区

标题: 关于交通灯的一些思考 [打印本页]

作者: BlackHorse    时间: 2011-7-19 17:58
标题: 关于交通灯的一些思考
老师视频里是这样定义枚举等的,上面4个一组有opposite和next下面一组没有
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
而在ControllerLamp里面currentLamp = Lamp.S2N;currentLamp.light();指定了currentLamp=SN2;
如果我想随机挑选一个非右转弯的灯做启动灯,而不是指定一个灯做启动灯就必须
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
N2S("S2N","N2E",false),N2E("S2W","W2E",false),W2E("E2W","W2N",false),W2N("E2S","N2S",false),
让这8个灯都有逻辑关系,而这样和下面代码
public void light(){
                this.lighted = true;
                if(opposite != null){
                        Lamp.valueOf(opposite).light();
                }
又会形成死循环。

我就基于这种想法有点思路,希望大家指正
//定义一个开关锁bSwitch,让启动灯这一组的bSwitch一直为true,而opposite一组的一直为false
public boolean bSwitch
public void light()
    {
            this.lighted=true;
            if(opposite!=null)
            {
                    if(bSwitch)
                    {
                    Lamp.valueOf(opposite).bSwitch=false;//启动灯被设定后,自己点亮,然后把opposite的开关锁掉        //不让opposite再打开自己,避免形成无限循环
                    Lamp.valueOf(opposite).light();
                    System.out.println(name()+" lamp is green.下面总共应该有6个方向能看到车");
                    }
         }
           
    }
    //等变红,同时相对方向上的等也变红,而且让next变绿
    public Lamp blackOut()
    {
            this.lighted=false;
            if(opposite!=null)
            {
                    if(bSwitch)//这里opposite的bSwitch已经是false了
                    {
                    //Lamp.valueOf(opposite).bSwitch=false;       
                    Lamp.valueOf(opposite).blackOut();
                    System.out.println("绿灯从"+this+"切换到"+next);
                    }
                    //this.bSwitch=true;
            }
           
            Lamp nextLamp=null;
            if(bSwitch){
            //由于opposite也有next,所以让开关锁锁住对方的next,不让他自己打开,而是这启动等这一组的作为opposite打开
            if(next!=null)
            {
                    nextLamp=Lamp.valueOf(next);
                   
                    nextLamp.light();
                   
            }
            }
            return nextLamp;
           
           
    }
[ 本帖最后由 BlackHorse 于 2011-07-19  18:02 编辑 ]
作者: 匿名    时间: 2011-7-21 04:25
或许因为你的 话题太长所以顶贴的人少了,你这个帖子我接了,待看完视频后回来详细分析讨论
作者: 王松朝    时间: 2011-7-21 08:24
用锁…
我觉得用if检查一下下个灯是不是亮的应该就可以了吧,我去试试,
作者: 匿名    时间: 2011-7-21 13:15
你改这么多干嘛
直接将light()方法改为:
public void light()
{
                this.lighted = true;
               while((opposite!=null)
                 opposite.lighted=true;
}
不就行了 ,剩下的都不用改
作者: 匿名    时间: 2011-7-21 13:49
笔误,改后:
public void light()
{
                this.lighted = true;
               if ((opposite!=null)
                 opposite.lighted=true;
}
作者: 匿名    时间: 2011-7-21 13:55
笔误,改后:
public void light()
{
                this.lighted = true;
               if (opposite!=null)
                 opposite.lighted=true;
}
作者: 匿名    时间: 2011-7-21 13:56
呵呵 ,见笑




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2