交通灯管理系统 学习笔记

原创 2012年03月23日 00:49:47



设计分析:


系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,综合这些因素,将Lamp类用java5中的枚举形式定义更为简单。
每个Lamp对象中的亮黑状态用lighted变量表示,选用S2N、S2W、E2W、E2N这四个方向上的Lamp对象依次轮询变亮,Lamp对象中还要有一个oppositeLampName变量来表示它们相反方向的灯,再用一个nextLampName变量来表示此灯变亮后的下一个变亮的灯。这三个变量用构造方法的形式进行赋值,因为枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用,所以,相反方向和下一个方向的灯用字符串形式表示。 
增加让Lamp变亮和变黑的方法:light和blackOut,对于S2N、S2W、E2W、E2N这四个方向上的Lamp对象,这两个方法内部要让相反方向的灯随之变亮和变黑,blackOut方法还要让下一个灯变亮。
除了S2N、S2W、E2W、E2N这四个方向上的Lamp对象之外,其他方向上的Lamp对象的nextLampName和oppositeLampName属性设置为null即可,并且S2N、S2W、E2W、E2N这四个方向上的Lamp对象的nextLampName和oppositeLampName属性必须设置为null,以便防止light和blackOut进入死循环。


实现如下:

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 boolean lighted;
	//相反的灯,此处用字符串表示;如果用枚举,后边定义的用不了,还没定义
	private String opposite;
	//下一个灯 绿边红,忽略黄灯
	private String next;
	
	private Lamp() {}
	private Lamp(String opposite,String next, boolean lighted) {
		this.opposite = opposite;
		this.next = next;
		this.lighted = lighted;
	}
	
	public boolean isLighted() {
		return lighted;
		
		
	}
	//绿灯
	public void light() {
		this.lighted = true;
		//不让死循环,另一个方向的灯的相反方向灯为null
				if(opposite!=null) {
					Lamp.valueOf(opposite).light();
				}
				
				System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");
	}
	//红灯,返回下一个灯
	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;
	}
}

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;


public class Road {
	
	//车的集合
	private List<String> vechicles = new ArrayList<String>();
	
	//路的名字,这里是方向S2E
	private String name = null;
	
	public Road(String name) {
		this.name = name;
		
		ExecutorService pool = Executors.newSingleThreadExecutor();
		pool.execute(new Runnable(){

			@Override
			public void run() {
				for(int i=1;i<1000;i++) {
					try {
						//1 到 10 秒钟,模拟车辆出现频率
						Thread.sleep((new Random().nextInt(10)+1)*1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					vechicles.add(Road.this.name+"_"+i);
				}
			}
			
		});
		
		//汽车查看路灯的状况
		
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable() {

					@Override
					public void run() {
						if(vechicles.size()>0) {
							//判断是否是绿灯
							boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
							if(lighted) {
								//汽车穿过
								System.out.println(vechicles.remove(0)+ " is traversing");
							}
						}
					}
					
				}, 
				1, 
				1, 
				TimeUnit.SECONDS);
	}
}

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

/**
 * 控制灯的交替
 * @author ETHAN
 *
 */
public class LampController {
	private Lamp currentLamp;
	
	public LampController() {
		currentLamp = Lamp.S2N;
		//S2N, lighted------>true
		//改变枚举类成员,枚举成员就是一个实例对象
		currentLamp.light();
		
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		
		//每隔10秒钟把当前灯变黑
		timer.scheduleAtFixedRate(
				new Runnable() {
					@Override
					public void run() {
						System.out.println("Come on!");
						//返回下一个变凉的灯
						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]);
		}
		
		/*产生整个交通灯系统*/	
		//灯 10秒钟 交替
		new LampController();
	}

}



交通灯管理系统_编码思路及代码

1,面试题——交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。 信号灯忽略黄灯,只考虑红灯和绿灯。 应考虑左转车辆控制...
  • u011730649
  • u011730649
  • 2015年09月08日 22:30
  • 698

用VHDL设计交通灯

一. 程序代码 1. 分频模块LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY fen_pin IS PORT( CLK : I...
  • Sherduo
  • Sherduo
  • 2017年02月06日 17:39
  • 502

Java经典题目:交通灯系统

交通灯管理系统 第一部分:需求 一、模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。 例如:        由南向而来去往北向的车辆 ---...
  • qq_23384553
  • qq_23384553
  • 2015年05月30日 10:30
  • 1203

【Keil】十字路口车辆行人红绿灯实现 _单片机Keil开发

前言 这次作为嵌入式系统与应用的中期考试,老师要求写一个红绿灯的程序(包括车辆&行人),要求在单片机上可持续合理化运行 简化如下:十字路口中,南北方向与东西方向均只考虑直行,行人红绿灯仅考虑东侧的南北...
  • okcd00
  • okcd00
  • 2015年05月04日 19:06
  • 2450

10.3 单片机交通灯实例

同学们在学习技术的时候,一定要多动脑筋,遇到问题后,三思而后问。有些时候你考虑的和真理就差一点点了,没有坚持下去,别人告诉你后才恍然大悟。这样得到的结论,可以让你学到知识,但是却培养不了你的逻辑思维能...
  • softn
  • softn
  • 2016年07月07日 05:38
  • 203

Arduino系列教程-05 交通灯控制

本教程来至yingcloud.com网站 利用Arduino模拟交通灯信号红、绿、黄、三种颜色的灯交替闪烁,利用程序控制LED灯的闪烁时间,把三种颜色的灯很好的连接在了一起。 实验元器件 L...
  • yingcloud
  • yingcloud
  • 2014年02月07日 09:51
  • 6248

基于51单片机的交通灯C语言程序设计

十字交叉路口的交通灯控制器,是很常见的课程设计题目。做而论道以前写过一个,功能十分简单。最近,综合了一些百度知道中的题目要求,写出了一个稍稍复杂一点设计方案,使用了大家比较喜欢的C语言编写程序。基本功...
  • baidu_33836580
  • baidu_33836580
  • 2016年01月25日 11:47
  • 4948

用java模拟交通灯系统实现

交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: Ø 异步随机生成按照各个路线行驶的车辆。 例如:        由南向而来去往北向的车辆 ---- 直行车辆        由西向...
  • u013999337
  • u013999337
  • 2014年03月16日 11:24
  • 1306

EDA大作业——交通灯

EDA大作业   题   目:     交通灯         授课老师:     徐少莹           学    院:  电子工程学院        专    业:  智能科学与技术...
  • a350203223
  • a350203223
  • 2014年06月30日 23:08
  • 1719

SUMO使用教程(四)

osm文件下载之后并没有交通灯,挺头疼的,目前只找到了手工加入的方法。 1.用josm打开osm文件。josm在windows下可以用jar版的或者windows安装版本的。理论上jar的稍稍会卡一...
  • qtlyx
  • qtlyx
  • 2015年11月03日 21:08
  • 1538
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:交通灯管理系统 学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)