黑马程序员_交通灯管理系统

 

题目:交通灯管理系统

需求:

1)异步随机生成各个路线上的车辆.

例如:

(1)由南向北行驶的车辆 ----直行车辆

(2) 由西向南行驶的车辆 ----右转车辆

(3)由东向南行驶的车辆 ----左转车辆

2)信号灯颜色选择范围

忽略黄灯,只考虑红灯和绿灯

3)左转车辆和右转车辆的要求

(1) 左转车辆受到控制信号灯的控制

(2) 但是右转车辆不受信号灯控制

【注意】具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

4) 其他说明

(1)南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

(2) 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

(3) 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

(4)不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

 

 十字路口简化图及注释

1)简化图

2) 注释

(1) 图中字母数字含义

N--北    S--南   W--西  E--东  2--to              S2N--由南向北

(2)图中共12条路线,按其运行方式可分四种

直行(4条): S2N   N2S   W2E   E2W

左拐(4条): S2W  W2N  N2E  E2S

右拐(4条): S2E  E2N  N2W  W2S

(3)路线简化

直线和左拐的必须遵守交通规则可看成4对,设计时只用考虑其中四条

右拐的可视为常绿.

(4)车辆通行按照先直行,后左转

S2N---S2W---E2W---E2S--循环

 

面向对象初步分析及各个模块

1)对题目分析得出所需类

交通灯(Lamp)

路(Road)

车(Car),本系统中不考虑车的运行状况,可以将车作为路上的数据,没有必要作为类

交通灯控制器(LampController)

 

主函数

public class MainClass {  
      public static void main(String[] args) {    
             
          //给出所有的方向   
            String[]directions =new String[]{  
                        "S2N", "S2W", "E2W", "E2S",  
                        "N2S", "N2E", "W2E", "W2N",  
                        "N2W", "W2S", "S2E", "E2N"  
            }; 
          //实例化Road的过程    
            for(int i=0; i< directions.length; i++){  
                  new Road(directions[i]);  
            } 
	 //实例化交通灯控制器实例     
            new LampController();
      }  
}


 

路(Road)部分

package cn.itcast.traffic;     
import java.util.ArrayList;  
import java.util.List;  
import java.util.Random;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import java.util.concurrent.ScheduledExecutorService;  
import java.util.concurrent.TimeUnit;  
   

public class Road {    
     private List<String> vehichles =new ArrayList<String>();    //使用List接口 ---面相接口编程   
      private String name;    //实际通过这个name获取这条线路一对一的Lamp类对象   
      public Road(String name){  
            this.name =name;  
             
            //启动另一个线程来创建该条路上的车辆,模拟车辆不断随机上路的过程,使用线程池,通过产生单个线程的方法,创建一个线程池   
              ExecutorService pool =Executors.newSingleThreadExecutor();  
            pool.execute(new Runnable(){  
               //通过for循环来模拟车辆的增加随机时间间隔生成一辆车  间隔不固定     
                  public void run() {   
                        for(int i=0; i< 1000; i++){  
                              try {  
                                    //按照一个随机的时间间隔生成车辆    
                                          Thread.sleep((new Random().nextInt(10)+ 1)*1000;); 
                                    vehichles.add(Road.this.name+"_"+ i);  
                                  }
			   catch (InterruptedException e) {    
                                    e.printStackTrace();  
                              }  
                        }  
                  }  
            });  
             
            //启动另一个线程 来减少当前这条路上的车 以模拟这辆车通过了这条路   
              ScheduledExecutorService timer =Executors.newScheduledThreadPool(1);  
            timer.scheduleAtFixedRate(  
                        new Runnable(){  
                              public void run() {     
                                    if(vehichles.size() >0){  
                                    //查看当前路段对应的交通灯是不是已经亮了 亮了的话 让该条路上的车辆通过   
                                          boolean lighted = Lamp.valueOf(Road.this.name).isLighted();  
                                          if(lighted){  
                                                System.out.println(vehichles.remove(0)+" is traversing!");  
                                          }  
                                    }  
                              }  
                        },  
                        1,  
                        1,  
                        TimeUnit.SECONDS);  
      }  
}  


 


交通灯(Lamp)部分

package cn.itcast.traffic;   
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),  
      //四条右拐的路 常绿  
      N2W(null, null, true), W2S(null, null, true), S2E(null, null, true), E2N(null, null, true);   
     private boolean lighted =false; //当前灯的状态               
      private String opposite =null;//当前线路交通灯的对应线路的交通灯 
      private String next =null; //当前线路交通灯的被切换到下一个交通灯   
      private Lamp(String opposite, String next, boolean lighted){  
            this.opposite =opposite;  
            this.next =next;  
      }  
      public boolean isLighted() {  
            return lighted;  
      }  
      public void light(){  
            this.lighted =true;  
            //同时要点亮对应路段的交通灯   
            if(this.opposite !=null){  
                  LampoppositeLamp =Lamp.valueOf(opposite);  
                  oppositeLamp.light();  
            }  
            System.out.println(name()+" lamp is green, 下面可以看到6个方向看到汽车穿过!");  
      } 
      public Lamp blackOut(){  
            //当前灯变红,对应方向的灯也变红   
            this.lighted =false;  
            //同时要灭掉对应路段的灯   
            if(this.opposite !=null){  
                  LampoppositeLamp =Lamp.valueOf(opposite);  
                  oppositeLamp.blackOut();  
            }  
            //点亮下一对应的灯   
            LampnextLamp =null;  
          if(next !=null){  
                  nextLamp=Lamp.valueOf(next);  
                  nextLamp.light();  
                  System.out.println("绿灯从"+ name()+"--->切换为"+next);  
           }  
           return nextLamp;  
      }  
}

 

交通灯控制(LampController)部分 

 

package cn.itcast.traffic;  
import java.util.concurrent.Executors;  
import java.util.concurrent.ScheduledExecutorService;  
import java.util.concurrent.TimeUnit;   

public class LampController {  
     private Lamp currentLamp;   
     private LampController(){  
          //指定第一盏亮的交通灯   
            currentLamp =Lamp.S2N;  
          currentLamp.light();  
          //设置定时器   
            ScheduledExecutorServicetimer =Executors.newScheduledThreadPool(1);  
          timer.scheduleAtFixedRate(  
                        new Runnable(){  
                              public void run() {  
                                    //每隔10s切换下一盏亮的交通灯   
                                          currentLamp =currentLamp.blackOut();  
                              }  
                        },  
                        10,  
                        10,  
                        TimeUnit.SECONDS);  
      }  
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值