JAVA高新技术-交通灯管理-----黑马程序员

来源:互联网 发布:linux c 定时器 编辑:程序博客网 时间:2024/05/22 00:11

ASP.Net+Android+IOS开发------期待与您交流

 

<交通灯管理总结>

交通灯管理总结:

交通灯管理系统
1.项目需求
 1)异步随机生成按照各个路线行驶的车辆。
 2)信号灯忽略黄灯,只考虑红灯和绿灯
 3)应考虑左转车辆控制信号灯,右转车辆不受信号灯控制
 4)具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
 注:南北向车辆与东西向车辆交替放行,同方向车辆应该先放行直行车辆而后放行左转车辆。
2.面向对象分析与设计
 有红绿灯的控制系统、汽车、路线。

设计示意图如下:

下面是代码和步骤

1)对象灯的设计 因为一共只有12个灯,所以应该用枚举。3.代码细节 1)Road类的编写 属性1:List<String> vechicles = new ArrayList<String>(); 属性2:String name = null; 构造函数:  1)Road(String name) 路的名字  2)产生车辆  ExecutorService pool = Executors.newSingleThreadExecutor();  pool.execute(new Runnable(){   public void run(){    for(int i=1;i<1000;i++) {     Thread.sleep((new Random().nextInt(10)+1)*1000);     vechicles.add(Road.this.name + ":" + i);    }   }  });  3)开始行使车辆,假设都是绿灯,后面再进行修改  ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);  timer.scheduleAtFixedRate(    new Runnable(){     public void run(){      //1.      if(vechicles.size()>0){       boolean lighted = true;//需要改写       boolean lighted = Lamp.valueOf(Road.this.name).isLighted();       if(lighted) {        System.out.println(vechicles.remove(0) + "is travesing !");       }      }     }    },    1,    1,    TimeUnit.SECONDS);  2)Lamp类的编写(Enum)  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(Lamp opposite,String next,boolean lighted) {    this.opposite = opposite;   }   private Stirng next;   private boolean lighted;//是否是绿灯   private String opposite;   public boolean isLighted(){       }   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).blackOut();    Lamp nextLamp = null;     if(next!=null) {     nextLamp = Lamp.valueOf(next);     System.out.println("绿灯从" + name() + "--->切换为" + next);     Lamp.valueOf(next).light();         }    return nextLamp;   }  }  3)LampController类 灯控制器  属性:Lamp currentLamp;  构造函数:   1.初始化灯状态   currentLamp = Lamp.S2N;     currentLamp.light();   2.运行灯系统   Executors.newScheduledThreadPool(1).scheduleAtFixedRate(    new Runnable(){     public void run(){      currentLamp.blackOut();     }    },    10,    10,    TimeUnit.SECONDS);  4)主函数  S2N,S2N,E2W,E2S,N2S,N2E,W2E,W2N,S2E,E2N,N2W,W2S  String [] directions = new String[]{S2N,S2N,E2W,E2S,N2S,N2E,W2E,W2N,S2E,E2N,N2W,W2S};  for(int i=0;i<directions.length;i++){   new Road(directions[i]);  }  new LampContoller();

系统总结如下

交通灯管理系统,需画图,才能更清晰明白整个过程。首先要知道,所以方向的车无论何时都是可以右转弯的。
 即右转弯不受交通灯约束。也就是一直是绿灯。然后就是
  (1)当S-N为绿灯时,此时多出两个方向可以行车,即N-S方向和S-N方向。加上之前所以方向右转弯的方向,一共
 就有6个方向可以行车。即:N-S,S-N,S-E,E-N,N-W,W-S方向为绿灯。
  (2)接着,S-N变为红灯,S-W为绿灯,即南边左转弯同行,此时,北边左转弯也通行,与四个右转弯通行。即:
 S-W,N-E,S-E,E-N,N-W,W-S方向为绿灯。
  (3)当S-W变为红灯时,W-E为绿灯,即东西方向可以通行,加上所有右转弯方向还是有6个方向可以行车。即:
 W-E,E-W,S-E,E-N,N-W,W-S方向为绿灯。
  (4)当W-E变为红灯时,W-N为绿灯,此时E-S也为绿灯。即东西方向的左转弯方向通行,加上所有右转弯方向,即:
 W-N,E-S,S-E,E-N,N-W,W-S方向为绿灯。
  此后,就一直在循环做上面这四个步骤。简单用语言描述:因为所有右转弯车辆都是可以通行的,所以这里不再叙述。
 先是,南北方向通行,接着是南北方向左转弯通行,然后是东西方向通行,最后是东西左转弯通行。只要清楚了这个过程。

自己总结:
a, 面向对象的思维去解决问题。

b, 编写Lamp类因为交通灯个数固定,即方向。一共12个。所以这里用到枚举。还有就是每个交通灯之间的关系。相反方向的交通灯状态是一样的,然后当前交通灯与下一个交通灯互斥,或者说是锁的关系。

c,然后就是用到了Executors工具类,用来创建一个线程,这个线程特点是每隔一段时间就调用一次。这里时间可以自己设定。


 

 

ASP.Net+Android+IOS开发------期待与您交流

 详细请查看:http://edu.csdn.net