黑马程序员---交通灯管理系统

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

 

 

黑马程序员---交通灯管理系统

 

 

 

一、交通灯管理项目需求
交通灯管理系统

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

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

例如:

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

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

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

       。。。

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

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

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

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

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

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

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


 

二、实现步骤

1.对需求进行分析。
画出路线图对路线的分析


由图可分析出十字路口总共有12条行车路线。由于从南向北和从北向南是一个交通灯调控,所以南北向只要考虑一个方向的灯,东西向也只要考虑一个方向的灯即可。南北向的灯在由绿变红后,首先需要让南转西的过完之后才能开放东西向的通行。东西向的灯由绿变红后,首先要开放东转南方向的通行,然后再开通南北方向。然后一直这么循环下去。也就是说只要设计4组灯就可以了。因为有12个路口得有12个灯,即使那条路线一直可以通行,也要设计一个一直为绿灯的灯放在那里。
假设右转弯的灯为常绿。因为12个灯是固定的,所以我们想到了用枚举

2.代码编写
road类的编写

import java.util.ArrayList;
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 {
	/*
	 * 每条路线,都有自己的名字(name),用于存储车辆的集合(vehicles)。名字和它身上的红绿灯同名,以此获取交通灯枚举(Lamp)
	 * 同时,每条路线,已生成就应该不停的 随机 产生车辆和 定时移走车辆
	 */
	private String name;//路线名,与路上的红绿灯同名
	private ArrayList<String> vehicles = new ArrayList<String>();//用于存储本线路上的车辆
	
	public Road(String name){
		this.name=name;
		//随机产生车辆
		ExecutorService carMaker=Executors.newSingleThreadExecutor();
		carMaker.execute(new Runnable(){
			@Override
			public void run() {
				for(int x =0;x<1000;x++){
					//通过sleep方法控制产生车辆的时间间隔,把握节奏
					try {
						Thread.sleep((new Random().nextInt(10)+1)*1000);//这里用随机数,以更逼近现实。
					} catch (InterruptedException e) {						
						e.printStackTrace();
					}
					//为通过的车辆编号,并增加到集合中,这里的name有两个,一个构造传进来的参数,一个是外部类的成员变量,所以要区分下
					vehicles.add(Road.this.name+"_"+x);
				}
				
			}
			
		});
		//每个1秒移走车辆,用定时器实现操作
		ScheduledExecutorService carMoveTimer=Executors.newScheduledThreadPool(1);
		carMoveTimer.scheduleAtFixedRate(
				new Runnable(){
					@Override
					public void run() {
						//如果路上有车且路上的交通灯为绿才移走车辆
						if(vehicles.size()!=0){
							//通过路的名字获取其交通灯,并判断交通灯是否亮
							boolean lighted=Lamp.valueOf(Road.this.name).isLighted();
							if(lighted){
								//remove(int index)返回的是移走的那个元素
								System.out.println(vehicles.remove(0)+"----正在穿过路口");
							}
						}
						
					}					
				}, 
				0, 
				1, 
				TimeUnit.SECONDS);		
	}
	
}



交通灯Lamp类

/*
 每个灯,含有三个属性:是否亮(lighted),对面的灯(opposite),下一个要亮的灯(nextLamp);
 三个方法:是否亮(boolean lighted),灯转亮(light()),灯熄灭(breakout())
 
 */

public enum Lamp {	
	//四个主控制灯,交替顺序:先南向北,然后左转,再东向西,然后左转
	S2N("S2W","N2S",false),S2W("E2W","N2E",false),E2W("E2S","W2E",false),E2S("S2N","W2N",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(String next,String opposite, boolean lighted) {	
		this.next = next;
		this.opposite = opposite;		
		this.lighted = lighted;
	}	
	
	public boolean isLighted() {		
		return lighted;
	}
	
	public void light(){
		this.lighted=true;		
		if(this.opposite!=null){
			Lamp.valueOf(opposite).light();			
		}
		System.out.println(name() + " is Green,下边应该有6个方向能够看到汽车通过");	
	}
	

	public Lamp breakout(){
		this.lighted=false;		
		if(opposite!=null){//应该判断是否为空,以免陷入死循环
			Lamp.valueOf(opposite).breakout();			
		}
		Lamp nextLamp =null;
		if(next!=null){//应该判断是否为空,以免陷入死循环
			nextLamp=Lamp.valueOf(next);
			nextLamp.light();
			System.out.println("绿灯从"+name()+"--------->切换为"+next);
		}		
		return nextLamp;
	}
}



 

交通灯控制器LampController类:

/*
 每个灯,含有三个属性:是否亮(lighted),对面的灯(opposite),下一个要亮的灯(nextLamp);
 三个方法:是否亮(boolean lighted),灯转亮(light()),灯熄灭(breakout())
 
 */

public enum Lamp {	
	//四个主控制灯,交替顺序:先南向北,然后左转,再东向西,然后左转
	S2N("S2W","N2S",false),S2W("E2W","N2E",false),E2W("E2S","W2E",false),E2S("S2N","W2N",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(String next,String opposite, boolean lighted) {	
		this.next = next;
		this.opposite = opposite;		
		this.lighted = lighted;
	}	
	
	public boolean isLighted() {		
		return lighted;
	}
	
	public void light(){
		this.lighted=true;		
		if(this.opposite!=null){
			Lamp.valueOf(opposite).light();			
		}
		System.out.println(name() + " is Green,下边应该有6个方向能够看到汽车通过");	
	}
	

	public Lamp breakout(){
		this.lighted=false;		
		if(opposite!=null){//应该判断是否为空,以免陷入死循环
			Lamp.valueOf(opposite).breakout();			
		}
		Lamp nextLamp =null;
		if(next!=null){//应该判断是否为空,以免陷入死循环
			nextLamp=Lamp.valueOf(next);
			nextLamp.light();
			System.out.println("绿灯从"+name()+"--------->切换为"+next);
		}		
		return nextLamp;
	}
}



运行启动类:MainClass

