黑马程序员技术交流社区
标题:
交通灯系统,呵呵……和张老师那个很不一样的代码哦
[打印本页]
作者:
柏占肖
时间:
2012-10-8 10:05
标题:
交通灯系统,呵呵……和张老师那个很不一样的代码哦
本帖最后由 柏占肖 于 2012-10-9 11:49 编辑
package com.isoftstone.interview.traffic;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class MainClass {
public static void main(String[] args) {
new Controller();
}
}
class Controller {
/*
* 一个十字路口就是两条路相交,所以这里创建两条路 一条东西干道,一条南北干道 初始状态为东西干道的绿灯亮,南北干道的红灯亮
*/
private Road roadEW = new Road(true, "东西干道");
private Road roadSN = new Road(false, "南北干道");
public Controller() {
System.out.println("东西干道 绿灯亮,南北干道红灯亮");// 打印初始状态
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
roadEW.changeLight();
roadSN.changeLight();
}
}
}).start();// 每隔30秒换次信号灯
}
}
class Road {
/* 每条道上的车的去向只有3个,即向左转,直行,向右转 */
private static final String[] goTo = { "left", "front", "right" };
/*
* 每条道上都有一个信号等,本来这里可以是静态的,但是为了体现面向对象的设计思想, 我就没有把它定义为静态的
*/
private boolean light;
/* 保存路的名字,这主要是为了方便测试,在打印时可以打印出是哪条路在通行 */
private String name;
/**
*
* @param light
* 道路上路灯的初始状态
* @param name
* 道路的名字
*/
public Road(boolean light, String name) {
this.light = light;
this.name = name;
/* 当道路一创建,道路上就开始行驶车辆了 */
this.removeThread(left, "左边");
this.removeThread(right, "右边");
this.addThread(left);
this.addThread(right);
}
public void changeLight() {
light = true == light ? false : true;// 路灯转换
if (light) {
System.out.println(this.name + "绿灯亮,");
} else {
System.out.println(this.name + "红灯亮,");
}
}
public void removeThread(final List<Car> list, final String listname) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (0 != list.size()) {// 如果道上的车辆数不为0
if (Road.this.light
| list.get(0).getGoTo().equals("right")) {
/* 道路上亮的是绿灯或者最前面的那辆车是向右转就旅行 */
System.out.println(Road.this.name + listname
+ "使过一辆向" + list.get(0).getGoTo()
+ "方向行驶的车");
list.remove(0);
}
}
}
}
}).start();
}
public void addThread(final List<Car> list) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/* 增加车辆 */
list.add(new Car(goTo[new Random().nextInt(3)]));
}
}
}).start();
}
/* 每条道路都是双向道,所以我们这里就用两个集合来存储这两个道上的车辆 */
private List<Car> left = new ArrayList<Car>();
private List<Car> right = new ArrayList<Car>();
}
class Car {
private String goTo;// 储存车辆的去向,左转,直行或者右转
public Car(String goTo) {
this.goTo = goTo;
}
/* 获取车辆的去向 */
public String getGoTo() {
return goTo;
}
}
复制代码
作者:
刘圣伟
时间:
2012-10-8 10:27
不错欧,不过现实中的问题有一些没解决,
1.一般右转的车轮都在右边车道的最右边。,而你写的只判断第一辆,
2.转弯和直行,在现实中一般都是先直行,在转弯,大城市,这个细节地方,必须不能一起执行。
但就程序方面,很好了,有自己的思路。很8错!
作者:
王中利
时间:
2012-10-8 10:30
很厉害!
作者:
柏占肖
时间:
2012-10-8 11:55
刘圣伟 发表于 2012-10-8 10:27
不错欧,不过现实中的问题有一些没解决,
1.一般右转的车轮都在右边车道的最右边。,而你写的只判断第一辆, ...
这个模拟是这样的,公路只有2个车道,且方向相反,这样就不存在有2辆车并排同向而行,如果说是4个车道的话,那么你说的这些情况就应该考虑了
作者:
柏占肖
时间:
2012-10-8 12:20
刘圣伟 发表于 2012-10-8 10:27
不错欧,不过现实中的问题有一些没解决,
1.一般右转的车轮都在右边车道的最右边。,而你写的只判断第一辆, ...
嗯 又看了下你的第2点问题,呵呵……这点居然还想落了,3Q,帮我找出了BUG
作者:
qmpy
时间:
2012-10-8 15:47
强悍啊!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2