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

来源:互联网 发布:菠萝饭官方软件 编辑:程序博客网 时间:2024/04/30 20:18

交通灯管理系统

----------------------- android培训、java培训、java高新技术博客、期待与您交流! -------------------------

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

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

    例如:

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

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

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

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

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

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

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

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

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

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

二, 根据需求结合面向对象思想,抽象出的三个对象为:路线,交通灯,交通灯控制器.

     (1)交通线路图如下表示


 

 (2)Road路线类(路线记录的是录像上的车)  

1 每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。

 2在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车(用一个“路线名_id”形  式的字符串进行表示)。

3 在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车辆集合和将集合中的第一辆车移除掉。

package com.heima.biji.interview.traffic;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;/** * 编写Road类中模拟汽车上路: * 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。 * 每条路线上随机增加新的车辆,增加到一个集合中保存。 * 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。 * */public class Road {//定义一个汽车集合数组private List<String> vechicles = new ArrayList<String>();//定义List面向接口编程//定义变量路的名字private String name = null;//定义路的构造方法public Road(String name) {this.name = name;//模拟车辆不断随机上路的过程ExecutorService pool = Executors.newSingleThreadExecutor();//new一个单独的线程池pool.execute(new Runnable(){@Overridepublic void run(){for(int i=1;i<1000;i++){try {Thread.sleep((new Random().nextInt(10) + 1) * 1000);//严谨写法:定义一随机值(1到10秒)内出现一辆车 返回值是1-9,所以要加上1,才能是1-10,乘以1000,是毫秒变秒} catch (Exception 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 = true;//if(lighted=true)//啰嗦,boolean已经定义了ture,直接用即可,不用再判断是否trueif(lighted) {System.out.println(vechicles.remove(0)+"is traversing!");//的到正在被取走的返回值}}}},1, 1,TimeUnit.SECONDS);//定义定量单位秒}}

  (3)Lamp交通灯类

 1系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,综合这些因素,将Lamp类用java5中的枚举形式定义更为简单。

 2每个Lamp对象中的亮黑状态用lighted变量表示,选用S2N、S2W、E2W、E2N这四个方向上的Lamp对象依次轮询变亮

3增加让Lamp变亮和变黑的方法:light和blackOut
4除了S2N、S2W、E2W、E2N这四个方向上的Lamp对象之外,其他方向上的Lamp对象的nextLampName和oppositeLampName属性设置为null即可,并且S2N、S2W、E2W、E2N这四个方向上的Lamp对象nextLampName和oppositeLampName属性必须设置为null,以便防止light和blackOut进入死循环。
package com.heima.biji.interview.traffic;/** * 每个Lamp元素代表一个方向上的灯,总共有12个方向,所有总共有12个Lamp元素。 * 有如下一些方向上的灯,每两个形成一组,一组灯同时变绿或变红,所以, * 程序代码只需要控制每组灯中的一个灯即可: * s2n,n2s     * s2w,n2e * e2w,w2e * e2s,w2n * s2e,n2w * e2n,w2s * 上面最后两行的灯是虚拟的,由于从南向东和从西向北、以及它们的对应方向不受红绿灯的控制, * 所以,可以假想它们总是绿灯。 * *//**/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 Lamp(String opposite,String next,boolean lighted){this.opposite = opposite;this.next = next;this.lighted = lighted;}/*当前灯是否为绿*/private boolean lighted;/*与当前灯同时为绿的对应方向*/private String opposite;/*当前灯变红时下一个变绿的灯*/private String next;public boolean isLighted(){return lighted;}/** * 某个灯变绿时,它对应方向的灯也要变绿 */public void light(){this.lighted = true;if(opposite != null){Lamp.valueOf(opposite).light();}System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");}/** * 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿 * @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;}}

  (4)LampController类

1整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例

2LampController构造方法中要设定第一个为绿的灯

3LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。

package com.heima.biji.interview.traffic;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.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);}}

(5)MainClass主类

package com.heima.biji.interview.traffic;public class 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();}}



----------------------- android培训、java培训、java高新技术博客、期待与您交流! -------------------------

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 飞猪f2领了万豪银卡没住怎么办 机械键盘摁键冲突怎么办 玩游戏键盘没反应怎么办 玩枪战游戏头晕恶心怎么办 手机看视频不能横屏怎么办 苹果手机安全码忘记了怎么办 信用卡安全码忘记了怎么办 联想电脑管家阻止我安装软件怎么办 word恢复后打开乱码怎么办 苹果手机局域网也登陆不了怎么办 剑三账号冻结7天怎么办 荒野行动无缘无故被限制时间怎么办 电脑打游戏闪屏怎么办 微信下载出现数据包出错怎么办 安卓平板闪退怎么办 剑侠世界2出了1怎么办 苹果手机有木马病毒删除不了怎么办 苹果手机病毒了怎么办【解决方法】 苹果手机点击病毒链接怎么办 苹果手机有病毒啦怎么办 苹果7p反复重启怎么办 苹果手机屏幕触屏不灵怎么办 苹果手机屏翘起来了怎么办 苹果x手机触屏失灵怎么办 苹果7手机变成黑白屏怎么办 苹果手机屏不动了怎么办 苹果6老是卡屏怎么办 苹果x卡屏死机怎么办 苹果6死机卡屏怎么办 苹果手机主屏死机怎么办 苹果7手机卡屏死机怎么办 苹果6s卡死了怎么办 6s手机显示丢失锁定怎么办 酷比s9被root怎么办 垃圾清理把相片删除了怎么办 小米电脑怎么下载软件怎么办 华为手机pin码忘了怎么办 锁屏密码忘了怎么办 抖音停止运行了怎么办? 华为手机右下角有个小人怎么办 华为手机程序停止运行怎么办