黑马程序员-交通灯

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

交通灯

需求

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

信号灯只考虑红灯和绿灯

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

每辆车通过路口的时间为1s

随机生成车辆时间间隔以及红绿灯交换时间间隔自定

面向对象的分析设计

每条路都会出现很多车,路线上随机增加新的车,在红绿灯期间每秒减少一辆车

设计一个road类表示路线,没个road对象代表一条路,一共有12,

每条路每隔一秒,都会检查控制路线的灯是否为绿,一个灯由绿变红,应该讲下个方向的灯变绿

设计lamp类表示一个交通灯,每隔灯维护一个状态

一个12个交通灯

先产生一个车的类

每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。
在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车(用一个“路线名_id”形式的字符串进行表示)。
在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车辆集合和将集合中的第一辆车移除掉。

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 {

	List<String> vechicles = new ArrayList<String>();
	private String name = null;
	public Road(String name){
		
		this.name = name;
		//设置线程
		ExecutorService pool =  Executors.newSingleThreadExecutor();
		pool.execute(new Runnable(){

			@Override
			public void run() {
				// TODO Auto-generated method stub
				//产生车
				for (int i = 0; i < 1000; i++) {
					try {
						Thread.sleep((new Random().nextInt(10)+1)*1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					vechicles.add(Road.this.name+"_"+i);
				}
			}});
		//定时器
		 ScheduledExecutorService timer =Executors.newScheduledThreadPool(1);
		 timer.scheduleAtFixedRate(
				 new Runnable(){

					@Override
					public void run() {
						// TODO Auto-generated method stub
						if(vechicles.size()>0){
							boolean lighted = true;
							if(lighted){
								vechicles.remove(0);
								
							}
						}
							
					}}, 
				 1, 
				 1, 
				 TimeUnit.SECONDS);
				
	}
}

利用枚举设置灯控制方向

public enum Lamp {
	/*每个枚举元素各表示一个方向的控制灯*/	
	S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
	/*下面元素表示与上面的元素的相反方向的灯,它们的“相反方向灯”和“下一个灯”应忽略不计!*/
	N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),
	/*由南向东和由西向北等右拐弯的灯不受红绿灯的控制,所以,可以假想它们总是绿灯*/
	S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);
	
	private Lamp(String opposite,String next,boolean lighted){
		this.opposite = opposite;
		this.next = next;
		this.lighted = lighted;
	}


	/*当前灯是否为绿*/	
	private boolean lighted;
	/*与当前灯同时为绿的对应方向*/	
	private String opposite;
	/*当前灯变红时下一个变绿的灯*/	
	private String next;
	public boolean isLighted(){
		return lighted;
	}
	
	/**
	 * 某个灯变绿时,它对应方向的灯也要变绿
	 */	
	public void light(){
		this.lighted = true;
		if(opposite != null){
			Lamp.valueOf(opposite).light();
		}
		System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");
		
	}
	
	/**
	 * 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿
	 * @return 下一个要变绿的灯
	 */	
	public Lamp blackOut(){
		this.lighted = 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;
	}
}


控制交通灯类,整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。
LampController构造方法中要设定第一个为绿的灯。
LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。

package com.isoftstone.interview.traffic;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class LampController {
	private Lamp currentLamp;
	
	public LampController(){
		//刚开始让由南向北的灯变绿;		
		currentLamp = Lamp.S2N;
		currentLamp.light();
		
		/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/		
		ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){
					public  void run(){
						System.out.println("来啊");
						currentLamp = currentLamp.blackOut();
				}
				},
				10,
				10,
				TimeUnit.SECONDS);
	}
}


 

入口类

public class MainClass {

	/**
	 * @param args
	 */
	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();
	}

}


 

 

 

 

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

### 回答1: 头哥数字逻辑---交通灯系统设计是一个用于控制道路交通的系统。这个系统利用数字逻辑设计,实现了交通信号灯的切换控制,从而提高交通效率和安全性。 首先,交通灯系统设计需要考虑不同道路的交通流量和车辆优先级。通过传感器收集道路上的车辆信息,系统可以根据实际情况自动调整信号灯的时长和切换时间。 其次,交通灯系统设计需要考虑不同时段的交通需求。系统可以预先设置不同时段的交通模式,比如高峰期、拥堵期和低峰期。通过预测交通状况和分析历史数据,系统可以自动切换到不同的模式,从而有效地分配交通资源。 此外,交通灯系统设计还需要具备故障检测和报警功能。如果交通灯出现故障或者异常情况,系统可以及时发出警报,并通知维修人员进行处理。这样可以避免因交通灯故障而导致的交通事故和拥堵。 最后,在交通灯系统设计中,还可以考虑一些先进的技术和功能。比如,利用人工智能和机器学习算法,系统可以学习和优化交通模式,提高交通的智能性和适应性。另外,系统还可以与车辆的智能化系统进行互联,实现实时的数据共享和互动,从而更加准确地判断和控制交通流量。 综上所述,头哥数字逻辑---交通灯系统设计是一个基于数字逻辑的交通控制系统,通过合理的信号灯切换控制、时段预测和故障检测等功能,可以提高道路交通的效率和安全性,为人们出行提供更加便利和舒适的交通环境。 ### 回答2: 交通灯系统设计是一个综合利用数字逻辑技术的项目。在这个项目中,我们需要设计一个能够实现按照交通规则进行识别并控制交通流量的交通灯系统。 首先,我们需要通过图像识别技术来识别交通场景中的车辆、行人等交通参与者。通过传感器捕捉到的视频信号,我们可以使用数字逻辑技术对图像进行分析和处理,提取出交通参与者的位置和动态信息。 其次,我们需要根据识别到的交通参与者的位置和动态信息,来判断当前交通灯应该处于什么状态。通过数字逻辑的判断和算法设计,我们可以根据交通规则和场景中的交通参与者来进行切换灯光的决策。 最后,我们需要通过数字逻辑技术实现交通灯的控制。通过控制器和执行器,我们可以根据判断结果来控制交通灯的亮灭和切换。同时,我们也需要考虑到交通灯系统的稳定性和可靠性,以确保交通流量的正常进行。 在整个设计过程中,数字逻辑技术发挥了关键作用。它能够快速处理大量的信号和数据,并通过判断和算法来实现对交通灯系统的控制。同时,数字逻辑还能够提供高精度的决策和准确的切换,从而保证交通流量的安全和有序。 综上所述,头哥数字逻辑在交通灯系统设计中发挥了重要的作用。通过图像识别、判断和控制等一系列数字逻辑技术的综合应用,我们可以设计出一个高效、稳定和安全的交通灯系统。这将有助于优化交通流量,提高道路交通的效率和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值