交通灯管理系统
---------------------- android培训、 java培训、期待与您交流! ----------------------
模拟完成十字路口的交通灯管理系统逻辑思想。
需求分析与设计
一步随机生成按照各个路线形式的车辆
车辆经过十字路口的时候,无非就是直行,左转弯,有转弯。
所以:
从南往北的车辆------直行
从西往南的车辆-----右转弯
从东往南的车辆------左转弯
信号灯忽略黄灯,只考虑红灯和绿灯。
在此也不考虑人行过马路,只考虑车辆的行驶。
在这里只考虑左转弯的车辆控制信号灯,对右转弯的车辆不受信号灯的控制。
具体信号灯控制逻辑与现实生活中管理交通灯控制逻辑相同,不好驴特殊情况下的控制逻
辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过LOG方式展现程序运行结果。
设计:
因为在每条路线上都会有可能出现多辆车,在路线上要随机增加新的车辆,在灯绿时还要额每秒减少一辆车。
首先要设计一个表示路线的类,每个对象代表一条路线,在十字路口,有12条路线车辆可以通过,所以要产生12个路线的实例对象。
每条路线是行随机增加新的车辆,加到一个集合中保存起来。
每台哦路线每隔一秒都会坚持开展本路线的灯手否为绿,一个灯由绿变红时,应该将下一个方向的灯变为绿。
设计一个表示交通灯的类,每个交通灯都维护一个状态,亮(绿),或不亮(红),每个交通灯要有变亮和变黑的方法,而且能返回自己的亮黑状态。
总共有12条路线,所以,系统中总共要产生12个交通灯,右拐弯的路线本来就不受等的控制,但是为了让程序又用统一的处理方式,加上出游四个右拐弯的灯,只是这些灯为一只亮状态,也就是不会变黑。
车辆右拐弯方向的其他8条路线的灯,它们是两两成对的,,所以归为4组,在编程处理时,只要从这4组中个取出一个灯,对这4个灯依次变亮,与这4个灯方向对应的灯则随之变化,因此交通灯类中药在一个变亮来记住自己相反方向的灯,在一个交通类对象的变亮和变黑方法中国,将对应方向的灯也变亮和变黑,每个灯变黑是,都伴随的下一个灯的变黑,灯类中产生一个变黑又调用下一个灯
编码:
Road类。
package csdn.heima.study.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;
/*
*
* 声明一个表示路线的类
*在类中定义一个私有集合和一个成员变量
*定义一个接收一个参数的构造方法
*把这个接收到的参数赋给这个成员变量
*创建线程池来生成在休息随机1到10秒后在某路线上增加车辆
*创建定时器,在保证灯变绿时,过一秒后每隔1秒从路线上移除一辆车
*/
public class Road {
private List<String> vechicles=new ArrayList<String>();
private String name=null;
public Road(String name){
this.name=name;
//创建线程池的实例对象
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);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
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 traversing !");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
Lamp类
packagecsdn.heima.study..traffic;
/*
* 声明一个枚举
* 定义车辆所要行使的12个方向的实例对象
* 定义一个无参构造方法和给每个对象定义构造方法,接收三个参数
* 定义三个私有成员变量
* 在定义用来判断是否是亮的方法和分别得变亮、变黑的方法
*/
publicenum Lamp {
//定义12个实例对象的构造方法
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2S","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,String next,boolean lighted){
this.opposite=opposite;
this.lighted=lighted;
this.next=next;
}
private Lamp(){}
privatebooleanlighted;
private String opposite;
private String next;
publicboolean isLighted(){
returnlighted;
}
publicvoid 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);
//让下一个灯变绿
nextLamp.light();
}
return nextLamp;
}
}
LampController类
package csdn.heima.study..traffic;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/*
* 定义一个交通灯的控制器类
* 定义一个灯的成员变量表示当前的灯
* 定义构造方法,把当前的灯设置为南到北并把它变绿
* 创建一个定时器的实例对象来调用固定频率方法5秒后每隔5秒让当前灯变为红灯
*/
public class LampController {
private Lamp currentLamp;
public LampController(){
currentLamp=Lamp.S2N;
currentLamp.light();
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable(){
public void run(){
//让当前的灯变成红灯
currentLamp=currentLamp.blackOut();
}
},
5,
5,
TimeUnit.SECONDS);
}
}
MainClass类
packagecsdn.heima.study..traffic;
/*
* 定义一个执行交通管理的类,并能独立运行
* 在mian方法内定义一个接收表示车辆行驶的12个方向参数
* 使用循环不断创建路线对象
* 最后创建交通控制器类直接运行
*/
publicclass MainClass {
/**
*@paramargs
*/
publicstaticvoid main(String[] args) {
String[] directions=new String[]{
"S2N" ,"S2W" ,"E2W"," E2S" ,"N2S", "N2E", "W2E", "W2N", "S2E" ,"E2N" ,"N2W" ,"W2S"
};
for(int i=0;i<directions.length;i++){
new Road(directions[i]);
}
new LampController();
}
}
测试:
测试结果:
S2N lamp is green, 下面总共应该有6个方向能看到汽车穿过
S2N_1 is traversing !
N2S_1 is traversing !
S2E_1 is traversing !
E2N_1 is traversing !
W2S_1 is traversing !
N2W_1 is traversing !
S2N_2 is traversing !
N2S_2 is traversing !
S2E_2 is traversing !
N2W_2 is traversing !
E2N_2 is traversing !
W2S_2 is traversing !
S2N_3 is traversing !
N2S_3 is traversing !
S2E_3 is traversing !
N2W_3 is traversing !
E2N_3 is traversing !
W2S_3 is traversing !
S2N_4 is traversing !
N2S_4 is traversing !
S2E_4 is traversing !
W2S_4 is traversing !
E2N_4 is traversing !
N2W_4 is traversing !
S2N_5 is traversing !
N2S_5 is traversing !
S2E_5 is traversing !
E2N_5 is traversing !
N2W_5 is traversing !
W2S_5 is traversing !
绿灯从S2N------->切换为S2W
S2W lamp is green, 下面总共应该有6个方向能看到汽车穿过
S2W_1 is traversing !
N2E_1 is traversing !
S2E_6 is traversing !
N2W_6 is traversing !
E2N_6 is traversing !
W2S_6 is traversing !
S2W_2 is traversing !
E2N_7 is traversing !
N2E_2 is traversing !
S2E_7 is traversing !
W2S_7 is traversing !
N2W_7 is traversing !
S2W_3 is traversing !
N2E_3 is traversing !
N2W_8 is traversing !
W2S_8 is traversing !
S2E_8 is traversing !
E2N_8 is traversing !
S2W_4 is traversing !
N2E_4 is traversing !
N2W_9 is traversing !
S2E_9 is traversing !
E2N_9 is traversing !
W2S_9 is traversing !
S2W_5 is traversing !
N2E_5 is traversing !
N2W_10 is traversing !
绿灯从S2W------->切换为E2W
E2W lamp is green, 下面总共应该有6个方向能看到汽车穿过
E2N_10 is traversing !
S2E_10 is traversing !
W2S_10 is traversing !
E2W_1 is traversing !
E2N_11 is traversing !
W2E_1 is traversing !
W2S_11 is traversing !
N2W_11 is traversing !
S2E_11 is traversing !
E2W_2 is traversing !
W2E_2 is traversing !
S2E_12 is traversing !
E2N_12 is traversing !
N2W_12 is traversing !
W2S_12 is traversing !
E2W_3 is traversing !
S2E_13 is traversing !
W2E_3 is traversing !
E2N_13 is traversing !
N2W_13 is traversing !
W2S_13 is traversing !
E2W_4 is traversing !
W2E_4 is traversing !
S2E_14 is traversing !
N2W_14 is traversing !
W2S_14 is traversing !
E2N_14 is traversing !
E2W_5 is traversing !
E2N_15 is traversing !
N2W_15 is traversing !
绿灯从E2W------->切换为E2S
E2S lamp is green, 下面总共应该有6个方向能看到汽车穿过
S2E_15 is traversing !
W2S_15 is traversing !
N2W_16 is traversing !
S2E_16 is traversing !
W2S_16 is traversing !
E2N_16 is traversing !
N2W_17 is traversing !
E2N_17 is traversing !
S2E_17 is traversing !
W2S_17 is traversing !
S2E_18 is traversing !
E2N_18 is traversing !
W2S_18 is traversing !
N2W_18 is traversing !
S2E_19 is traversing !
E2N_19 is traversing !
N2W_19 is traversing !
W2S_19 is traversing !
N2W_20 is traversing !
S2E_20 is traversing !
E2N_20 is traversing !
W2S_20 is traversing !
绿灯从E2S------->切换为S2N
S2N lamp is green, 下面总共应该有6个方向能看到汽车穿过
S2N_6 is traversing !
N2S_6 is traversing !
S2E_21 is traversing !
N2W_21 is traversing !
E2N_21 is traversing !
S2N_7 is traversing !
N2S_7 is traversing !
S2E_22 is traversing !
E2N_22 is traversing !
N2W_22 is traversing !
S2N_8 is traversing !
N2S_8 is traversing !
S2E_23 is traversing !
N2W_23 is traversing !
E2N_23 is traversing !
S2N_9 is traversing !
S2E_24 is traversing !
N2S_9 is traversing !
N2W_24 is traversing !
E2N_24 is traversing !
S2N_10 is traversing !
绿灯从S2N------->切换为S2W
N2W_25 is traversing !
S2E_25 is traversing !
E2N_25 is traversing !
S2W lamp is green, 下面总共应该有6个方向能看到汽车穿过
S2W_6 is traversing !
N2E_6 is traversing !
E2N_26 is traversing !
S2E_26 is traversing !
N2W_26 is traversing !
S2W_7 is traversing !
N2E_7 is traversing !
N2W_27 is traversing !
E2N_27 is traversing !
S2E_27 is traversing !
S2W_8 is traversing !
N2E_8 is traversing !
E2N_28 is traversing !
S2E_28 is traversing !
N2W_28 is traversing !
S2W_9 is traversing !
N2W_29 is traversing !
N2E_9 is traversing !
E2N_29 is traversing !
S2E_29 is traversing !
S2W_10 is traversing !
N2E_10 is traversing !
N2W_30 is traversing !
绿灯从S2W------->切换为E2W
E2W lamp is green, 下面总共应该有6个方向能看到汽车穿过
S2E_30 is traversing !
E2N_30 is traversing !
E2W_6 is traversing !
N2W_31 is traversing !
W2E_5 is traversing !
S2E_31 is traversing !
E2N_31 is traversing !
E2W_7 is traversing !
W2E_6 is traversing !
S2E_32 is traversing !
E2N_32 is traversing !
N2W_32 is traversing !
E2W_8 is traversing !
W2E_7 is traversing !
S2E_33 is traversing !
E2N_33 is traversing !
N2W_33 is traversing !
E2W_9 is traversing !
S2E_34 is traversing !
W2E_8 is traversing !
E2N_34 is traversing !
N2W_34 is traversing !
E2W_10 is traversing !
W2E_9 is traversing !
S2E_35 is traversing !
绿灯从E2W------->切换为E2S
E2S lamp is green, 下面总共应该有6个方向能看到汽车穿过
N2W_35 is traversing !
E2N_35 is traversing !
W2S_21 is traversing !
E2N_36 is traversing !
S2E_36 is traversing !
N2W_36 is traversing !
W2S_22 is traversing !
E2N_37 is traversing !
W2S_23 is traversing !
S2E_37 is traversing !
N2W_37 is traversing !
W2S_24 is traversing !
S2E_38 is traversing !
E2N_38 is traversing !
N2W_38 is traversing !
维护:
OK!
---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima