Java学习日记----交通灯管理系统

------- android培训java培训、期待与您交流! ----------

1 交通灯管理系统

  1.1需求  

    模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:  

    1>  异步随机生成按照各个路线行驶的车辆。一共有四个路口,每个路口都有自己的方向(直行,左转,右转)

    2> 只考虑红灯和绿灯,可以不考虑黄灯。  

    3> 右转的灯默认是开的(绿的)。  

    4> 信号灯的控制与生活中普通交通灯相同,东西方向,南北方向交替放行。  

    5>  设定每辆车通过路口时间为1秒(可用线程Sleep的方式模拟)。  

    6> 可以自行设定车辆产生的时间间隔和红绿灯之间的时间间隔。 

  1.2 思路  

    总共有12条路线,假设每条路线都有一个信号灯对其进行控制,右转的4条路线的控制灯可为常绿状态,其他的8条线路是两两对应(一个是绿的,另一个就是红的),分为4组,只需考虑4条路线(两个相邻路口的左转和直行)的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换.初步设想有红绿灯,红绿灯控制系统,路和车的对象。红绿灯控制系统控制四组灯的亮灭,路和灯绑定,每条路线上都不断的产生车辆,。在绿灯的时候,如果这辆汽车是该路线上第一辆则通过,否则等待它成为第一辆车时才能通过,通过之后,路线将这辆车删除。

    1> 设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。Road类中需要提供能够处理每条路线上随机增加新的车辆,增加到一个集合中保存。每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。  

    2>设计一个Lamp类来表示交通灯,每个交通灯都维护一个状态:绿或红,每个交通灯要有变亮和变黑的方法,亮黑状态是交替的。总共有12条路线,所以,系统中总共要产生12个交通灯。右拐弯的路线默认为绿,其他8条路线,分为4组(因为两两对应的),从这4组中各取出一个灯,对这4个灯依次变亮变黑,与这4个灯对应的灯随之一同变化,类中要有一个变量来记住自己相反方向的灯,某个变亮或暗,对应的灯也变黑和变亮。每个灯变黑时,下一个灯的变亮,类中还要有一个变量来记住自己的下一个灯。本类用枚举来做具有很大的方便性,只有代表12个方向的灯的实例对象。

  1.3 设计一个LampController类,它定时让当前的绿灯变红。  

  1.4.设计一个MainClass类,测试程序。

  1.5 代码:

  1>Road类

  public class Road {
     List<String> vechicles = new ArrayList<String>();
     private String name;
     public Road(String name) {
        this.name = name; //----这是将路和灯绑在起的
                        //----在1到10秒内产生一两个辆车子
      ExecutorService pool = Executors.newSingleThreadExecutor();
      pool.execute(new Runnable() {
         public void run() {
            for(int i=1;i<1000;i++){
               try {              //----从1到10随机产生一个数
                  Thread.sleep((new Random().nextInt(10)+1)*1000);
               } catch (InterruptedException e) {
                  e.printStackTrace();
               }
               vechicles.add(Road.this.name+"_"+i);
            }
         }
      });
  
      ScheduledExecutorService timer = Executors.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 traveling");//----通过之后将车辆从中上删除.
                   }
               }
            }
        },
        1,
        1,
        TimeUnit.SECONDS);
    }
}

 

    2> Lamp类

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(){
  
   }                //---对象枚举的初始化.
   private Lamp(String opposite,String next,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,下面应该有可以看有六个方向的车通过.");
   }
 
   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);
         nextLamp.light();(){//---如灯是黑的,则下一个灯是亮的
      }
      return nextLamp;
  
   }
}

    3>LampController类

public class LampCotroller {
   private Lamp currentLamp;
   public LampCotroller(){
      currentLamp = Lamp.S2W;  //---设置当前的灯产S2W,
      ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
      timer.scheduleAtFixedRate(
          new Runnable() {
             public void run() {
                currentLamp = currentLamp.blackOut();
             }
          },
          10,
          10,
          TimeUnit.SECONDS);
    }
 }

    4>MainCalss类

public class MainClass {

public static void main(String[] args) {   

  String[] derectios = {"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};

    for(int i=0;i<derectios.length;i++){  

      new Road(derectios[i]);   } //----创建十二条路线的对象

    new LampCotroller();  }  //---开启信号灯管理系统

}

    1.6 收获

       写代码之前的分析,流程模拟很重要,流程不懂的话,根本就无写代码.还有就是面向对象的思想还有待于加强,之前要本就没有想到将路和灯绑在一起.

    

 

 

 

 

posted @ 2012-12-08 02:04  叶征东  阅读(242)  评论(0编辑  收藏  举报