您的位置:首页 > 职场人生

黑马程序员——交通灯管理系统的实现

2014-10-12 22:17 357 查看
------- <a href="http://www.itheima.com" target="blank">android培训</a>

要求:

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:

异步随机生成按照各个路线行驶的车辆。

例如:

由南向而来去往北向的车辆 ---- 直行车辆

由西向而来去往南向的车辆 ---- 右转车辆

由东向而来去往南向的车辆 ---- 左转车辆

。。。

Ø 信号灯忽略黄灯,只考虑红灯和绿灯。

Ø 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

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

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

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

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

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

代码实现:

/*
* 定义一个枚举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 Boolean lighted;

//当前灯为false后的下一个为true的灯
private String next;

//注意枚举类的构造方法为私有的
private Lamp(String oppsite, String next, Boolean lighted){
this.opposite = oppsite;
this.next = next;
this.lighted = lighted;
}

//判断当前灯的状态
public boolean isLighted(){
return lighted;
}

//一个灯变TRUE时,他所对应的灯也为TRUE
public void light(){
this.lighted = true;

if(this.opposite != null){
Lamp.valueOf(this.opposite).light();
}
System.out.println(this.name() + " Lamp is green, 接下来将有六个方向的车辆行驶");
}

//一个灯变FALSE时,它对应的灯也为FALSE, 返回下一个灯为TRUE的灯
public Lamp lightOut(){
this.lighted = false;

if(this.opposite != null){
Lamp.valueOf(this.opposite).lightOut();
}

Lamp nextLamp = null;
if(this.next != null){
nextLamp = Lamp.valueOf(this.next);
System.out.println("绿灯从" + name() + "-------->切换为" + next);
nextLamp.light();
}
return nextLamp;
}
}
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/*
* 定义一个交通灯的控制器,让一个方向行驶10秒中以后转向另一个方向
* */

public class LampController {
//定义一个当前的灯
private Lamp currentLamp;

public LampController(Lamp currentLamp){
//让传进来的灯设置为true
this.currentLamp = currentLamp;
this.currentLamp.light();

//让当前方向的灯为true10秒后变false
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
@Override
public void run() {
LampController.this.currentLamp.lightOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}


/*
* 测试交通灯系统
* */

public class MainClass {

public static void main(String[] args) {
// TODO Auto-generated method stub
String[] dir = new String[]{
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
};

for(int i=0; i<dir.length; i++){
new Road(dir[i]);
}

new LampController(Lamp.valueOf("S2N"));
}

}


import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/*
* 由于交通路灯系统中有12个方向的行走路线,所以定义一个交通路线
* 类来模拟路线的车辆行走路线和方法
*
* */

public class Road {
//定义一个在路线上存放车子的集合
private List<String> list = 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 {
//随机睡眠1-10秒
Thread.sleep((new Random().nextInt(10)+ 1)*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//把车子加载的道路集合中
list.add(Road.this.name + " : " + i);
}
}

});

//每隔一秒判断是否为绿灯,如果是在放行车辆通过
ScheduledExecutorService timer = 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) + " 开走了 !");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}


<a href="http://www.itheima.com"
target="blank">java培训</a>、期待与您交流! ----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  黑马程序员