黑马程序员 交通灯管理系统
来源:互联网 发布: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培训、期待与您交流! ----------
- 《黑马程序员》交通灯管理系统
- 黑马程序员----交通灯管理系统
- <黑马程序员>交通灯管理系统
- 【黑马程序员】交通灯管理系统
- 黑马程序员 交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员--交通灯管理系统
- 《黑马程序员》交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员:交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员 交通灯管理系统
- 黑马程序员-交通灯管理系统
- 黑马程序员-交通灯管理系统
- 黑马程序员-------交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员-交通灯管理系统
- 十岁小孩教用Python写游戏
- stl_list的back()函数疑问与解析
- 开源 免费 java CMS - FreeCMS-1.5发布
- 使用纯JSP实现分页操作
- 手写MYSQL 脚本文件SQL注意编码
- 黑马程序员 交通灯管理系统
- SQL 左外连接,右外连接,全连接,内连接 4种连接的区别 .
- 求助:eclipse崩溃
- 分别使用c、shell语言实现文件内容合并 -- 2014百度面试题目
- HTTP状态码->HTTP Status Code
- 如何加快sql查询速度
- ARM裸机开发笔记1(指令简介)
- 懂外语,不一定会交流
- TEST