  public class MainClass {
 
 public static void main(String[] args) {
  //生成十二条路线
  String[] roadNames={"S2N","S2W","E2W","E2S",
    "N2S","N2E","W2E","W2N",
    "S2E","E2N","N2W","W2S"};   </P><P>  for(int x=0;x<12;x++){
   new Road(roadNames[x]);
  }
  //启动交通灯控制器
  new LampController();
  
 }}


运行结果:

N2S is Green,下边应该有6个方向能够看到汽车通过
S2N is Green,下边应该有6个方向能够看到汽车通过
S2E_0----正在穿过路口
N2S_0----正在穿过路口
N2W_0----正在穿过路口
N2S_1----正在穿过路口
S2E_1----正在穿过路口
W2S_0----正在穿过路口
S2N_0----正在穿过路口
S2E_2----正在穿过路口
N2S_2----正在穿过路口
N2W_1----正在穿过路口
E2N_0----正在穿过路口
N2E is Green,下边应该有6个方向能够看到汽车通过
S2W is Green,下边应该有6个方向能够看到汽车通过
绿灯从S2N--------->切换为S2W
S2W_0----正在穿过路口
N2E_0----正在穿过路口
N2E_1----正在穿过路口
S2W_1----正在穿过路口
N2E_2----正在穿过路口
S2E_3----正在穿过路口
W2S_1----正在穿过路口
S2E_4----正在穿过路口
N2W_2----正在穿过路口
E2N_1----正在穿过路口
S2E_5----正在穿过路口
W2S_2----正在穿过路口
W2E is Green,下边应该有6个方向能够看到汽车通过
E2W is Green,下边应该有6个方向能够看到汽车通过
绿灯从S2W--------->切换为E2W
E2W_0----正在穿过路口
W2E_0----正在穿过路口
E2W_1----正在穿过路口
W2E_1----正在穿过路口
E2N_2----正在穿过路口
N2W_3----正在穿过路口
E2W_2----正在穿过路口
W2E_2----正在穿过路口
W2E_3----正在穿过路口
E2N_3----正在穿过路口
S2E_6----正在穿过路口
E2W_3----正在穿过路口
E2N_4----正在穿过路口
W2E_4----正在穿过路口
S2E_7----正在穿过路口
E2W_4----正在穿过路口
W2E_5----正在穿过路口
W2S_3----正在穿过路口
W2N is Green,下边应该有6个方向能够看到汽车通过
E2S is Green,下边应该有6个方向能够看到汽车通过
绿灯从E2W--------->切换为E2S
E2S_0----正在穿过路口
W2N_0----正在穿过路口
N2W_4----正在穿过路口
E2S_1----正在穿过路口
W2N_1----正在穿过路口
E2S_2----正在穿过路口
W2N_2----正在穿过路口
E2S_3----正在穿过路口
W2N_3----正在穿过路口
E2S_4----正在穿过路口
W2N_4----正在穿过路口
E2S_5----正在穿过路口
W2N_5----正在穿过路口
E2N_5----正在穿过路口
W2N_6----正在穿过路口
W2S_4----正在穿过路口
S2E_8----正在穿过路口
E2N_6----正在穿过路口
W2S_5----正在穿过路口
N2W_5----正在穿过路口
N2S is Green,下边应该有6个方向能够看到汽车通过
S2N is Green,下边应该有6个方向能够看到汽车通过
绿灯从E2S--------->切换为S2N
S2N_1----正在穿过路口
N2S_3----正在穿过路口


 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值