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

来源:互联网 发布:新浪视频mac客户端 编辑:程序博客网 时间:2024/05/29 14:34
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
交通管理系统项目:模拟实现十字路口的交通灯管理系统逻辑
需求分析:
1.异步随机生成按照各个路线行驶的车辆
2.信号灯忽略黄灯,只考虑红灯和绿灯
3.左转车辆受信号灯控制,右转车辆不受信号灯控制
4.具体信号灯控制逻辑与显示生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑
* 东西向和南北向的车辆交替放行
* 同方向等待车辆应先放行直行车辆,再放行左转车辆
5.假设每辆车通过路口所用的时间为1秒
6.随机生成车辆的时间间隔和红绿灯交换的时间间隔自定,可以自定义设置
7.不识闲GUI,只考虑系统逻辑实现,通过Log方式展现程序运行结果
设计思路:
   1.画图,十字路口有十二条路线,四条右转线设为常绿,剩余八条路线两两对应,因此只需四条路线,按照实际顺序轮转:南->北 南->西 东->西,东->南
   2.分析项目中的类,包括:路,灯,灯的控制系统
   3.类设计:
路:Road 包括存储车辆字符串的集合的成员变量,构造方法传入路线名,内部提供随机生成的汽车,并根据路线上灯Lamp的变化判断车是       否通过。
灯:Lamp 设计成枚举类,包括12个路线的灯,提供相应的方法控制灯的亮灭,以及灯是否亮灭的判断方法。
  灯控制系统:LampControl系统 负责周期性的调用信号灯转换。
  
实际的项目代码如下面显示:
-----------------------------------------------------------------------------------------
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


public class TrafficLampControl 
{
private TrafficLamp currentLamp;
public TrafficLampControl()
{
currentLamp = TrafficLamp.S2N;
currentLamp.light();

ScheduledExecutorService scheleExecutor = Executors.newSingleThreadScheduledExecutor();
scheleExecutor.scheduleAtFixedRate(
new Runnable()
{
@Override
public void run() 
{
currentLamp = currentLamp.blackOut();
}

}, 
10, 
10, 
TimeUnit.SECONDS
);

}

}
-----------------------------------------------------------------------------------------


public enum TrafficLamp
{
S2N(false , "N2S" , "S2W") , S2W(false , "N2E" , "E2W") , E2W(false , "W2E" , "E2S") , E2S(false , "W2N" , "S2N") , 
N2S(false , null , null) , N2E(false , null , null) , W2E(false , null , null) , W2N(false , null , null) , 
S2E(true , null , null) , E2N(true , null , null) , N2W(true , null , null) , W2S(true , null , null);

private boolean lighted;
private String oppsite;
private String next;

TrafficLamp(boolean lighted , String oppsite , String next)
{
this.lighted = lighted;
this.oppsite = oppsite;
this.next = next;
}

public boolean isLighted()
{
return lighted;
}

public void light()
{
lighted = true;
if(oppsite != null)
TrafficLamp.valueOf(oppsite).light();
System.out.println(name() + "--------->TrafficLamp is green" + " , 以下应该有六个方向的汽车穿过");
}

public TrafficLamp blackOut()
{
lighted = false;
if(oppsite != null)
TrafficLamp.valueOf(oppsite).blackOut();
System.out.println(name() + "--------->TrafficLamp is red");

TrafficLamp nextLamp = null;
if(next != null)
{
nextLamp = TrafficLamp.valueOf(next);
System.out.println("绿灯由" + name()  + "和" + oppsite.toString() + "切换为----->" + next);
nextLamp.light();
}
return nextLamp;
}


}

-----------------------------------------------------------------------------------------
import java.util.*;


public class Road 
{
private List<String> vechicles = new ArrayList<>();
private String name;
Road(String name)
{
this.name = name;

ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable()
{
@Override
public void run() 
{
for(int i = 0 ; i < 1000 ; i++)
{
try 
{
Thread.sleep((new Random().nextInt(10) + 1) * 1000);

catch (InterruptedException e) 
{
e.printStackTrace();
}
vechicles.add(Road.this.name + "_" + i);
}

}

});

ScheduledExecutorService scheleExecutor = Executors.newSingleThreadScheduledExecutor();
scheleExecutor.scheduleAtFixedRate(
new Runnable()
{
@Override
public void run() 
{
if(vechicles.size() > 0)
{
boolean light = TrafficLamp.valueOf(Road.this.name).isLighted();
if(light)
System.out.println(vechicles.remove(0) + "————>is traversing!");
}


}
}, 
1, 
1, 
TimeUnit.SECONDS
);

}
}

-----------------------------------------------------------------------------------------


public class mainClass
{
public static void main(String[] args) 
{
String[] directions = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
for(int x = 0 ; x < directions.length ; x++)
{
new Road(directions[x]);
}

new TrafficLampControl();
}
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net
0 0
原创粉丝点击