黑马程序员_java学习笔记十一 交通灯管理系统

来源:互联网 发布:网络编程怎么学 编辑:程序博客网 时间:2024/04/30 08:34
---------------------- android培训、java培训、期待与您交流! ----------------------

交通灯管理系统:

一:模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
随机生成按照各个路线行驶的车辆;
例如:
由南而来去往北的车辆-----直行车辆
由西而来去往南的车辆-----右转车辆
由东而来去往南的车辆-----左转车辆
。。。
信号灯忽略黄灯,只考虑红灯和绿灯。
应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,(不考虑特殊情况)
每辆车通过路口时间为1秒。
随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

根据需求分析:

1.  总共的路线为12条,除去每个方向向右拐的路线,同时通车的路线为相反方向的两条,这样就将路线分为4组,对这四组路线的交通灯进行控制即可。

2.  因为灯的方向和数量是固定的,所以用一个枚举类来表示它。因项目需求不需要抽象车的对象。将路线和车结合,每条路线中装有车。

3.  写一个交通灯的控制类,对四组灯进行控制。

实现灯的枚举类:

package com.hncu.interview.traffic;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 flag){this.opposite = opposite ;this.next = next ;this.flag = flag ;}private String next = null ;private String opposite = null ;private boolean flag ;public boolean isLighted(){return flag ;}public void light(){this.flag = true ;if(opposite!=null){Lamp.valueOf(opposite).light() ;}System.out.println(name() + "方向的灯变绿了,你一共可以看到六个方向的车通过");}public Lamp red(){this.flag = false ;if(opposite!=null){Lamp.valueOf(opposite).red() ;}Lamp nextLamp = null ;if(next!=null){System.out.println("灯的方向由" + name() + "变为---" + next + "方向");nextLamp = Lamp.valueOf(next) ;nextLamp.light() ;}return nextLamp ;}}
实现路的类:

package com.hncu.interview.traffic;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class Road {List<String> vehicles = new ArrayList<String>() ;private String name ;public Road(String name){this.name = name ;Executors.newSingleThreadExecutor().execute(new Runnable() {@Overridepublic void run() {for(int i=1; i<500;i++){vehicles.add(Road.this.name + "方向的第" + i + "辆车") ;try {Thread.sleep((new Random().nextInt(10) + 1)*1000) ;} catch (InterruptedException e) {e.printStackTrace();}}}}) ;Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {if(vehicles.size()>0){boolean isLighted =Lamp.valueOf(Road.this.name).isLighted() ;if(isLighted){System.out.println(vehicles.remove(0) + "is travelli");;}}}}, 1, 1, TimeUnit.SECONDS) ;}}
实现控制的类:

package com.hncu.interview.traffic;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class Controller {private Lamp currentLamp = null ;public Controller(){currentLamp = Lamp.S2N ;currentLamp.light() ;Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {currentLamp = currentLamp.red() ;}}, 10, 10, TimeUnit.SECONDS) ;}}

启动类:

package com.hncu.interview.traffic;public class MainClass {public static void main(String[] args) {new Controller() ;String[] road = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"} ;for(int i=0;i<12;i++){new Road(road[i]) ;}}}


---------------------- android培训、java培训、期待与您交流! ----------------------
原创粉丝点击