黑马程序员技术交流社区
标题:
我写的7K交通灯模拟程序
[打印本页]
作者:
fantacyleo
时间:
2014-8-12 13:50
标题:
我写的7K交通灯模拟程序
在张老师讲解的基础上做了一些改动,供大家参考,欢迎批评指正:
1. 为车辆单独写一个类:Vehicle。
张老师的视频中,车辆只是一个字符串,因此没有专门建一个类。我考虑到车辆编号、行驶方向应该是车辆本身的属性,且为今后做其他扩展方便,故将车辆封装为对象。
2. 简化交通灯类:TrafficLamp
张老师的视频中,为每个方向都设置了一盏灯。我觉得可以简化,尤其是右转灯仅仅为统一程序逻辑而设计出来,每个路口都放一盏没有必要。从南往北路线的灯变绿(红)时,从北往南路线的灯也是绿(红)的,故可以合并为一盏。同理,从南往西和从北往东的两盏左转灯也可以合并为一盏。最终只需要5盏灯:南北直行灯、南北左转灯、东西直行灯、东西左转灯、右转灯。枚举定义如下:
public enum TrafficLamp {
// 南北直行灯、南北左转灯、东西直行灯、东西左转灯、右转灯
SNSTRAIGHT(false, "SNLEFT"), SNLEFT(false, "EWSTRAIGHT"),
EWSTRAIGHT(false, "EWLEFT"), EWLEFT(false, "SNSTRAIGHT"),
RIGHT(true, null);
private volatile boolean passable; // 当前灯是否可通行
private String next; // 下一盏灯. 由于初始化顺序,无法直接获取未初始化的TrafficLamp对象,因而暂时用string
private TrafficLamp(boolean passable, String next) {
this.passable = passable;
this.next = next;
}
public boolean isPassable() {
return passable;
}
/**
* 切换为绿灯
*/
public void setPassable() {
this.passable = true;
System.out.println(this + " turn green");
}
/**
* 切换为红灯,同时下一盏灯切换为绿灯
*/
public TrafficLamp setImpassable() {
if (this == TrafficLamp.RIGHT) // 右转灯永不切换
return this;
this.passable = false;
System.out.println(this + " turn red");
TrafficLamp nextLamp = TrafficLamp.valueOf(this.next);
nextLamp.setPassable();
return nextLamp;
}
}
复制代码
3. 通行线路仍为12条,但作为程序执行入口的TrafficSimulation类的main方法中,只创建启动东西南北4个路口线程,每个路口的直行、左转、右转通行线程由路口类Road负责创建和启动。Road类负责路口车辆生成和车辆通行任务。为每一个车辆通行方向设置一个车辆队列,数据结构为BlockingQueue
/** 直行车队列 */
private BlockingQueue<Vehicle> straightVehicles = new LinkedBlockingQueue<Vehicle>();
/** 左行车队列 */
private BlockingQueue<Vehicle> leftVehicles = new LinkedBlockingQueue<Vehicle>();
/** 右行车队列 */
private BlockingQueue<Vehicle> rightVehicles = new LinkedBlockingQueue<Vehicle>();
复制代码
由于每个路口有三个通行方向,因此生成车辆时要随机产生行驶方向,这可以用随机数来完成。生成0、1、2三个随机数,分别代表左转、右转、直行三个方向。
// 随机生成车辆行驶方向,并放入相应车辆队列
int direction = rand.nextInt(3);
switch (direction) {
case 0:
leftVehicles.put(new Vehicle(Direction.valueOf("LEFT")));
break;
case 1:
rightVehicles.put(new Vehicle(Direction.valueOf("RIGHT")));
break;
case 2:
straightVehicles.put(new Vehicle(Direction.valueOf("STRAIGHT")));
break;
}
复制代码
全部代码在附件中,可直接在eclipse中导入工程。
P.S. 我的eclipse的文件编码是UTF-8 如果中文注释出现乱码,可参考此信息
7k_交通灯.zip
(14.97 KB, 下载次数: 577)
2014-8-12 13:50 上传
点击文件名下载附件
作者:
乐此不疲
时间:
2014-8-12 14:23
学习了 阻塞队列比list感觉真实
作者:
Bule丶
时间:
2014-8-12 14:32
学习了,研究下
作者:
Franklin
时间:
2014-8-12 14:58
楼主很厉害
作者:
Jero
时间:
2014-8-12 15:58
很厉害的样子
作者:
alexchy
时间:
2014-8-12 16:14
确实啊,当时我看这个视频的时候也在想,这个车可以封装下。
作者:
dreamseekerkun
时间:
2014-8-12 17:30
楼主大牛,给力。
作者:
李章敏
时间:
2014-8-12 17:32
看着很厉害
作者:
jackhai9
时间:
2014-8-12 18:30
谢谢分享。
作者:
何磊
时间:
2014-8-12 19:27
赞一个!!!
作者:
王凯路路
时间:
2014-8-12 19:42
正好到这了, 学习了.
作者:
sunny~
时间:
2014-8-12 19:56
有自己的思想 不错,赞一个
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2