黑马程序员_7k面试题之交通灯管理系统

本文介绍了一个使用Java实现的十字路口交通灯管理系统。该系统通过控制红绿灯的切换来模拟真实世界的交通情况,并通过线程控制实现了不同方向车辆的随机生成及通行逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- ASP.Net+Android+IOS开发、href="http://edu.youkuaiyun.com"target="blank">.Net培训、期待与您交流! ----------------------

1、项目需求

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
 
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

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

2、以图形表示


3、从面向对象的角度分析

1)交通灯:因为只考虑红绿灯,因此只需控制直行的灯和左转的灯即可,而对侧的路口显示的是相同的灯,因此主要只需控制相邻两个方向上直行和左转共四个交通灯的变化即可,右转灯为常绿。其内部所具备的功能是亮灯的状态、灯变绿、灯变红

2)路口:控制着车辆的存在与消失,12个方向均可又车等候或行驶。

3)车辆:因为每一个路口等候的车都是有顺序的,在灯变绿后,排在前面的车先移除,因此用ArrayList集合存储车辆。

4、程序代码:

1)交通灯:

package ceshi.traffic;
//定义交通灯的枚举类
public enum Lamp {
	//12个方向,与每个灯相关的属性是对面的灯、下一个灯、当前灯状态
	S2N("N2S","S2W",false),S2W("N2E","W2E",false),W2E("E2W","W2N",false),W2N("E2S","S2N",false),
	N2S(null,null,false),N2E(null,null,false),E2W(null,null,false),E2S(null,null,false),
	S2E(null,null,true),W2S(null,null,true),N2W(null,null,true),E2N(null,null,true);
	
	private String opposite;
	private String next;
	private boolean flag;
	//初始化时,可传入一个方向的交通灯状况
	private Lamp(String opposite,String next,boolean flag){
		this.opposite=opposite;
		this.next=next;
		this.flag=flag;
	}
	//定义功能,判断当前灯状态
	public boolean isLighted(){
		return flag;
	}
	//定义功能,开启当前灯、对面灯
	public void light(){
		this.flag = true;
		if(opposite!=null){
			Lamp.valueOf(opposite).light();
		}
		System.out.println(name()+"is green");
	}
	//定义功能,关闭当前灯、对面灯,开启下一个灯
	public Lamp blackOut(){
		flag = false;
		if(opposite!=null){
			Lamp.valueOf(opposite).blackOut();
		}
		Lamp nextLamp = null;
		if(next!=null){
			nextLamp = Lamp.valueOf(next);
			System.out.println("绿灯从"+name()+"切换到"+next);
			nextLamp.light();
		}
		return nextLamp;
	}
}
2)交通灯控制器:

package ceshi.traffic;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
//交通灯控制器
public class LampController {
	public Lamp currentLamp ;
	//初始化灯为S2N
	public LampController(){
		currentLamp = Lamp.S2N;
		currentLamp.light();
		//定义线程池,该线程池的主要功能是控制每隔10秒变化一次灯
		//该线程池,它可安排在给定延迟后运行命令或者定期地执行。
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){
					public void run (){
						currentLamp = currentLamp.blackOut();
					}
				},
				10,//初始延迟10秒
				10,//周期,每隔10秒变化一次
				TimeUnit.SECONDS
				);
		
		
	}
}

3)十字路口,控制车辆:

package ceshi.traffic;

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

//控制路上的车辆
//12个方向上均可有等候的车辆,定义容器存储车辆,并根据交通灯的状态按先后顺序移除
public class Road {
	//定义车辆的集合,存储某个方向上的某辆车
	private List<String> vehicles = new ArrayList<String>();
	private String name = null;
	//随机生成车辆,存入集合
	public Road(String name){
		this.name = name;
		ExecutorService pool = Executors.newSingleThreadExecutor();
		pool.execute(new Runnable(){
			public void run(){
				for(int i=1;i<1000;i++){
					try {
						//随机1-10秒内产生一辆车
						Thread.sleep((new Random().nextInt(10)+1)*1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					vehicles.add(Road.this.name+"_"+i);
					System.out.println(Road.this.name+"_"+i+"::is waiting");
				}
				
			}
		});
		//定义线程池,判断当前灯的状态,如果为绿灯,该方向上的车依次移除
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){
					public void run(){
						if(vehicles.size()>0){
							boolean light = Lamp.valueOf(Road.this.name).isLighted();
							if(light){
								System.out.println(vehicles.remove(0)+"::is moving");
							}
						}
					}
				}, 
				1,
				1, 
				TimeUnit.SECONDS);
		
	}

}

4)主函数:

package ceshi.traffic;

public class Main {

	public static void main(String[] args) {
		//定义12个方向的数组
		String[] names = {"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
		for(int i=0;i<names.length;i++){
			new Road(names[i]);
		}
		new LampController();
	}
}


---------------------- ASP.Net+Android+IOS开发、 href="http://edu.youkuaiyun.com"target="blank">.Net培训、期待与您交流! ----------------------详细请查看: http://edu.youkuaiyun.com
十字路口交通灯信号控制器设计要求: 1)东西通道和南北通道交替通行,东西通道每次放行时间大于南北通道每次放行时间。 2)绿灯亮表示可以通行,红灯亮表示禁止通行。 3)每次绿灯变红灯时,绿灯先闪转变黄灯(此时另一干道上的红灯不变)。 4)十字路口要有数字显示,作为时间提示,以便人们更直观地把握时间。具体要求东西通道、南北通道通行时间及黄灯亮的时间均以秒为单位作减计数。 硬件电路设计说明: 十字路口交通灯信号控制器设计是以89S51为控芯片 ,利用P1口控制74LS240(八反相缓冲器,线驱动器)驱动发光二极管模拟交通灯。倒计时显示部分采用串口实现。串口工作在方式0时通过外接移位寄存器74LLS164实现串并转换。需要显示的数据经RXD端输出,经过74LS164串并转换输出到共阳极的LED数码管显示,利用T0定时器进行1S定时。 要材料: 印制电路板 1块 晶振6M 1块 普通电阻 3个(由于数码管显示太暗 我才用了360欧姆的) 单片机89S51 1块 按钮3个 ( 我采用了外部中断0 ,1) 电容 3个 (无极性) 发光二极管 6个 (红黄绿各两个) 7805 稳5V的一个 桥堆一个 1000uf和10uf 有极性 插头一个 数码管共阳两个 变压器一个 74LS164两个 74LS240一个 底座一个 附件内容包括: 整个电路设计,包括原理图和PCB、原理图和PCB封装库文件,用AD软件打开; 源程序(用汇编语言编写); 十字路口交通灯信号控制器论文分析;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值