黑马程序员------交通灯管理系统
来源:互联网 发布:oracl数据库日志文件 编辑:程序博客网 时间:2024/05/09 21:02
android培训、java培训、
交通灯管理系统
交通灯管理系统需要实现功能,模拟每条路上随机产生车辆,12个方向行驶的车辆,
依据交通灯的变化通行或停止。每个方向的交通灯每隔相同的时间由红变绿或由绿变红。
此系统主要需要两个对象,一个是路对象,一个是灯对象。
路对象需要实现方法:1、随机间隔一段时间在某条路上产生车辆。
2、每隔1秒查看一次该条路上的灯是否为绿灯,如果是绿灯则
移除在此条路上等待通过的第一辆车。
灯对象需要实现的方法:1、总共有向12个方向行驶的车辆,所以需要用枚举定义控制
12个方向的灯。因为向右拐弯的车辆可以随意通行,所以
向右拐弯的车辆的控制灯始终是绿灯,因为相对应方向行
驶的车辆相互不受影响,所以灯的红或绿是一样的。
2、灯有变绿和变红的方法,灯变红时需要返回它的下一个灯,
以便保持循环将灯变绿或变红。
同时还需要一个灯控制器,控制每个方向的灯定时变化。
具体实现需要4个类:Road类,new对象时需要传入方向变量,以便接受相同方向的灯的控制。
Lamp类。
LampController类。
MainClass类。
实现代码如下:
Road类public class Road { private List<String> vechicles = new ArrayList<String>(); private String name; 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) {// TODO Auto-generated catch blocke.printStackTrace();}vechicles.add(Road.this.name+"--"+i); } } }); //定时查看此路是否为绿灯。 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate(new Runnable(){ public void run(){ if(vechicles.size()>0){ boolean lamp = Lamp.valueOf(Road.this.name).isLighted(); if(lamp) System.out.println(vechicles.remove(0)+"已过路口"); } } } , 1, 1, TimeUnit.SECONDS); }}
Lamp类public enum Lamp { //通过枚举列出12个方向的灯,并记录其对应、下一个灯和其本身是否为绿,初始默认都为红。 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),N2W(null,null,true),E2N(null,null,true),W2S(null,null,true); private boolean lighted; private String opposite; private String next; //private boolean isLight; private Lamp(String opposite,String next,boolean lighted){ this.lighted = lighted; this.next = next; this.opposite = opposite; } public boolean isLighted(){ return lighted; } public void light(){ this.lighted = true; if(opposite!=null){ Lamp.valueOf(opposite).light(); } System.out.println(name()+"是绿灯,下面有六条路可以通行"); } 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(this.name()+"变为红灯"+next+"变为绿灯"); nextLamp.light(); } return nextLamp; }}
LampController类public class LampController { private Lamp currentLamp; public LampController(){ //在构造函数中将S2N方向的灯初始为绿灯。 currentLamp = Lamp.S2N; currentLamp.light(); //创建一个定时器线程,每隔10秒将路灯变换一次。 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1); timer.scheduleAtFixedRate(new Runnable(){ public void run(){ //通过变量currentLamp记住当前的绿灯。 currentLamp = currentLamp.blackOut(); System.out.println("已过十秒,换灯"); } }, 10, 10,TimeUnit.SECONDS); }}
MainClass类public static void main(String[] args) { //定义一个方向表格,通过循环分别new出每个方向的路的对象。 String[] driections = {"S2N","S2W","E2W","E2S", "N2S","N2E","W2E","W2N", "S2E","N2W","E2N","W2S"}; for(int i=0;i<driections.length;i++){ new Road(driections[i]); } //开启路灯控制器。 new LampController();}
运行结果如下:
N2W--3已过路口
E2N--4已过路口
S2W变为红灯E2W变为绿灯
W2E是绿灯,下面有六条路可以通行
E2W是绿灯,下面有六条路可以通行
已过十秒,换灯
E2W--1已过路口
W2E--1已过路口
E2W--2已过路口
W2E--2已过路口
S2E--4已过路口
S2E--5已过路口
W2S--5已过路口
E2W--3已过路口
W2E--3已过路口
N2W--4已过路口
W2S--6已过路口
S2E--6已过路口
S2E--7已过路口
E2N--5已过路口
E2W变为红灯E2S变为绿灯
W2N是绿灯,下面有六条路可以通行
E2S是绿灯,下面有六条路可以通行
已过十秒,换灯
E2S--1已过路口
W2N--1已过路口
- 《黑马程序员》交通灯管理系统
- 黑马程序员----交通灯管理系统
- <黑马程序员>交通灯管理系统
- 【黑马程序员】交通灯管理系统
- 黑马程序员 交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员--交通灯管理系统
- 《黑马程序员》交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员:交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员 交通灯管理系统
- 黑马程序员-交通灯管理系统
- 黑马程序员-交通灯管理系统
- 黑马程序员-------交通灯管理系统
- 黑马程序员--交通灯管理系统
- 黑马程序员-交通灯管理系统
- PHP实现单例模式
- 求助:关于淘宝商品详情数据的抓取问题
- 25个增强iOS应用程序性能的提示和技巧
- Objective-C 01
- linux下的基本命令
- 黑马程序员------交通灯管理系统
- mysql建表时engine=innodb和engine=myisam的区别
- 结构体定义 typedef struct 用法详解和用法小结
- 销售为什么爱“撒谎”
- 六大视频网站播放清晰度比较(系列二)——谁家的电影、综艺节目更清晰?
- 关于C#中的ref和out关键字
- 过学习 overfitting
- 获取文件最后修改时间的VC代码
- linux下解压命令大全