黑马程序员------交通灯

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------

交通灯管理系统

1, 首先向张孝祥老师致敬

张孝祥老师语录:

                        i.             害羞是找不到工作的。

                      ii.             细节见真英雄

                     iii.             新技术是为解决问题而诞生的

                    iv.             人的精力是有限的,应该把精力留给自己最爱的事业上,或者最主要的事情上

                      v.             人的精力就那么一点,不能够留给别人

                    vi.             必须干好一件事哦,你毕竟没有无穷无尽的精力

                   vii.             大家在搞这些值的时候要小心一点,以后找错误付出的代价就是你现在仔细代价的十倍

                 viii.             谁在利益面前都会低头的,我深知这个道理

                    ix.             未来是美好的牛奶和面包都会有的

                      x.             现在在北京多高的工资人家都给的起,就看你敢不敢要,会不会要

                    xi.             环境影响一个人,你得相信这句话

                   xii.             好,就这样吧

2,           分析

总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。

 

车子只看自己的灯,而不看自己的方向

 

3,           面向对象的分析和设计

a)       对象:①红绿灯()和控制系统()

      ②路(Road)

      ③汽车àString

b)       灯的设计(12个用枚举)

 

public enum Lamp{

    /*每个枚举元素各表示一个方向的控制灯*/ 

    S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),

    N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),

    S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);

   

    private Lamp(String opposite,Stringnext,boolean lighted){

           this.opposite = opposite;

           this.next = next;

           this.lighted = lighted;

    }

    private boolean lighted;

    private String opposite;

    private String next;

   

    public boolean isLighted(){

           return lighted;

    }

    public void light(){

           this.lighted = true;

           if(opposite != null){

                  Lamp.valueOf(opposite).light();

           }

           System.out.println(name() + "lamp is green,下面总共应该有6个方向能看到汽车穿过!");

          

    }

    public Lamp blackOut(){

 

           this.lighted = false;

 

           if(opposite !=null&&Lamp.valueOf(opposite).isLighted()){

                  Lamp.valueOf(opposite).blackOut();

           }            

           Lamp nextLamp= null;

           if(next != null){

                  nextLamp = Lamp.valueOf(next);

                  System.out.println("绿灯从" + name() +"---->切换为" + next);                 

                  nextLamp.light();

           }

           return nextLamp;

    }

}

c)       java5的线程库—解决路的设计(Road)

原理:把任务交给线程池,线程池再从它的里面挑一个线程来执行

方法:

①newFixedThreadPool(int  nThreads) 创建一个线程池,并说明线程数量

②ExecutorService   newSingleThreadExecutor()

③ScheduledExecutorService  newScheduledThreadPool(int number)//定时器

 

例子:

//①此代码实现每1—1000秒产生一辆汽车

ExecutorService pool=Executor.newSingleThreadExecutor()

pool.execute(new Runnable(){

     public void run()

{

       Thread.sleep((newRandom().nextInt(10)+1)*1000);

       vechiles.add(Road.this.name+”_”+i);//访问外部类的成员变量

}

});

 

 

//②定时器例子   如果灯亮着那么就删除一辆车

ScheduledExecutorService timer= newScheduledThreadPool(1);

timer. scheduleAtFixedRate{

     new Runnable(){

            public void run()

{

    if(vechicles.size()>0){

    boolean lighted = Lamp.valueOf(Road.this.name).isLighted();

    if(lighted){                                             System.out.println(vechicles.remove(0) + " is traversing !"

    }

},

1000,//第一次

1000,//周期

TimeUnit.Second;//时间单位

}

d)      灯的控制器

public classLampController {

      private Lamp currentLamp;

      public LampController(){

               //刚开始让由南向北的灯变绿;                  

               currentLamp = Lamp.S2N;

               currentLamp.light();

               ScheduledExecutorServicetimer=

Executors.newScheduledThreadPool(1);                  

               timer.scheduleAtFixedRate(

                                  new Runnable(){

                                           public  void run(){

                                                     System.out.println("来啊");

                                                     currentLamp =currentLamp.blackOut();

                                  }

                                  },

                                  10,

                                  10,

                                  TimeUnit.SECONDS);

      }

}

e)       main函数

public static void main(String[] args) {

               

                /*产生12个方向的路线*/            

                String[] directions = new String[]{

                                  "S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"              

                };

                for(inti=0;i<directions.length;i++){

                         newRoad(directions[i]);

                }

               

                /*产生整个交通灯系统*/              

                newLampController();

      }

 


---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值