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