`

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

阅读更多
交通灯管理系统

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


模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
 异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。
 信号灯忽略黄灯,只考虑红灯和绿灯。
 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
设计思路:
首先将交通图画出来如下所示:
根据图,我们可以看出总共有12条行车路线,分别是:
S2N,N2S,E2W,W2E,S2W,N2E,W2N,E2S,S2E,E2N,N2W,W2S
确定都需创建什么对象:
1、12条路线也就对应12条路线对象,在每条路线上,车源源不断的不定期的开来,如当前路线的灯为绿灯,则车每隔1秒开走1辆
2、12条路线就对应12个灯对象,当一个线路的灯绿时,它的相反方向的灯也变绿,当它变红的时候,下一个灯及它相反风向的灯就会变绿,这种依次变绿的过程,是按一定顺序的,所以可以用一个枚举来定义这12个灯,每个灯应对应3个参数,它的相反方向的灯,它的下一个灯,及它的红绿状态
3、这12个灯,需要一个控制器,控制将灯变绿,隔多长时间再把它变红,右转弯的四个灯是常绿,不需要控制,剩余的8个灯,只需要控制4个灯:S2N,S2W,W2E,W2N即可,它们相反方向的灯的红绿状态在同一时间和它们一样
4、最后需要创建一个调度类,创建控制器对象,让控制器开始控制灯红绿交换,并启动上面的12条路对象,让上面的车根据控制器所控制的当前路线灯红绿的状态,开始“走走“来来。
Road代码:
package test.traffic;
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 {
private String name=null;
List<String> vehicle=new ArrayList<String>();
	public Road(String name)
	{
		this.name=name;	
		 ExecutorService pool=Executors.newFixedThreadPool(1);
		 pool.execute(new Runnable()
		 {
int i=1; 
			@Override
			public void run() 
			{ 
			 while(i<1000)	
			 {	
				 vehicle.add(Road.this.name+"路线上的第"+(i++)+"辆车"); 
				 try
				 {
					 Thread.sleep((new Random().nextInt(10)+1)*1000);
			 	 }
			 catch (InterruptedException e) 
				 {
				 	 e.printStackTrace();
				 }
				
				// TODO Auto-generated method stub
			 }
			}
			 
		 });
		 pool.isShutdown();
		ScheduledExecutorService timer= Executors.newSingleThreadScheduledExecutor();
		timer.scheduleAtFixedRate(new Runnable()
		{
			@Override
			public void run() {
				
				boolean blue=Lamp.valueOf(Road.this.name).blue;
				if(vehicle.size()!=0)
				{	while(blue)
			 	{
					System.out.println(vehicle.remove(0)+"正在通过十字路口!");/*remove(0):移除此列表中指定位置上的索引为0的元素,同时向左移动所有后续元素(将其索引减 1)
					 即移动第0个元素后,原第一个元素的索引就变成了0。 */
				 }
			 	// TODO Auto-generated method stub
		 		
				} }
			
		},
				1,
				2, 
				TimeUnit.SECONDS);
		
	}}
Lamp(灯)代码:
package test.traffic;	
enum Lamp
{ S2N("S2W",false,"N2S"),S2W("W2E",false,"N2E"),W2E("W2N",false,"E2W"),W2N("S2N",false,"E2S"),
	N2S("null",false,"null"),N2E("null",false,"null"),E2W("null",false,"null"),E2S("null",false,"null"),
	S2E(null,true,null),E2N(null,true,null),N2W(null,true,null),W2S(null,true,null);
public boolean blue=true;
String next=null;
String opposite=null;
	private Lamp(String next,boolean blue,String opposite)
{ 
this.blue=blue;
this.next=next;
this.opposite=opposite;
};
public boolean isLighted()
{
	return blue;
}
public void blueLight()
{ blue=true;
Lamp.valueOf(opposite).blue=true;
System.out.println(this.name()+"灯和"+Lamp.valueOf(opposite).name()+ "灯变绿了");
}
	 
public Lamp redLight()
{
	 blue=false;
	 Lamp.valueOf(opposite).blue=false;
	 Lamp nextLamp=Lamp.valueOf(next);
	 nextLamp.blueLight();
	 return nextLamp;
	
	
	
}
	
}
LampController(灯得控制器)代码:
package test.traffic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampController {
	private Lamp currentLamp =Lamp.S2N;
public LampController()
{ System.out.println("最多有6个方向的车可以通过");
	 currentLamp.blueLight();
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable()
{
		 @Override
		 public void run()
		 {
			 currentLamp=currentLamp.redLight();
	 	 }
},
		 10,
		 15,
		TimeUnit.SECONDS);
	
}
}
启动代码:
package test.traffic;
public class Scheduler {
	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培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics