交通灯管理系统


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

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

例如:

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

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

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

       。。。

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

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

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

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

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

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

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

分析图

车辆类。

public class Car {

	String name;
	String start;
	String fangxiang;

	public String getStart() {
		return start;
	}

	public void setStart(String start) {
		this.start = start;
	}

	public String getFangxiang() {
		return fangxiang;
	}

	public void setFangxiang(String fangxiang) {
		this.fangxiang = fangxiang;
	}

	public String getName() {
		return this.start + "_TO_" + this.fangxiang;
	}

}

交通灯类。

public class Lamp {
	String[] names = { "NS_LINE", "NS_LEFT", "WE_LINE", "WE_LEFT" };
	String name;

	public String NextLamp(String name) {
		switch (name) {
		case "NS_LINE":
			return "NS_LEFT";
		case "NS_LEFT":
			return "WE_LINE";
		case "WE_LINE":
			return "WE_LEFT";
		case "WE_LEFT":
			return "NS_LINE";
		}
		return null;

	}
}

道路类。

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

public class The_road {

	String[] starts = { "E", "W", "S", "N" };
	String[] fangxiangs = { "LINE", "LEFT", "RIGHT" };

	Lamp lampManager = new Lamp();

	String lamp = "WE_LINE";

	List<Car> EW_LINE_listcar = new ArrayList<Car>();
	List<Car> EW_LEFT_listcar = new ArrayList<Car>();
	List<Car> SN_LINE_listcar = new ArrayList<Car>();
	List<Car> SN_LEFT_listcar = new ArrayList<Car>();
	List<Car> RIGHT_listcar = new ArrayList<Car>();

	// 东西公路。
	public void The_run_road() {
		ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
		pool.scheduleAtFixedRate(new Runnable() {

			@Override
			public void run() {
				if ("WE_LINE".equals(The_road.this.lamp)
						&& (EW_LINE_listcar.size() != 0)) {
					System.out.println(EW_LINE_listcar.get(0).getName()
							+ "____通过十字路口");
					EW_LINE_listcar.remove(0);
				}
				if ("WE_LEFT".equals(The_road.this.lamp)
						&& (EW_LEFT_listcar.size() != 0)) {
					System.out.println(EW_LEFT_listcar.get(0).getName()
							+ "____通过十字路口");
					EW_LEFT_listcar.remove(0);
				}

				if ("NS_LINE".equals(The_road.this.lamp)
						&& (SN_LINE_listcar.size() != 0)) {
					System.out.println(SN_LINE_listcar.get(0).getName()
							+ "____通过十字路口");
					SN_LINE_listcar.remove(0);
				}
				if ("NS_LEFT".equals(The_road.this.lamp)
						&& (SN_LEFT_listcar.size() != 0)) {
					System.out.println(SN_LEFT_listcar.get(0).getName()
							+ "____通过十字路口");
					SN_LEFT_listcar.remove(0);
				}
				if (RIGHT_listcar.size() != 0) {
					System.out.println(RIGHT_listcar.get(0).getName()
							+ "____通过十字路口");
					RIGHT_listcar.remove(0);
				}

				//

			}

		}, 1, 1, TimeUnit.SECONDS);
	}

	// 南北公路。
	public void The_lamp() {
		ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
		pool.scheduleAtFixedRate(new Runnable() {

			@Override
			public void run() {
				lamp = lampManager.NextLamp(lamp);
				if("NS_LINE".equals(lamp)){
					System.out.println("**************************************************************");
					System.out.println("南北直行           左转《红》     直行《绿》    辆可以右转        ");
					System.out.println("**************************************************************");
				}
				if("NS_LEFT".equals(lamp)){
					System.out.println("**************************************************************");
					System.out.println("南北左转           左转《绿》     直行《红》    辆可以右转        ");
					System.out.println("**************************************************************");}
				if("WE_LINE".equals(lamp)){
					System.out.println("**************************************************************");
					System.out.println("东西直行           左转《红》     直行《绿》    辆可以右转        ");
					System.out.println("**************************************************************");}
				if("WE_LEFT".equals(lamp)){
					System.out.println("**************************************************************");
					System.out.println("东西左转           左转《绿》     直行《红》    辆可以右转        ");
					System.out.println("**************************************************************");}
			}

		}, 0, 10, TimeUnit.SECONDS);

	}

	int num = 0;

	// 自动产生车辆
	public void On_the_road() {

		Executors.newSingleThreadExecutor().execute(new Runnable() {

			@Override
			public void run() {
				while (num < 50) {
					Car car = new Car();
					car.setStart(starts[new Random().nextInt(4)]);
					car.setFangxiang(fangxiangs[new Random().nextInt(3)]);

					// System.out.println(car.getName());;

					// 东西路段直走,左转车辆判断。
					if (("E".equals(car.getStart()) || "W".equals(car
							.getStart())) && "LINE".equals(car.getFangxiang())) {
						EW_LINE_listcar.add(car);
					}
					if (("E".equals(car.getStart()) || "W".equals(car
							.getStart())) && "LEFT".equals(car.getFangxiang())) {
						EW_LEFT_listcar.add(car);
					}

					// 南北路段直走,左转车辆判断。
					if (("S".equals(car.getStart()) || "N".equals(car
							.getStart())) && "LINE".equals(car.getFangxiang())) {
						SN_LINE_listcar.add(car);
					}
					if (("S".equals(car.getStart()) || "N".equals(car
							.getStart())) && "LEFT".equals(car.getFangxiang())) {
						SN_LEFT_listcar.add(car);
					}

					// 右转的车辆。
					if ("RIGHT".equals(car.getFangxiang())) {
						RIGHT_listcar.add(car);
					}

					// System.out.println("EW_LINE_listcar:"
					// + EW_LINE_listcar.toString());
					// System.out.println("EW_LEFT_listcar:"
					// + EW_LEFT_listcar.toString());
					// System.out.println("SN_LINE_listcar:"
					// + SN_LINE_listcar.toString());
					// System.out.println("SN_LEFT_listcar:"
					// + SN_LEFT_listcar.toString());
					// System.out.println("RIGHT_listcar:"
					// + RIGHT_listcar.toString());
					// System.out.println();
					// System.out.println();
					// System.out.println();

					num++;
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}

			}

		});
	}
}

运行主函数。

public class MainClass {

	public static void main(String[] args) {
		The_road road = new The_road();
		road.On_the_road();
		road.The_lamp();
		road.The_run_road();
	}

}

运行结果:







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值