交通灯管理系统
来源:互联网 发布:js onclick 传递参数 编辑:程序博客网 时间:2024/06/08 16:00
首先提取下这个问题的关键要素:交通灯,路,车。三者的一种关系是车可以认为是路的“元素”,车的通过和增加都是由路负责管理的。而每一个十字路口的放行与否,都是通过交通灯控制的。路和灯应该是归属的关系,一个十字路口“拥有”一个交通灯系统。
所以我们抽象交通灯这个类,因为向右是永远放行的,所以我们可以忽略向右的这条线路,而相反方向的灯的变化是完全相同的,所以可以抽象为一个管理系统,这样其实一个路口的交通等的状态就只有4种了,而且这四种同一时刻只有一个是放行的状态。
用枚举实现交通灯:
package traffic; public enum Lamp { NSStraight, NSTurn, EWStraight, EWTurn; private boolean green = false; public boolean isGreen() { return green; } public void lighteOn() { this.green = true; System.out.println(this.toString()); } public void lightOff(){ this.green = false; } Lamp nextLamp() { switch (this) { case NSStraight: lightOff(); NSTurn.lighteOn(); return NSTurn; case NSTurn: lightOff(); EWStraight.lighteOn(); return EWStraight; case EWStraight: lightOff(); EWTurn.lighteOn(); return EWTurn; case EWTurn: lightOff(); NSStraight.lighteOn(); return NSStraight; } return null; } @Override public String toString(){ switch (this) { case NSStraight: return "----------南北方向直行"; case NSTurn: return "----------南北方向左转"; case EWStraight: return "----------东西方向直行"; case EWTurn: return "----------东西方向左转"; } return null; } }
交通灯的轮换相对来说比较独立,和路的耦合不算大,每个路口可以独立于路配备一个交通灯,这里先用线程实现模拟交通灯的切换规则:
package traffic; public class LampControl implements Runnable{ Lamp NSStraight = Lamp.NSStraight; Lamp NSTurn = Lamp.NSTurn; Lamp EWStraight = Lamp.EWStraight; Lamp EWTurn = Lamp.EWTurn; Lamp currentLamp = NSStraight; public Lamp getCurrentLamp() { return currentLamp; } int StraightTime = 10000;//ms int TurnTime = 10000; @Override public void run() { currentLamp.lighteOn(); while(true){ try { Thread.sleep(StraightTime); currentLamp = currentLamp.nextLamp(); Thread.sleep(TurnTime); currentLamp = currentLamp.nextLamp(); Thread.sleep(StraightTime); currentLamp = currentLamp.nextLamp(); Thread.sleep(TurnTime); currentLamp = currentLamp.nextLamp(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
这样在主函数中可以通过独立的线程模拟单独的交通灯切换功能。
接下来模拟十字路口的车辆过往的展示,一个十字路口有一个交通灯系统,抛开向右自由行驶的路线,有8条行车路线,每条路线用一个集合存放这条路线上的车,适当的时候放行。
package traffic; import java.util.ArrayList; import java.util.List; public enum SingleRoad { NSRoad, SNRoad, NSLRoad, SNLRoad, EWRoad, WERoad, EWLRoad, WELRoad; int num = 1; List<Integer> list = new ArrayList<Integer>(); public void addCar() { this.list.add(num++); System.out.println(this.toString()+": "+num + "号车正在等待"); } public void passCar() { if(this.list.size()>0){ Integer i = this.list.remove(0); System.out.println(this.toString()+": "+ i + "号车正在过马路"); } } @Override public String toString() { switch (this) { case NSRoad: return "北向南"; case SNRoad: return "南向北"; case NSLRoad: return "北向南左"; case SNLRoad: return "南向北左"; case EWRoad: return "东向西"; case WERoad: return "西向东"; case EWLRoad: return "东向西左"; case WELRoad: return "西向东左"; } return null; } }
在创建一个Road类管理一个十字路口的情形,随机的往每条线路上增加车辆并等待,当这条线路的控制灯亮的时候,放行这条线路上的车。
package traffic; import java.util.ArrayList; import java.util.List; import java.util.Random; public class Road implements Runnable { LampControl lc = new LampControl(); List<SingleRoad> listRoads = new ArrayList<SingleRoad>(); SingleRoad NSRoad = SingleRoad.NSRoad; SingleRoad SNRoad = SingleRoad.SNRoad; SingleRoad NSLRoad = SingleRoad.NSLRoad; SingleRoad SNLRoad = SingleRoad.SNLRoad; SingleRoad EWRoad = SingleRoad.EWRoad; SingleRoad WERoad = SingleRoad.WERoad; SingleRoad EWLRoad = SingleRoad.EWLRoad; SingleRoad WELRoad = SingleRoad.WELRoad; public Road(LampControl lc) { this.lc = lc; listRoads.add(NSRoad); listRoads.add(NSLRoad); listRoads.add(SNRoad); listRoads.add(SNLRoad); listRoads.add(EWLRoad); listRoads.add(EWRoad); listRoads.add(WELRoad); listRoads.add(WERoad); } void method(){ while(true){ Lamp l = lc.getCurrentLamp(); switch (l) { case NSStraight: NSRoad.passCar(); SNRoad.passCar(); passTime(); break; case NSTurn: NSLRoad.passCar(); SNLRoad.passCar(); passTime(); break; case EWStraight: EWRoad.passCar(); WERoad.passCar(); passTime(); break; case EWTurn: EWLRoad.passCar(); WELRoad.passCar(); passTime(); break; } } } private void passTime(){ try { //一秒过一辆 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public void run() { while (true) { try { //1--3秒随机添加一辆车 Thread.sleep((new Random().nextInt(3) + 1) * 1000); } catch (InterruptedException e) { e.printStackTrace(); } int index = new Random().nextInt(8); SingleRoad sr = listRoads.get(index); sr.addCar(); } } }
这样当我们实际运行的时候就有三个线程了,一个线程专门负责灯的转换,一个线程专门负责车的添加,一个线程负责灯亮的时候车的放行。
public static void main(String[] args) { LampControl lc1 = new LampControl(); Road road = new Road(lc1); new Thread(lc1).start(); new Thread(road).start(); road.method(); }
- 交通灯管理系统
- 交通灯管理系统
- 交通灯管理系统笔记
- 交通灯管理系统
- 交通灯管理系统
- 交通灯管理系统
- 交通灯管理系统
- 交通灯管理系统
- 交通灯管理系统
- 交通灯管理系统项目
- 模拟交通灯管理系统
- 交通灯管理系统
- 交通灯管理系统
- java--交通灯管理系统
- 20110508交通灯管理系统
- 交通灯管理系统
- 交通灯管理系统
- 交通灯管理系统视频
- 数据连接、断开及操纵封装类SQLHelper
- android:backupAgent
- 计算机科学中最重要的32个算法
- windows下的PHP开发环境安装
- kD-tree 的C语言实现 带有史上最全的注释和解释
- 交通灯管理系统
- DELPHI下自定义包的作用,开发以及包文件的安装配置位置
- 安装Fcitx输入法
- 海量dml表的统计问题
- [Oracle] SQL*Loader 详细使用教程(1)- 总览
- 近期小结(2013.5.27~2013.6.23)
- delphi SysUtils单元详解
- java----IO流
- Delphi XE2 新增 System.Zip 单元,压缩和解压缩文件