模拟实现十字路口的交通灯管理系统逻辑,具体要求如下:
异步随机生成按照各个路线行驶的车辆.
例如:由南向而来去往北向的车辆----直行车辆
由西向而来去往南向的车辆----右转车辆
由东向而来去往南向的车辆----左转车辆
…………….
信号灯忽略黄灯,只考虑红灯和绿灯.
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制.
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同.不考虑特殊情况下的控制逻辑.
注: 南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆后放行左转车辆.
每辆车通过路口时间为1秒(提示: 可通过线程Sleep 的方式模拟).
随机生成车辆时间间隔以及红绿灯交换时时间间隔自定,可以设置.
不要求实现Gull,只考虑系统逻辑实现,可通过log 方式展现程序运行结果.
交通灯系统的项目:
在项目开发中,其实是以不变应万变。例如,有人在黑板上画圆。就是以黑板这个不变的事物,来作为基准。然后在黑板上选取一个点的横坐标与纵坐标来画圆。而对于小球在绳子上移动问题来说,绳子就是不变的东西,而以绳子上的基准点来表示小球的移动。在用两块石头磨成刀,刀来砍树,树砍成木材,木材做成椅子。因此以刀加工厂来调用生成刀的方法。中间使用石头。而木材为石刀有砍树这个功能。椅子加工厂则能运用材料来制作椅子。
在交通灯这个项目中,不变的只有路。一个十字路口,每条路都向除自己之外的三条路行驶。因此,有十二条路可以走。每条路与其相反方向的灯应该一样。向右拐弯应该是永远绿灯的。而向左拐则应在直走之后。路灯只考虑红绿二色。
在路,灯,以及灯控制器三者来说,路上可以行使车辆,因此会产生一个生成车的方法。路灯则是显示走向。路灯控制器则是用来真正控制路面车辆行驶的。另外,有一个main()程序,用来调用路,灯,已经灯控制器三者的类以及方法。
对题目分析如右图:
由图可以看出:一个十字路口有12条行车线路.
分别是: S2N,S2W,S2E . E2W,E2S,E2N . N2S,N2E,N2W . W2E,W2N,W2S
每个方向的车辆有三种行驶路线: 左转,右转和直行.
因为右转不考虑交通灯是否为绿灯,可忽略考虑.
这样考虑的因素有八条路线: 每个路口的直行和左转.
对绿灯的分析:
每个路口的绿灯,先控制直行方向,直行的车辆通过后,为该路口
左转方向车辆通过.最后绿灯控制该路口垂直方向的车辆.
确定需要创建的对象:
12条路线也就对应12条线路对象,在每条路线上,车源源不断的不定时开来.如果当前路线的灯为绿灯,则车每秒开走一辆.
12条线路就对应12个灯对象,当一个路线的灯为绿灯时,它相反方向的灯也变绿灯(直行与直行,左转与左转),这种依次变绿的过程,是按一定顺序的,所以可以用一个枚举来定义,这12个灯,每个灯对应三个参数,它的相反方向的灯,它的下一个灯,以及它的红绿状态.
这12个灯,需要一个控制器,控制将灯变绿,隔多长时间再将它变红,右转的四个灯是常绿状态,不需要控制,剩余的八个灯,只需要控制四个灯: S2N,S2W,W2E,W2N即可,它的相反方向的灯的红绿状态在同一时间和它们的红绿状态一样.
最后需要创建一个调度类,创建控制器对象,让控制器开始控制交通灯的红绿交换,并启动上面的12条路对象,让上面的车根据控制器所控制的当前路线灯的红绿状态."走走停停".
代码实现:
- package test.traffic;
-
- import java.util.*;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.TimeUnit;
-
- public class Road {
- private String name = null;
- List<String> vehicle = new ArrayList<String>();
-
- public Road(String name) {
- this.name = name;
- ExecutorService pool = Executors.newFixedThreadPool(1);
- pool.execute(new Runnable() {
- int i = 1;
-
- @Override
- public void run() {
- while (i < 1000) {
- vehicle.add(Road.this.name + "路线上的第" + (i++) + "辆车");
- try {
- Thread.sleep((new Random().nextInt(10) + 1) * 1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
-
- }
- }
-
- });
- pool.isShutdown();
- ScheduledExecutorService timer = Executors
- .newSingleThreadScheduledExecutor();
- timer.scheduleAtFixedRate(new Runnable() {
-
- @Override
- public void run() {
-
- boolean blue = Lamp.valueOf(Road.this.name).blue;
- if (vehicle.size() != 0) {
- while (blue) {
- System.out.println(vehicle.remove(0) + "正在通过十字路口!");
-
-
-
-
- }
-
-
- }
- }
-
- }, 1, 2, TimeUnit.SECONDS);
-
- }
- }
Lamp (灯) 代码
- package test.traffic;
-
- enum Lamp {
- S2N("S2W", false, "N2S"), S2W("W2E", false, "N2E"), W2E("W2N", false, "E2W"), W2N(
- "S2N", false, "E2S"), N2S("null", false, "null"), N2E("null",
- false, "null"), E2W("null", false, "null"), E2S("null", false,
- "null"), S2E(null, true, null), E2N(null, true, null), N2W(null,
- true, null), W2S(null, true, null);
- public boolean blue = true;
- String next = null;
- String opposite = null;
-
- private Lamp(String next, boolean blue, String opposite) {
- this.blue = blue;
- this.next = next;
- this.opposite = opposite;
- };
-
- public boolean isLighted() {
- return blue;
- }
-
- public void blueLight() {
- blue = true;
- Lamp.valueOf(opposite).blue = true;
- System.out.println(this.name() + "灯和" + Lamp.valueOf(opposite).name()
- + "灯变绿了");
- }
-
- public Lamp redLight() {
- blue = false;
- Lamp.valueOf(opposite).blue = false;
- Lamp nextLamp = Lamp.valueOf(next);
- nextLamp.blueLight();
- return nextLamp;
-
- }
-
- }
LampController(灯控制器) 代码:
- package test.traffic;
-
- import java.util.concurrent.Executors;
- import java.util.concurrent.ScheduledExecutorService;
- import java.util.concurrent.TimeUnit;
-
- public class LampController {
- private Lamp currentLamp = Lamp.S2N;
-
- public LampController() {
- System.out.println("最多有6个方向的车可以通过");
- currentLamp.blueLight();
- ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
- timer.scheduleAtFixedRate(new Runnable() {
-
- @Override
- public void run() {
- currentLamp = currentLamp.redLight();
- }
-
- }, 10, 15, TimeUnit.SECONDS);
-
- }
- }
启动代码:
- package test.traffic;
-
- public class Scheduler {
-
- 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();
- }
-
-
-
- }
------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------