交通灯管理系统
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
-
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆----直行车辆
由西向而来去往南向的车辆 ----右转车辆
由东向而来去往南向的车辆 ----左转车辆
。。
-
信号灯忽略黄灯,只考虑红灯和绿灯。
-
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
-
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
-
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
-
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
-
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
分析:
-
-
模似,十字路口
1.有4条主路,南到北,北到南,西到东,东到西,
主路分别产生,3个不同方向的车,向前,向左,向右的车,总共有12个方向 -
当一条路上灯为绿灯时,此路上向前,和向左,向右的都可以行驶
当一条路上灯为红灯时,此路上只能让,向右的车可以行驶 -
灯为两组,南向北,北向南的灯为一组,
西到东,东到西的为一组,
一组灯为红灯,另一组则为绿灯。由LampController.java类控红,和绿 -
-
-
Road类:
package cn.com;
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> 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<100;i++){
try {
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int rand=new Random().nextInt(3);
String vechicle=null;
switch (rand) {
case 0:
vechicle=Road.this.name + ",第" + i+"辆车,方向向前";
break;
case 1:
vechicle=Road.this.name + ",第" + i+"辆车,方向向左";
break;
case 2:
vechicle="无阻——"+Road.this.name + ",第" + i+"辆车,方向向右";
break;
}
vechicles.add(vechicle);
System.out.println(vechicle+"的车,要过十字路口");
}
}
});
//定时器每隔1秒,可以让车行驶,向左的,和向前的车,当绿灯是可通过,向右的车,不管红绿都能行
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
if(vechicles.size()>0){
String str=Road.this.name.replaceAll("到","");
str=str.replace('北', 'N');
str=str.replace('东', 'E');
str=str.replace('西', 'W');
str=str.replace('南', 'S');
boolean lighted = Lamp.valueOf(str).isLighted();
String v=vechicles.get(0);
if(v.substring(v.length()-1).equals("右")){//右转的车,红绿都行
System.out.println("\t\t\t\t\t"+vechicles.remove(0) + "行驶走了 !");
}
else if(lighted){
System.out.println("\t\t\t\t\t"+vechicles.remove(0) + "行驶走了 !");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
Lamp类:交通灯类
package cn.com;
public enum Lamp {
/*
* 北到南,南到北为一组灯,同时红,同时绿
* 东到西,和西到东为一组灯,同时红,同时绿
*/
//N北 S南 W西 E东
NS("SN","WE"),SN("NS","EW"),
EW("WE","SN"),WE("EW","NS");
public String toString(){
switch (this) {
case SN:
return "南到北";
case EW:
return "东到西" ;
case NS:
return "北到南" ;
case WE:
return "西到东";
}
return null;
}
private boolean lighted;//灯是红还是绿,以此为标
private String opposite;
private String nextRight;
public boolean isLighted() {
return lighted;
}
private Lamp(String opposite,String nextRigth) {
this.opposite = opposite;
this.nextRight=nextRigth;
}
public void light() {
this.lighted = true;
Lamp.valueOf(this.nextRight).lighted=false;
Lamp oppositeLamp=Lamp.valueOf(opposite);
oppositeLamp.lighted=true;
Lamp.valueOf(oppositeLamp.nextRight).lighted=false;
System.out.println("\t\t"+Lamp.valueOf(this.nextRight)+"开启红灯--"+Lamp.valueOf(oppositeLamp.nextRight)+"开启红灯\n"+"\t\t"+this+"开绿灯"+"----"+oppositeLamp+"开绿灯");
}
public void blackOut(){//一组灯红,对应一组灯变绿
this.lighted = false;
Lamp.valueOf(this.nextRight).lighted=true;
Lamp oppositeLamp=Lamp.valueOf(opposite);
oppositeLamp.lighted=false;
Lamp.valueOf(oppositeLamp.nextRight).lighted=true;
System.out.println("\t\t"+this+"开启红灯"+"--"+oppositeLamp+"开红灯"+"\n\t\t"+Lamp.valueOf(this.nextRight)+"开启绿灯----"+Lamp.valueOf(oppositeLamp.nextRight)+"开启绿灯\n");
}
}
LampController类:作为灯的控制器
package cn.com;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampController {
private Lamp currentLamp;
public LampController(){
currentLamp = Lamp.SN;//第一个灯,南到北,就绿
currentLamp.light();
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
if(currentLamp.isLighted())
currentLamp.blackOut();
else
currentLamp.light();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
MainRun类:运行测试类
package cn.com;
public class MainRun {
public static void main(String[] args) {
String [] directions = new String[]{"南到北","北到南","西到东","东到西"};
for(int i=0;i<directions.length;i++){
new Road(directions[i]);
}
new LampController();
}
}
在面象对象时,
让灯作为一个对象,当一个灯变红变绿时,其3个灯也变(相反的灯,颜色一样,左右的灯,颜色相反),这样所有灯,我们只要把一个灯做为对象,就控好了所有灯了。
,路做为一个对象,而车是由路产生的,一条路产3个方向的车,当然这有4条大路,
3个方向的车,向前,向左的是要看绿灯才能过,而向右的,没有要求。
效果图: