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

来源:互联网 发布:java concurrent g9 编辑:程序博客网 时间:2024/06/14 19:05

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

交通灯管理系统

 

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

 

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

例如:

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

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

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

       。。。

 

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

 

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

 

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

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

 

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

 

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

 

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


看了张老师的视频,感觉代码很简练,思路也非常清晰。但是我总想用另一种更直观,更简洁、更能体现面向对象思想,更具有扩展性的思路去做。比如让程序可以设置红、黄、绿三种颜色的灯,也可以只有红灯和绿灯,甚至有闪烁的黄灯。让程序也能适用于钉子路口,三叉路口、立体交通系统等等。但这个系统就变得非常复杂,我现在的能力只是想想而已,希望能在黑马学习中能做出这样的系统。

下面是我修改的张老师的代码,把程序中涉及到的所有的灯都用字符串表示。张老师的视频里的灯有些是字符串类型,有些是灯类型,如next,opposite对象是字符串,nextLamp,oppositeLamp对象是Lamp类型。我还加上了判断通过路口的车是直行还是左拐、右拐,并显示了出来。

代码如下:

//灯程序package cafficitclaste;public enum Lamp {S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2W",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 opposizeLamp;private String nextLamp;private Lamp(String oppositeLamp,String nextLamp,boolean lighted ){this.opposizeLamp = oppositeLamp;this.nextLamp = nextLamp;this.lighted = lighted;}public boolean isLighted(){return lighted;}public void light(){this.lighted =true;if(opposizeLamp!=null){Lamp.valueOf(opposizeLamp).light();}}public String blackOut(){this.lighted = false;if(opposizeLamp!=null){Lamp.valueOf(opposizeLamp).blackOut();} if(nextLamp!=null){nextLamp=Lamp.valueOf(nextLamp).toString();Lamp.valueOf(nextLamp).light();}return nextLamp;}}



//路程序:package cafficitclaste;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 List<String> cars =new ArrayList<String>();private String name = null;public Road(String name){this.name = name;ExecutorService pool = Executors.newSingleThreadExecutor();pool.execute(new Runnable(){public void run(){for(int i = 1;i<10000;i++){ try {Thread.sleep((new Random().nextInt(10)+1)*1000);} catch (InterruptedException e) {e.printStackTrace();}cars.add(Road.this.name+"第"+i+"辆车");}} });ScheduledExecutorService timer =Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public void run() {if(cars.size()>0){boolean lighted = Lamp.valueOf(Road.this.name).isLighted();if(lighted){ if(cars.get(0).contains("S2N")||cars.get(0).contains("N2S")||cars.get(0).contains("E2W")||cars.get(0).contains("W2E"))System.out.println(cars.remove(0)+"  直行   go go go!!!");else if(cars.get(0).contains("S2W")||cars.get(0).contains("N2E")||cars.get(0).contains("E2S")||cars.get(0).contains("W2N"))System.out.println(cars.remove(0)+"  左拐   go go go!!!");else//(cars.get(0).contains("S2E")||cars.get(0).contains("N2W")||cars.get(0).contains("E2N")||cars.get(0).contains("W2S"))System.out.println(cars.remove(0)+"  右拐   go go go!!!");}}}}, 1, 1, TimeUnit.SECONDS);}}




//控制器package cafficitclaste;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class LampCotroller {private String currentLamp;public LampCotroller() {currentLamp = Lamp.S2N.toString();Lamp.valueOf(currentLamp).light();ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public void run(){currentLamp = Lamp.valueOf(currentLamp).blackOut();}},  10,  10,   TimeUnit.SECONDS);}}




//程序入口:package cafficitclaste;public class MainClass {public static void main(String[] args) {String[] arr =new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};for(int i= 0;i<arr.length;i++){new Road(arr[i]);}new LampCotroller();}}


结果:

S2N第1辆车  直行   go go go!!!
W2S第1辆车  右拐   go go go!!!
W2S第2辆车  右拐   go go go!!!
N2W第1辆车  右拐   go go go!!!
N2S第1辆车  直行   go go go!!!
W2S第3辆车  右拐   go go go!!!
S2E第1辆车  右拐   go go go!!!
S2N第2辆车  直行   go go go!!!
N2W第2辆车  右拐   go go go!!!
S2E第2辆车  右拐   go go go!!!
E2N第1辆车  右拐   go go go!!!
S2W第1辆车  左拐   go go go!!!
N2E第1辆车  左拐   go go go!!!
W2S第4辆车  右拐   go go go!!!

.................................

.................................

.................................

E2W第99辆车  直行   go go go!!!
W2S第116辆车  右拐   go go go!!!
E2W第100辆车  直行   go go go!!!
N2W第110辆车  右拐   go go go!!!
N2W第111辆车  右拐   go go go!!!
S2E第92辆车  右拐   go go go!!!
E2N第98辆车  右拐   go go go!!!
E2W第101辆车  直行   go go go!!!
W2S第117辆车  右拐   go go go!!!
E2N第99辆车  右拐   go go go!!!
N2W第112辆车  右拐   go go go!!!
E2S第94辆车  左拐   go go go!!!
W2N第97辆车  左拐   go go go!!!
E2S第95辆车  左拐   go go go!!!

..........................................

..........................................

..........................................




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

原创粉丝点击