博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java学习日记----交通灯管理系统
阅读量:5099 次
发布时间:2019-06-13

本文共 4452 字,大约阅读时间需要 14 分钟。

------- 、、期待与您交流! ----------

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 收获

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

    

 

 

 

 

转载于:https://www.cnblogs.com/kftghai/archive/2012/12/08/2808249.html

你可能感兴趣的文章
Palindrome
查看>>
窗体中拖动panel,并且不会拖动至窗体外部程序实现方法。
查看>>
vb中从域名得到IP及从IP得到域名
查看>>
一步步跨过学习中一道道的坎
查看>>
RxJava入门优秀博客推荐
查看>>
基于Selenium2+Java的UI自动化(5) - 执行JavaScript脚本
查看>>
bc https://en.wikipedia.org/wiki/Gossip_protocol
查看>>
saltstack---自动化运维平台
查看>>
Java注释@interface的用法【转】
查看>>
妙味——操作元素属性的几种方法
查看>>
Ring 0 Inline Hook
查看>>
Linux man C++ 库函数
查看>>
PE结构对照表
查看>>
复杂性渐近阶的重要性
查看>>
Rectangle and Square(判断正方形、矩形)
查看>>
js数组创建两种方法
查看>>
IOS自得其乐系列(一)-------------------加载动态图片
查看>>
Function Spec
查看>>
关于我 Jake Lin
查看>>
hue简单介绍
查看>>