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

来源:互联网 发布:qq群淘宝互刷是真的吗 编辑:程序博客网 时间:2024/05/17 23:33
                                                                                      -------android培训、java培训、期待与您交流! ----------


交通灯管理系统


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

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

    例如:

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

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

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

          。。

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

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

     

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

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

     

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

     

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

     

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

    分析:


  • 模似,十字路口
    1.有4条主路,南到北,北到南,西到东,东到西,
     主路分别产生,3个不同方向的车,向前,向左,向右的车,总共有12个方向

  • 当一条路上灯为绿灯时,此路上向前,和向左,向右的都可以行驶
    当一条路上灯为红灯时,此路上只能让,向右的车可以行驶

  • 灯为两组,南向北,北向南的灯为一组,
      西到东,东到西的为一组,
      
    一组灯为红灯,另一组则为绿灯。由LampController.java类控红,和绿




Road类:

package cn.com;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;public class Road {private List<String> vechicles = new ArrayList<String>();//一条路上来的车(向前,向左,向右的车)private String name =null;//路的名字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) {e.printStackTrace();}int rand=new Random().nextInt(3);String vechicle=null;switch (rand) {case 0:vechicle=Road.this.name + ",第" + i+"辆车,方向向前";break;case 1:vechicle=Road.this.name + ",第" + i+"辆车,方向向左";break;case 2:vechicle="无阻——"+Road.this.name + ",第" + i+"辆车,方向向右";break;}vechicles.add(vechicle);System.out.println(vechicle+"的车,要过十字路口");}}});//定时器每隔1秒,可以让车行驶,向左的,和向前的车,当绿灯是可通过,向右的车,不管红绿都能行ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public void run(){if(vechicles.size()>0){String str=Road.this.name.replaceAll("到","");str=str.replace('北', 'N');str=str.replace('东', 'E');str=str.replace('西', 'W');str=str.replace('南', 'S');boolean lighted = Lamp.valueOf(str).isLighted();String v=vechicles.get(0);if(v.substring(v.length()-1).equals("右")){//右转的车,红绿都行System.out.println("\t\t\t\t\t"+vechicles.remove(0) + "行驶走了 !");}else if(lighted){System.out.println("\t\t\t\t\t"+vechicles.remove(0) + "行驶走了 !");}}}},1,1,TimeUnit.SECONDS);}}

Lamp类:交通灯类

package cn.com;public enum Lamp {/* * 北到南,南到北为一组灯,同时红,同时绿  * 东到西,和西到东为一组灯,同时红,同时绿 *///N北 S南 W西 E东NS("SN","WE"),SN("NS","EW"),EW("WE","SN"),WE("EW","NS");public String toString(){switch (this) {case SN:return "南到北";case EW:return "东到西" ;case NS:return "北到南" ;case WE:return  "西到东";}return null;}private boolean lighted;//灯是红还是绿,以此为标private String opposite;private String nextRight;public boolean isLighted() {return lighted;}private Lamp(String opposite,String nextRigth) {this.opposite = opposite;this.nextRight=nextRigth;}public void light() {this.lighted = true;Lamp.valueOf(this.nextRight).lighted=false;Lamp oppositeLamp=Lamp.valueOf(opposite);oppositeLamp.lighted=true;Lamp.valueOf(oppositeLamp.nextRight).lighted=false;System.out.println("\t\t"+Lamp.valueOf(this.nextRight)+"开启红灯--"+Lamp.valueOf(oppositeLamp.nextRight)+"开启红灯\n"+"\t\t"+this+"开绿灯"+"----"+oppositeLamp+"开绿灯");}public void blackOut(){//一组灯红,对应一组灯变绿this.lighted = false;Lamp.valueOf(this.nextRight).lighted=true;Lamp oppositeLamp=Lamp.valueOf(opposite);oppositeLamp.lighted=false;Lamp.valueOf(oppositeLamp.nextRight).lighted=true;System.out.println("\t\t"+this+"开启红灯"+"--"+oppositeLamp+"开红灯"+"\n\t\t"+Lamp.valueOf(this.nextRight)+"开启绿灯----"+Lamp.valueOf(oppositeLamp.nextRight)+"开启绿灯\n");}}

LampController类:作为灯的控制器

package cn.com;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.SN;//第一个灯,南到北,就绿currentLamp.light();ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){public  void run(){if(currentLamp.isLighted())currentLamp.blackOut();elsecurrentLamp.light();}},10,10,TimeUnit.SECONDS);}}


MainRun类:运行测试类

package cn.com;public class MainRun {public static void main(String[] args) {String [] directions = new String[]{"南到北","北到南","西到东","东到西"};for(int i=0;i<directions.length;i++){new Road(directions[i]);}new LampController();}}




在面象对象时,

    让灯作为一个对象,当一个灯变红变绿时,其3个灯也变(相反的灯,颜色一样,左右的灯,颜色相反),这样所有灯,我们只要把一个灯做为对象,就控好了所有灯了。

,路做为一个对象,而车是由路产生的,一条路产3个方向的车,当然这有4条大路,

   3个方向的车,向前,向左的是要看绿灯才能过,而向右的,没有要求。

效果图:




原创粉丝点击