黑马程序员---交通灯管理系统项目总结

------- android培训java培训、期待与您交流! ----------

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

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

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

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

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

          …………….

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

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

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

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

  每辆车通过路口时间为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();
					}

					// TODO Auto-generated method stub
				}
			}

		});
		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) + "正在通过十字路口!");
						/*
						 * remove( 0 ) : 移除此列表中指定位置上的索引为0的元素 , 同时向左移动所有后续元素 (
						 * 将其索引减 1 ) 即移动第0个元素后 , 原第一个元素的索引就变成了0 。
						 */
					}
					// TODO Auto-generated method stub

				}
			}

		}, 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) {
		/* 产生12个方向的路线 */
		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();
	}

	// TODO Auto-generated method stub

}



-------  android培训 java培训 、期待与您交流! ----------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值