黑马程序员:交通灯管理系统
来源:互联网 发布:qq群淘宝互刷是真的吗 编辑:程序博客网 时间:2024/05/17 23:33
交通灯管理系统
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆----直行车辆
由西向而来去往南向的车辆 ----右转车辆
由东向而来去往南向的车辆 ----左转车辆
。。
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
分析:
模似,十字路口
1.有4条主路,南到北,北到南,西到东,东到西,
主路分别产生,3个不同方向的车,向前,向左,向右的车,总共有12个方向当一条路上灯为绿灯时,此路上向前,和向左,向右的都可以行驶
当一条路上灯为红灯时,此路上只能让,向右的车可以行驶灯为两组,南向北,北向南的灯为一组,
西到东,东到西的为一组,
一组灯为红灯,另一组则为绿灯。由LampController.java类控红,和绿
Road类:
package cn.com;import java.util.ArrayList;import java.util.List;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 {private List<String> vechicles = 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<100;i++){try {Thread.sleep((new Random().nextInt(10) + 1) * 1000);} catch (InterruptedException e) {e.printStackTrace();}int rand=new Random().nextInt(3);String vechicle=null;switch (rand) {case 0:vechicle=Road.this.name + ",第" + i+"辆车,方向向前";break;case 1:vechicle=Road.this.name + ",第" + i+"辆车,方向向左";break;case 2:vechicle="无阻——"+Road.this.name + ",第" + i+"辆车,方向向右";break;}vechicles.add(vechicle);System.out.println(vechicle+"的车,要过十字路口");}}});//定时器每隔1秒,可以让车行驶,向左的,和向前的车,当绿灯是可通过,向右的车,不管红绿都能行ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public void run(){if(vechicles.size()>0){String str=Road.this.name.replaceAll("到","");str=str.replace('北', 'N');str=str.replace('东', 'E');str=str.replace('西', 'W');str=str.replace('南', 'S');boolean lighted = Lamp.valueOf(str).isLighted();String v=vechicles.get(0);if(v.substring(v.length()-1).equals("右")){//右转的车,红绿都行System.out.println("\t\t\t\t\t"+vechicles.remove(0) + "行驶走了 !");}else if(lighted){System.out.println("\t\t\t\t\t"+vechicles.remove(0) + "行驶走了 !");}}}},1,1,TimeUnit.SECONDS);}}
Lamp类:交通灯类
package cn.com;public enum Lamp {/* * 北到南,南到北为一组灯,同时红,同时绿 * 东到西,和西到东为一组灯,同时红,同时绿 *///N北 S南 W西 E东NS("SN","WE"),SN("NS","EW"),EW("WE","SN"),WE("EW","NS");public String toString(){switch (this) {case SN:return "南到北";case EW:return "东到西" ;case NS:return "北到南" ;case WE:return "西到东";}return null;}private boolean lighted;//灯是红还是绿,以此为标private String opposite;private String nextRight;public boolean isLighted() {return lighted;}private Lamp(String opposite,String nextRigth) {this.opposite = opposite;this.nextRight=nextRigth;}public void light() {this.lighted = true;Lamp.valueOf(this.nextRight).lighted=false;Lamp oppositeLamp=Lamp.valueOf(opposite);oppositeLamp.lighted=true;Lamp.valueOf(oppositeLamp.nextRight).lighted=false;System.out.println("\t\t"+Lamp.valueOf(this.nextRight)+"开启红灯--"+Lamp.valueOf(oppositeLamp.nextRight)+"开启红灯\n"+"\t\t"+this+"开绿灯"+"----"+oppositeLamp+"开绿灯");}public void blackOut(){//一组灯红,对应一组灯变绿this.lighted = false;Lamp.valueOf(this.nextRight).lighted=true;Lamp oppositeLamp=Lamp.valueOf(opposite);oppositeLamp.lighted=false;Lamp.valueOf(oppositeLamp.nextRight).lighted=true;System.out.println("\t\t"+this+"开启红灯"+"--"+oppositeLamp+"开红灯"+"\n\t\t"+Lamp.valueOf(this.nextRight)+"开启绿灯----"+Lamp.valueOf(oppositeLamp.nextRight)+"开启绿灯\n");}}
LampController类:作为灯的控制器
package cn.com;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class LampController {private Lamp currentLamp;public LampController(){currentLamp = Lamp.SN;//第一个灯,南到北,就绿currentLamp.light();ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public void run(){if(currentLamp.isLighted())currentLamp.blackOut();elsecurrentLamp.light();}},10,10,TimeUnit.SECONDS);}}
MainRun类:运行测试类
package cn.com;public class MainRun {public static void main(String[] args) {String [] directions = new String[]{"南到北","北到南","西到东","东到西"};for(int i=0;i<directions.length;i++){new Road(directions[i]);}new LampController();}}
在面象对象时,
让灯作为一个对象,当一个灯变红变绿时,其3个灯也变(相反的灯,颜色一样,左右的灯,颜色相反),这样所有灯,我们只要把一个灯做为对象,就控好了所有灯了。
,路做为一个对象,而车是由路产生的,一条路产3个方向的车,当然这有4条大路,
3个方向的车,向前,向左的是要看绿灯才能过,而向右的,没有要求。
效果图:
- 《黑马程序员》交通灯管理系统
- 黑马程序员----交通灯管理系统
- <黑马程序员>交通灯管理系统
- 【黑马程序员】交通灯管理系统
- 黑马程序员 交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员--交通灯管理系统
- 《黑马程序员》交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员:交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员 交通灯管理系统
- 黑马程序员-交通灯管理系统
- 黑马程序员-交通灯管理系统
- 黑马程序员-------交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员-交通灯管理系统
- linux命令,connect超时如何实现
- DOs历史
- 《C++ Primer》作者Stanley B.Lippman谈C++语言和软件产业的发展
- 停止线程
- 软件工程之概述
- 黑马程序员:交通灯管理系统
- MPEG2_TS(一)-结构-复用器
- PHP数组实际占用内存大小的分析
- MySQL中ON DUPLICATE KEY UPDATE语法
- 手工启动Tomcat一闪而过
- c++虚函数与纯虚函数
- ArcGlobe图层高程拉伸
- JEECG 引领J2EE新开发模式插件式开发 - 公开课2013-12-12
- 用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)