-
黑马程序员--JAVA交通灯管理系统项目
2013-10-15 19:32:45模拟实现十字路口的交通灯管理系统逻辑,具体要求如下: 1、异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆----直行车辆 由西向而来去往南向的车辆----右转车辆 由东向而来去往...----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
一、项目需求
模拟实现十字路口的交通灯管理系统逻辑,具体要求如下:
1、异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆----直行车辆
由西向而来去往南向的车辆----右转车辆
由东向而来去往南向的车辆----左转车辆
。。。。。。。。。。
2、信号灯忽略黄灯,只考虑红灯和绿灯。
3、应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
4、具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
5、每辆车通过路口时间为1秒(提示:可通过线程sleep的方式模拟)。
6、随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
7、不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。二、需求分析
总共有12条路线,为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的4条路线的控制灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,可以归为4组,所以,程序只需考虑图中标注了数字号的4条路线的控制灯的切换顺序,这4条路线相反方向的路线的控制灯跟随这4条路线切换,不必额外考虑。
面向对象的分析与设计:
a) 每条路线上都会出现多辆车,路线上要随机增加新的车,在灯绿期间还要每秒钟减少一辆车。
1设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。2每条路线上随机增加新的车辆,增加到一个集合中保存。
3每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
b) 每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿。
1设计一个Lamp类来表示一个交通灯,每个交通灯都维护一个状态:亮(绿)或不亮(红),每个交通灯要有变亮和变黑的方法,并且能返回自己的亮黑状态。
2总共有12条路线,所以,系统中总共要产生12个交通灯。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理方式,故假设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑。
3除了右拐弯方向的其他8条路线的灯,它们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组中各取出一个灯,对这4个灯依次轮询变亮,与这4个灯方向对应的灯则随之一同变化,因此Lamp类中要有一个变量来记住自己相反方向的灯,在一个Lamp对象的变亮和变黑方法中,将对应方向的灯也变亮和变黑。每个灯变黑时,都伴随者下一个灯的变亮,Lamp类中还用一个变量来记住自己的下一个灯。
4无论在程序的什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以Lamp类改用枚举来做显然具有很大的方便性,永远都只有代表12个方向的灯的实例对象。
5设计一个LampController类,它定时让当前的绿灯变红。
(我们初步设想一下有哪些对象:红绿灯,红绿灯的控制系统,汽车,路线。汽车看到自己所在路线对应的灯绿了就穿过路口吗?不是,还需要看其前面是否有车,看前面是否有车,该问哪个对象呢?该问路,路中存储着车辆的集合,显然路上就应该有增加车辆和减少车辆的方法了。再看题目,我们这里并不要体现车辆移动的过程,只是捕捉出车辆穿过路口的过程,也就是捕捉路上减少一辆车的过程,所以,这个车并不需要单独设计成为一个对象,用一个字符串表示就可以了。
面向对象设计把握一个重要的经验:谁拥有数据,谁就对外提供操作这些数据的方法。再牢牢掌握几个典型的案例就可以了:人在黑板上画圆,列车司机紧急刹车,售货员统计收获小票的金额,你把门关上了等。
学员的两个面向对象的面试题,用面向对象的方式设计如下情景。
“两块石头磨成一把石刀,石刀可以砍树,砍成木材,木材做成椅子”,
“球从一根绳子的一段移动到了另一端”,)三、代码实现
一)Road类的编写:
分析:
每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。
在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车(用一个¡°路线名_id¡±形式的字符串进行表示)。
在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车辆集合和将集合中的第一辆车移除掉。(在讲Road对象的定时器代码时,因为开始阶段还没有设计Lamp类,所以,检查该方向上的灯是否为绿的代码暂时先采用短路方式)
代码实现:
package com.sohu.interview.test; import java.util.List; import java.util.ArrayList; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /* * @author zhzhl29290029 */ public class Road { //定义一个集合,用于存储车辆和移除车辆 private List<String> vechicles = new ArrayList<String>(); //依据路名产生车名 private String name = null; public Road(String name){ this.name = name; //模拟车辆不断随机上路的过程 //使用线程池,通过产生单个线程的方法,创建一个线程池 ExecutorService pool = Executors.newSingleThreadScheduledExecutor(); //调用execute方法,可向线程池提交一个任务,让池中的线程执行任务 pool.execute(new Runnable(){ //执行的任务,随机产生车,并加入集合 public void run() { for(int i=1;i<1000;i++){ try { //每个10秒随机产生一辆车 Thread.sleep((new Random().nextInt(10)+1)*1000); } catch (InterruptedException e) { e.printStackTrace(); } vechicles.add(Road.this.name + "_" + i); } } }); //每隔一秒检查对应的灯是否为绿,是则放行 //产生一个单线程,创建定时器 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate( //执行具体的任务 new Runnable(){ public void run(){ //判断路上是否有车,有则进行相应的操作 if(vechicles.size()>0){ //每隔1秒让车通行,通行前要先判断灯是否亮,亮了才能通行,即从集合中移除 boolean lighted = Lamp.valueOf(Road.this.name).isLighted(); if(lighted) System.out.println(vechicles.remove(0) + " is traversing !"); } } }, 1, 1, TimeUnit.SECONDS ); } }
二)Lamp类的编写:
分析:
系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,综合这些因素,将Lamp类用java5中的枚举形式定义更为简单。
每个Lamp对象中的亮黑状态用lighted变量表示,选用S2N、S2W、E2W、E2N这四个方向上的Lamp对象依次轮询变亮,Lamp对象中还要有一个oppositeLampName变量来表示它们相反方向的灯,再用一个nextLampName变量来表示此灯变亮后的下一个变亮的灯。这三个变量用构造方法的形式进行赋值,因为枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用,所以,相反方向和下一个方向的灯用字符串形式表示。
增加让Lamp变亮和变黑的方法:light和blackOut,对于S2N、S2W、E2W、E2N这四个方向上的Lamp对象,这两个方法内部要让相反方向的灯随之变亮和变黑,blackOut方法还要让下一个灯变亮。
除了S2N、S2W、E2W、E2N这四个方向上的Lamp对象之外,其他方向上的Lamp对象的nextLampName和oppositeLampName属性设置为null即可,并且S2N、S2W、E2W、E2N这四个方向上的Lamp对象的nextLampName和oppositeLampName属性必须设置为null,以便防止light和blackOut进入死循环。
代码实现:package com.sohu.interview.test; /* * @author zhzhl29290029 */ public enum Lamp { S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",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 String oppsiteLampName; //定义当前灯的下一个灯,当前灯亮,下个灯不亮 private String nextLampName; //标记当前灯是否为绿灯(亮) private boolean lighted; //灯的判断是否亮的方法 public boolean isLighted(){ return lighted; } //构造方法,初始化对象 private Lamp(String oppsiteLampName,String nextLampName,boolean lighted){ this.oppsiteLampName = oppsiteLampName; this.nextLampName = nextLampName; this.lighted = lighted; } //当前灯变绿时,对应的灯也绿了 public void light(){ this.lighted = true; //当前灯变绿了,让对应的灯也变绿 if(oppsiteLampName!=null) Lamp.valueOf(oppsiteLampName).light(); //调试用 System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!"); } //当前灯变红了,对应灯也要变红,并启动下个灯变绿 public Lamp blackOut(){ this.lighted = false; if(oppsiteLampName!=null) Lamp.valueOf(oppsiteLampName).blackOut(); Lamp nextLamp = null; if(nextLampName!=null){ nextLamp = Lamp.valueOf(nextLampName); //调试用 System.out.println("绿灯从" + name() +"切换为" + nextLampName); nextLamp.light(); } return nextLamp; } }
三)LampContriller类的编写:
分析:交通灯控制器
整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。
LampController构造方法中要设定第一个为绿的灯。
LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。
package com.sohu.interview.test; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /* * @author zhzhl29290029 */ public class LampController { //定义当前灯 private Lamp currentLamp; //构造函数,指定当前灯并让其为绿 public LampController(){ currentLamp = Lamp.S2N; currentLamp.light(); //每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿 //创建定时器 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); //通过定时器的方法,创建线程 timer.scheduleAtFixedRate( new Runnable() { public void run() { //让当前灯变红,并返回下一个灯 System.out.println("coming..."); currentLamp = currentLamp.blackOut(); } }, 10, 10, TimeUnit.SECONDS); } }
四)MainClass类的编写
用for循环创建出代表12条路线的对象。
接着再获得LampController对象并调用其start方法。
(String [] directions = {"S2N","N2S","S2W","N2E","E2W","W2E",
"E2S","W2N","S2W","N2W","E2N","W2S"};刚开始把上面的倒数第4个元素写错了(应该写成S2E),所以总是只看到5个方向上有车通过的情况。)package com.sohu.interview.test; public class TraffTest { public static void main(String[] args) { //将12个方向上的路线存入一个数组 String[] directions = new String[]{ "S2N","S2W","E2W","E2S", "N2S","N2E","W2E","W2N", "S2E","E2N","N2W","W2S" }; //通过循环创建12个对象,即12条路线 for(int i=0;i<directions.length;i++){ new Road(directions[i]); } //产生整个交通灯系统 new LampController(); } }
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
-
张孝祥老师交通灯管理系统的学习笔记 在做一件事时,首先要明确要达到什么效果。有目的性。就软件项目来说...
2014-05-23 15:42:57就软件项目来说就是,首先要看的就是项目所提出的项目要求。做项目,不急于写代码,先把问题搞清楚,把要求分析明白,对象分析清楚。然后再去写代码,思路就会很清晰。 下面看一下交通灯管理系统。 要求: 异步...张孝祥老师交通灯管理系统的学习笔记
在做一件事时,首先要明确要达到什么效果。有目的性。就软件项目来说就是,首先要看的就是项目所提出的项目要求。做项目,不急于写代码,先把问题搞清楚,把要求分析明白,对象分析清楚。然后再去写代码,思路就会很清晰。
下面看一下交通灯管理系统。
要求:
异步随机生成按照各个路线行驶的车辆。
例如:
由南向而来去往北向的车辆 ---- 直行车辆
由西向而来去往南向的车辆 ---- 右转车辆
由东向而来去往南向的车辆 ---- 左转车辆
。。。 。。。
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
看完要求就需要开始分析。
首先画图分析总共有多少条路线,看图:
张孝祥老师交通灯管理系统的学习笔记
总共有12条路线
为了统一编程模型,可以假设每条路线都有一个红绿灯对其进行控制,右转弯的灯可以假设称为常绿状态,另外,其他的8条线路是两两成对的,
为4组,所以,程序只需要考虑途中标注了数字号的4条路线的控制灯的切换顺序,这四条路线相反方向的路线的控制灯跟随这4条路线切换,不必另外考虑。
然后进行面向对象的分析与设计。
首先想到路,12条路都有名字,路上有车。所以应有Road类,类中有name和vechicles属性。车随时上路,用缓冲池模拟车上路,然后每秒检查等是否绿,
绿了就放一辆车,用缓冲池的调度。
其次是信号灯,12条线路12个灯,右转弯可以设置为常亮的不用考虑。其它8个两两相对可以设为四组。灯的设计用枚举来实现,每一个枚举元素都包含相对
方向的灯opposite,下一个亮的next和灯是否为绿lighted等三个属性。light()方法,某个灯变绿时,相对的灯也要变绿,blackout()方法,某个灯变红时
相应的灯也变红,同时下一个灯变绿。然后再构建一个灯的控制类。其中有一个当前等currentLamp属性和一个灯控制方法lampController().
上面几个类做好了在写主函数。主函数内部创建12条路,启动灯控制。项目分析就完成了。
以上是学习了张孝祥老师的视频后,所总结。张老师的视频所教给我们的不止是一个交通灯项目,更多的是一种编程的思想,一种对学习和工作的态度。
-
黑马程序员---交通灯管理系统项目总结
2013-07-09 19:10:50模拟实现十字路口的交通灯管理系统逻辑,具体要求如下: 异步随机生成按照各个路线行驶的车辆. 例如:由南向而来去往北向的车辆----直行车辆 由西向而来去往南向的车辆----右转车辆 由东向而来去往南向的车辆--...------- android培训、java培训、期待与您交流! ----------
模拟实现十字路口的交通灯管理系统逻辑,具体要求如下:
异步随机生成按照各个路线行驶的车辆.
例如:由南向而来去往北向的车辆----直行车辆
由西向而来去往南向的车辆----右转车辆
由东向而来去往南向的车辆----左转车辆
…………….
信号灯忽略黄灯,只考虑红灯和绿灯.
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制.
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同.不考虑特殊情况下的控制逻辑.
注: 南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆后放行左转车辆.
每辆车通过路口时间为1秒(提示: 可通过线程Sleep 的方式模拟).
随机生成车辆时间间隔以及红绿灯交换时时间间隔自定,可以设置.
不要求实现Gull,只考虑系统逻辑实现,可通过log 方式展现程序运行结果.
交通灯系统的项目:
在项目开发中,其实是以不变应万变。例如,有人在黑板上画圆。就是以黑板这个不变的事物,来作为基准。然后在黑板上选取一个点的横坐标与纵坐标来画圆。而对于小球在绳子上移动问题来说,绳子就是不变的东西,而以绳子上的基准点来表示小球的移动。在用两块石头磨成刀,刀来砍树,树砍成木材,木材做成椅子。因此以刀加工厂来调用生成刀的方法。中间使用石头。而木材为石刀有砍树这个功能。椅子加工厂则能运用材料来制作椅子。
在交通灯这个项目中,不变的只有路。一个十字路口,每条路都向除自己之外的三条路行驶。因此,有十二条路可以走。每条路与其相反方向的灯应该一样。向右拐弯应该是永远绿灯的。而向左拐则应在直走之后。路灯只考虑红绿二色。
在路,灯,以及灯控制器三者来说,路上可以行使车辆,因此会产生一个生成车的方法。路灯则是显示走向。路灯控制器则是用来真正控制路面车辆行驶的。另外,有一个main()程序,用来调用路,灯,已经灯控制器三者的类以及方法。
对题目分析如右图:
由图可以看出:一个十字路口有12条行车线路.分别是: S2N,S2W,S2E . E2W,E2S,E2N . N2S,N2E,N2W . W2E,W2N,W2S每个方向的车辆有三种行驶路线: 左转,右转和直行.因为右转不考虑交通灯是否为绿灯,可忽略考虑.这样考虑的因素有八条路线: 每个路口的直行和左转.对绿灯的分析:每个路口的绿灯,先控制直行方向,直行的车辆通过后,为该路口左转方向车辆通过.最后绿灯控制该路口垂直方向的车辆.确定需要创建的对象:
12条路线也就对应12条线路对象,在每条路线上,车源源不断的不定时开来.如果当前路线的灯为绿灯,则车每秒开走一辆.
12条线路就对应12个灯对象,当一个路线的灯为绿灯时,它相反方向的灯也变绿灯(直行与直行,左转与左转),这种依次变绿的过程,是按一定顺序的,所以可以用一个枚举来定义,这12个灯,每个灯对应三个参数,它的相反方向的灯,它的下一个灯,以及它的红绿状态.
这12个灯,需要一个控制器,控制将灯变绿,隔多长时间再将它变红,右转的四个灯是常绿状态,不需要控制,剩余的八个灯,只需要控制四个灯: S2N,S2W,W2E,W2N即可,它的相反方向的灯的红绿状态在同一时间和它们的红绿状态一样.
最后需要创建一个调度类,创建控制器对象,让控制器开始控制交通灯的红绿交换,并启动上面的12条路对象,让上面的车根据控制器所控制的当前路线灯的红绿状态."走走停停".
代码实现:
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(); } // TODO Auto-generated method stub }
------- android培训、java培训、期待与您交流! ----------
-
黑马程序员_第九天_项目(一)交通灯管理系统
2011-12-27 21:17:14交通灯是我们日常生活中总能看到的,所以这样的系统让我们来具体分析它的需求应该不是很难,而这道面试题要求我们模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1.异步随机生成按照各个路线行驶的车辆。...---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
交通灯是我们日常生活中总能看到的,所以这样的系统让我们来具体分析它的需求应该不是很难,而这道面试题要求我们模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
1.异步随机生成按照各个路线行驶的车辆。例如:直行、右转、左转车辆。
2.信号灯忽略黄灯,只考虑红灯和绿灯。3.应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
4.具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
5.每辆车通过路口时间为1秒,可通过线程Sleep的方式模拟。
6.随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
7.不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。需求尽管明确,但要具体实现起来,头绪还是很多。为了帮助我们更好地理解和分析问题,
老师在视频讲解中给我们画了一幅图:
由图可知,每个方向上有一个灯,每个灯有三个方向,即直行、左拐、右转弯三个方向,总共有12个方向,定义灯元素Lamp,故而由枚举类型表示:
public enum Lamp {
/*每个枚举元素各表示一个方向的控制灯*/
S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",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 opposite;
/*当前灯变红时下一个变绿的灯*/
private String next;
public boolean isLighted(){
return lighted;
}
构造初始化函数:
private Lamp(String opposite,String next,boolean lighted){
this.opposite = opposite;
this.next = next;
this.lighted = lighted;
}
正向和反向一致:(绿灯情况)/**
* 某个灯变绿时,它对应方向的灯也要变绿
*/
public void light(){
this.lighted = true;
if(opposite != null){
Lamp.valueOf(opposite).light();
}
System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");
}
红灯情况,同时带出下一个灯的变灯情况:/**
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>
* 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿
* @return 下一个要变绿的灯
*/
public Lamp blackOut(){
this.lighted = false;
if(opposite != null){
Lamp.valueOf(opposite).blackOut();
}
Lamp nextLamp= null;
if(next != null){
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从" + name() + "-------->切换为" + next);
nextLamp.light();
}
return nextLamp;
}
LampController类,为交通灯控制类,具体有以下功能:
整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。
LampController构造方法中要设定第一个为绿的灯。
LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。
关键代码实现:
public LampController(){
//刚开始让由南向北的灯变绿;
currentLamp = Lamp.S2N;
currentLamp.light();
/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
System.out.println("来啊");
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
每条路线上随机增加新的车辆,增加到一个集合中保存。
每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
相应代码如下:
//模拟车辆不断随机上路的过程
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable(){
public void run(){
for(int i=1;i<1000;i++){
try {
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
vechicles.add(Road.this.name + "_" + i);
}
}
});
//每隔一秒检查对应的灯是否为绿,是则放行一辆车
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
if(vechicles.size()>0){
boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
if(lighted){
System.out.println(vechicles.remove(0) + " is traversing !");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
最后编写MainClass类,调用上述方法:
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();
}
以上是交通灯系统的整个过程,内容涉及多线程、面向对象、枚举等综合知识的考查。通过这道面试题,使我意识到无论做多么大的项目都要有扎实的基本功和良好的编程习惯,而我们现在所学的java se就是最好的证明。 -
交通灯管理系统
2011-07-27 16:52:14项目要求: 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 ... -
交通灯管理系
2014-07-25 15:00:30模拟实现十字路口的交通灯管理系统逻辑,具体要求如下: 1、异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆----直行车辆 由西向而来去往南向的车辆----右转车辆 由东向而来去往南向的... -
java学习之交通灯系统
2012-06-30 09:17:42交通灯项目需求如下: 1. 要求模拟一个十字路口的交通灯控制系统,具体要求如下: 2. 用程序模拟出各个路线上汽车奔跑的过程; 3. 只考虑绿色和红色信号灯,忽略黄色信号灯; 4. 只考虑左转信号灯,不用考虑... -
java模拟交通信号灯_java 多线程交通信号灯模拟过程详解
2021-02-26 09:41:46这学期我们java课程的课程设计项目----交通信号灯的线程设计实验目的:多线程设计,同步机制题意 设计一个交通信号灯类:变量:位置、颜色(红、黄、绿)、显示时间(秒)。方法:切换信号灯。创建并启动两个线程(东西向... -
张老师交通灯分析
2014-09-18 10:47:13就软件项目来说就是,首先要看的就是项目所提出的项目要求。做项目,不急于写代码,先把问题搞清楚,把要求分析明白,对象分析清楚。然后再去写代码,思路就会很清晰。 下面看一下交通灯管理系统。 要求: ... -
PLC实验:十字路口交通灯控制
2020-12-16 20:47:10实验项目名称: 十字路口交通灯控制 一、面板图 二、实验控制要求 二、端口分配 四、实验程序梯形图 -
08 交通灯管理系统
2014-03-26 12:14:05笔者观看了张老师关于交通灯管理系统的视频讲解,按照要求自己重新编写了程序。 1. 项目需求 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: (1)异步随机生成按照各个路线行驶的车辆。 例如: 由南向而... -
张孝祥交通灯管理系统
2012-11-17 09:55:35就软件项目来说就是,首先要看的就是项目所提出的项目要求。做项目,不急于写代码,先把问题搞清楚,把要求分析明白,对象分析清楚。然后再去写代码,思路就会很清晰。 下面看一下交通灯管理系统。 要求: 异步... -
89C51单片机技术设计交通灯
2020-06-27 10:13:27结合89C51单片机技术设计一个实用的交通灯,要求应用8255和8254芯片计数码显示和LED灯。 三、效果展示 四、文档链接 文档中包括Proteus设计、汇编代码。 说明:该项目数码管显示有一些问题,大... -
Java-交通灯管理系统
2012-12-02 09:59:40项目要求如下 交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的... -
java之交通灯管理系统
2013-06-20 20:31:49项目要求:模拟实现十字路口的交通灯管理系统逻辑 具体需求如下: 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而... -
设计“十字路口交通灯管理系统”
2017-04-25 18:39:00设计“十字路口交通灯管理系统” 项目:一条主干道,一条乡间公路。组成十字路口,要求优先保证主干道通行。 设计要求: (1) 有MR(主红)、MY(主黄)、MG(主绿)、CR(乡红)、CY(乡黄)、CG(乡绿)六盏... -
多线程模拟交通灯管理系统
2014-07-24 00:40:49项目需求:模拟实现十字路口的交通灯管理系统逻辑,要求如下: 异步随机生成按照各个路线行驶的车辆,例如由北向南行驶的车辆、由东向南行驶的车辆。信号灯忽略黄灯,只考虑红灯和绿灯的情况。左转受信号灯... -
基于RTX51实时操作系统的交通灯控制系统的设计
2021-01-19 19:04:000 引言 一个高效的单片机智能控制系统, ...道路交通灯是常见的一种多任务控制系统, 本文以此为例, 详细阐述了 51嵌入式实时操作系统 RTX51开发软件的方法和步骤。 1 系统硬件电路设计 交通信号灯控制系统主 -
8051单片机Proteus仿真丁字路口交通灯
2020-07-06 21:40:33这个课程设计是我花啦好多时间做出来的心血,是丁字路口的具体实现,考虑实际项目的成本问题,一共使用四个单片机(老师要求)。项目可以正常的运行,实在是良心的计算机妹妹,把我的项目,代码,课设的报告,答辩的... -
黑马程序员-java基础 交通灯系统
2012-06-16 16:07:19项目要求 交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向 -
黑马程序员_交通灯管理系统
2014-07-22 21:29:03项目要求: 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: Ø 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转... -
黑马程序员_Java_交通灯管理系统
2014-06-18 13:25:48交通灯管理系统的项目需求 模拟实现十字路口的交通灯管理系统逻辑,具体要求如下: 1. 异步随机生成按照各个路线 例如 : 由南向而来去往北向的车辆---执行车辆, 由西向而来去往南向的... -
黑马程序员-交通灯管理系统
2013-06-06 17:52:04---------------------ASP.Net+Android+IO开发S、... 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1.异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行 -
java 多线程交通信号灯模拟
2018-06-20 10:58:17这学期我们java课程的课程设计项目----交通信号灯的线程设计1) 实验目的:多线程设计,同步机制2) 题意 设计一个交通信号灯类:(1) 变量:位置、颜色(红、黄、绿)、显示时间(秒)。(2) 方法:切换信号灯。... -
黑马程序员_二十四 【交通灯管理系统】
2013-07-05 19:47:04--------------------- android培训、java培训、java学习型技术博客、期待与您交流!...项目要求: 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1.异步随机生成按照各个路线行驶的车辆。 -
多线程实战(一) : 交通灯管理系统
2017-07-30 15:59:00项目要求: 模拟实现十字路口的交通灯管理系统逻辑。详细需求例如以下: 1. 异步随机生成依照各个路线行驶的车辆。 比如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆... -
单片机与DSP中的基于RTX51实时操作系统的交通灯控制系统的设计
2020-11-04 02:03:470 引言 一个高效的单片机智能控制系统, ...道路交通灯是最常见的一种多任务控制系统, 本文以此为例, 详细阐述了 51嵌入式实时操作系统 RTX51开发软件的方法和步骤。 1 系统硬件电路设计 交通信号灯控制系统 -
黑马程序员--交通灯管理系统
2013-04-29 01:38:06模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1.异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由... -
黑马程序员_7k面试题之交通灯管理系统
2013-12-26 12:07:10项目名称:交通灯管理系统 项目内容要求: 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的...