------- android培训、java培训、期待与您交流! ----------
一、交通灯系统要求
1、异步随机生成按照各个路线行驶的车辆。例如:由南向而来去往北向的车辆 ---- 直行车辆;由西向而来去往南向的车辆 ---- 右转车辆;由东向而来去往南向的车辆 ---- 左转车辆……
2、信号灯忽略黄灯,只考虑红灯和绿灯。
3、应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
4、具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
5、每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
6、随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
7、不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
二、分析与代码
在看张老师如何思考之前,我自己也先分析了一下题目:每一个十字路口都有12个方向的汽车可以通行,直行后通过方法可以把交通灯改变颜色让下一个左转的灯变绿,然后循环操作。但是对于右转的怎么处理和怎么创建对象和以及对象有哪些方法却是理不清头绪。整体有一种不知如何下手的感觉。
下面是我通过看视频而对交通灯这道题目的学习总结以及代码:
1、首先要想交通路口的现实中中的例子,想一想他是怎么运作的,想一想需要有什么对象和方法,先理清这些思路开始写代码,以下就思路和代码写在一起了。
2、写线路对象。通过交通路口的实例知道一共有12条线路,也就是说要有12个交通灯来控制这12条线路。交通灯先放一下,先把12条线路的对象以及它应该有的方法解决。每条线路上的车的增加以及移动都应该在这条线路的方法之中,因此线路这个对象要有随机增加新的车辆,并把车辆增加到集合中去,这个车辆不必创建为对象,用一个字符串就可以表示。线路上还应有一个检查本线路上的交通灯是否为绿,并且为绿色是将集合中的第一辆车移除的方法。这些方法都应该定义在线路的构造方法之中。代码如下:
public class Road {
private List<String> list = new ArrayList<String>();
private String name = null;
public Road (String name) {
this.name=name;
ExecutorServicepool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable() {
public void run() {
for (int i = 0; i <1000 ; i++) {
try {
Thread.sleep((newRandom().nextInt(10)+1)*1000);
}catch (InterruptedException e) {
e.printStackTrace();
}
list.add(Road.this.name+"-"+i);
}
}
});
ScheduledExecutorServicetimer =Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable() {
public void run() {
if(list.size()>0){
boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
if(lighted){
System.out.println(list.remove(0)+"is travelling");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
3、下面开始写交通灯的对象。由于这12个灯中的每个灯都是唯一的,同一个对象,因此用枚举会很方便。每一个灯都会有一个状态:亮(绿)或者不亮(红),每个灯要有变亮和变黑的方法,并且为了后面代码方便,把变黑的方法返回值下一个亮的灯。灯还应对外提供一个某时是否为亮的方法;除了右拐弯方向的其他8条路线的灯,它们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组中各取出一个灯,对这4个灯依次轮询变亮,与这4个灯方向对应的灯则随之一同变化,因此Lamp类中要有一个变量来记住自己相反方向的灯,在一个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 String opposite;
private String next;
private boolean lighted;
private Lamp(String oppsite,String next, boolean ligeted) {
this.opposite = oppsite;
this.next = next;
this.lighted = ligeted;
}
public boolean isLighted(){
return lighted;
}
public void light(){
this.lighted=true;
if(opposite!=null)
Lamp.valueOf(opposite).light();
}
public Lamp blackOut(){
this.lighted = false;
if(opposite!=null){
Lamp.valueOf(opposite).blackOut();
}
LampnextLamp = null;
if(next !=null){
nextLamp= Lamp.valueOf(next);
nextLamp.light();
}
return nextLamp;
}
}
4、写一个控制交通灯的类。该类需要控制第一个绿的灯,并且要设置一个定时器,每隔10秒将当前灯变红并且让下一个灯变绿。
public class LampController {
private Lamp currentLamp;
public LampController(){
currentLamp = Lamp.S2N;
currentLamp.light();
ScheduledExecutorServicetimer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable() {
public void run() {
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
5、以上把该程序基本做完了,只需一个主函数启动这个程序了。主函数需要建立12条路的对象并且只要创建LampController对象就可以了。代码如下
public class MainClass {
public static void 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();
}
}