黑马程序员_张孝祥交通灯

交通灯管理系统

---------------------- android培训java培训、期待与您交流! ----------------------

 

模拟完成十字路口的交通灯管理系统逻辑思想。

 

需求分析与设计

一步随机生成按照各个路线形式的车辆

车辆经过十字路口的时候,无非就是直行,左转弯,有转弯。

所以:

从南往北的车辆------直行

从西往南的车辆-----右转弯

从东往南的车辆------左转弯

 

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

在此也不考虑人行过马路,只考虑车辆的行驶。

在这里只考虑左转弯的车辆控制信号灯,对右转弯的车辆不受信号灯的控制。

具体信号灯控制逻辑与现实生活中管理交通灯控制逻辑相同,不好驴特殊情况下的控制逻

辑。

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

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

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

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

 

设计:

因为在每条路线上都会有可能出现多辆车,在路线上要随机增加新的车辆,在灯绿时还要额每秒减少一辆车。

首先要设计一个表示路线的类,每个对象代表一条路线,在十字路口,有12条路线车辆可以通过,所以要产生12个路线的实例对象。

每条路线是行随机增加新的车辆,加到一个集合中保存起来。

每台哦路线每隔一秒都会坚持开展本路线的灯手否为绿,一个灯由绿变红时,应该将下一个方向的灯变为绿。

设计一个表示交通灯的类,每个交通灯都维护一个状态,亮(绿),或不亮(红),每个交通灯要有变亮和变黑的方法,而且能返回自己的亮黑状态。

总共有12条路线,所以,系统中总共要产生12个交通灯,右拐弯的路线本来就不受等的控制,但是为了让程序又用统一的处理方式,加上出游四个右拐弯的灯,只是这些灯为一只亮状态,也就是不会变黑。

车辆右拐弯方向的其他8条路线的灯,它们是两两成对的,,所以归为4组,在编程处理时,只要从这4组中个取出一个灯,对这4个灯依次变亮,与这4个灯方向对应的灯则随之变化,因此交通灯类中药在一个变亮来记住自己相反方向的灯,在一个交通类对象的变亮和变黑方法中国,将对应方向的灯也变亮和变黑,每个灯变黑是,都伴随的下一个灯的变黑,灯类中产生一个变黑又调用下一个灯

编码:

Road类。

    package csdn.heima.study.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;

/*

 *

 * 声明一个表示路线的类

 *在类中定义一个私有集合和一个成员变量

 *定义一个接收一个参数的构造方法

 *把这个接收到的参数赋给这个成员变量

 *创建线程池来生成在休息随机110秒后在某路线上增加车辆

 *创建定时器,在保证灯变绿时,过一秒后每隔1秒从路线上移除一辆车

 */

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<1000;i++){

                            try {

                                   //随机休息110秒钟

                                   Thread.sleep(new Random().nextInt(10)+1);

                            } catch (InterruptedException e) {

                                   // TODO Auto-generated catch block

                                   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=Lamp.valueOf(Road.this.name).isLighted();

                            if(lighted){

                                   //打印出从路线上移除的车辆

                                   System.out.println(vechicles.remove(0)+" is traversing !");

                                  

                            }

                     }

              }

       },

                     1,

                     1,

                     TimeUnit.SECONDS);

       }

}

 

Lamp

 

packagecsdn.heima.study..traffic;

/*

 * 声明一个枚举

 * 定义车辆所要行使的12个方向的实例对象

 * 定义一个无参构造方法和给每个对象定义构造方法,接收三个参数

 * 定义三个私有成员变量

 * 在定义用来判断是否是亮的方法和分别得变亮、变黑的方法

 */

publicenum Lamp {

    //定义12个实例对象的构造方法

    S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2S","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.lighted=lighted;

       this.next=next;

    }

   

    private Lamp(){}

   

    privatebooleanlighted;

    private String opposite;

    private String next;

   

    publicboolean isLighted(){

       returnlighted;

    }

   

    publicvoid light(){

       this.lighted=true;

       //判断路线所对应的灯

       if(opposite!=null){

           //调用变为绿灯的方法

           Lamp.valueOf(opposite).light();

    System.out.println(name()+" lamp is green, 下面总共应该有6个方向能看到汽车穿过");

       }

    }

    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;

    }

}

 

LampController

package csdn.heima.study..traffic;

 

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

/*

 * 定义一个交通灯的控制器类

 * 定义一个灯的成员变量表示当前的灯

 * 定义构造方法,把当前的灯设置为南到北并把它变绿

 * 创建一个定时器的实例对象来调用固定频率方法5秒后每隔5秒让当前灯变为红灯

 */

public class LampController {

 

       private Lamp currentLamp;

      

       public LampController(){

              currentLamp=Lamp.S2N;

              currentLamp.light();

             

       ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);

       timer.scheduleAtFixedRate(new Runnable(){

              public void run(){

                     //让当前的灯变成红灯

                     currentLamp=currentLamp.blackOut();

              }

       },

                     5,

                     5,

                     TimeUnit.SECONDS);

       }

}

 

MainClass

packagecsdn.heima.study..traffic;

/*

 * 定义一个执行交通管理的类,并能独立运行

 * mian方法内定义一个接收表示车辆行驶的12个方向参数

 * 使用循环不断创建路线对象

 * 最后创建交通控制器类直接运行

 */

publicclass MainClass {

 

    /**

     *@paramargs

     */

    publicstaticvoid main(String[] args) {

 

       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();

    }

 

}

测试:

测试结果:

S2N lamp is green, 下面总共应该有6个方向能看到汽车穿过

S2N_1 is traversing !

N2S_1 is traversing !

S2E_1 is traversing !

E2N_1 is traversing !

W2S_1 is traversing !

N2W_1 is traversing !

S2N_2 is traversing !

N2S_2 is traversing !

S2E_2 is traversing !

N2W_2 is traversing !

E2N_2 is traversing !

W2S_2 is traversing !

S2N_3 is traversing !

N2S_3 is traversing !

S2E_3 is traversing !

N2W_3 is traversing !

E2N_3 is traversing !

W2S_3 is traversing !

S2N_4 is traversing !

N2S_4 is traversing !

S2E_4 is traversing !

W2S_4 is traversing !

E2N_4 is traversing !

N2W_4 is traversing !

S2N_5 is traversing !

N2S_5 is traversing !

S2E_5 is traversing !

E2N_5 is traversing !

N2W_5 is traversing !

W2S_5 is traversing !

绿灯从S2N------->切换为S2W

S2W lamp is green, 下面总共应该有6个方向能看到汽车穿过

S2W_1 is traversing !

N2E_1 is traversing !

S2E_6 is traversing !

N2W_6 is traversing !

E2N_6 is traversing !

W2S_6 is traversing !

S2W_2 is traversing !

E2N_7 is traversing !

N2E_2 is traversing !

S2E_7 is traversing !

W2S_7 is traversing !

N2W_7 is traversing !

S2W_3 is traversing !

N2E_3 is traversing !

N2W_8 is traversing !

W2S_8 is traversing !

S2E_8 is traversing !

E2N_8 is traversing !

S2W_4 is traversing !

N2E_4 is traversing !

N2W_9 is traversing !

S2E_9 is traversing !

E2N_9 is traversing !

W2S_9 is traversing !

S2W_5 is traversing !

N2E_5 is traversing !

N2W_10 is traversing !

绿灯从S2W------->切换为E2W

E2W lamp is green, 下面总共应该有6个方向能看到汽车穿过

E2N_10 is traversing !

S2E_10 is traversing !

W2S_10 is traversing !

E2W_1 is traversing !

E2N_11 is traversing !

W2E_1 is traversing !

W2S_11 is traversing !

N2W_11 is traversing !

S2E_11 is traversing !

E2W_2 is traversing !

W2E_2 is traversing !

S2E_12 is traversing !

E2N_12 is traversing !

N2W_12 is traversing !

W2S_12 is traversing !

E2W_3 is traversing !

S2E_13 is traversing !

W2E_3 is traversing !

E2N_13 is traversing !

N2W_13 is traversing !

W2S_13 is traversing !

E2W_4 is traversing !

W2E_4 is traversing !

S2E_14 is traversing !

N2W_14 is traversing !

W2S_14 is traversing !

E2N_14 is traversing !

E2W_5 is traversing !

E2N_15 is traversing !

N2W_15 is traversing !

绿灯从E2W------->切换为E2S

E2S lamp is green, 下面总共应该有6个方向能看到汽车穿过

S2E_15 is traversing !

W2S_15 is traversing !

N2W_16 is traversing !

S2E_16 is traversing !

W2S_16 is traversing !

E2N_16 is traversing !

N2W_17 is traversing !

E2N_17 is traversing !

S2E_17 is traversing !

W2S_17 is traversing !

S2E_18 is traversing !

E2N_18 is traversing !

W2S_18 is traversing !

N2W_18 is traversing !

S2E_19 is traversing !

E2N_19 is traversing !

N2W_19 is traversing !

W2S_19 is traversing !

N2W_20 is traversing !

S2E_20 is traversing !

E2N_20 is traversing !

W2S_20 is traversing !

绿灯从E2S------->切换为S2N

S2N lamp is green, 下面总共应该有6个方向能看到汽车穿过

S2N_6 is traversing !

N2S_6 is traversing !

S2E_21 is traversing !

N2W_21 is traversing !

E2N_21 is traversing !

S2N_7 is traversing !

N2S_7 is traversing !

S2E_22 is traversing !

E2N_22 is traversing !

N2W_22 is traversing !

S2N_8 is traversing !

N2S_8 is traversing !

S2E_23 is traversing !

N2W_23 is traversing !

E2N_23 is traversing !

S2N_9 is traversing !

S2E_24 is traversing !

N2S_9 is traversing !

N2W_24 is traversing !

E2N_24 is traversing !

S2N_10 is traversing !

绿灯从S2N------->切换为S2W

N2W_25 is traversing !

S2E_25 is traversing !

E2N_25 is traversing !

S2W lamp is green, 下面总共应该有6个方向能看到汽车穿过

S2W_6 is traversing !

N2E_6 is traversing !

E2N_26 is traversing !

S2E_26 is traversing !

N2W_26 is traversing !

S2W_7 is traversing !

N2E_7 is traversing !

N2W_27 is traversing !

E2N_27 is traversing !

S2E_27 is traversing !

S2W_8 is traversing !

N2E_8 is traversing !

E2N_28 is traversing !

S2E_28 is traversing !

N2W_28 is traversing !

S2W_9 is traversing !

N2W_29 is traversing !

N2E_9 is traversing !

E2N_29 is traversing !

S2E_29 is traversing !

S2W_10 is traversing !

N2E_10 is traversing !

N2W_30 is traversing !

绿灯从S2W------->切换为E2W

E2W lamp is green, 下面总共应该有6个方向能看到汽车穿过

S2E_30 is traversing !

E2N_30 is traversing !

E2W_6 is traversing !

N2W_31 is traversing !

W2E_5 is traversing !

S2E_31 is traversing !

E2N_31 is traversing !

E2W_7 is traversing !

W2E_6 is traversing !

S2E_32 is traversing !

E2N_32 is traversing !

N2W_32 is traversing !

E2W_8 is traversing !

W2E_7 is traversing !

S2E_33 is traversing !

E2N_33 is traversing !

N2W_33 is traversing !

E2W_9 is traversing !

S2E_34 is traversing !

W2E_8 is traversing !

E2N_34 is traversing !

N2W_34 is traversing !

E2W_10 is traversing !

W2E_9 is traversing !

S2E_35 is traversing !

绿灯从E2W------->切换为E2S

E2S lamp is green, 下面总共应该有6个方向能看到汽车穿过

N2W_35 is traversing !

E2N_35 is traversing !

W2S_21 is traversing !

E2N_36 is traversing !

S2E_36 is traversing !

N2W_36 is traversing !

W2S_22 is traversing !

E2N_37 is traversing !

W2S_23 is traversing !

S2E_37 is traversing !

N2W_37 is traversing !

W2S_24 is traversing !

S2E_38 is traversing !

E2N_38 is traversing !

N2W_38 is traversing !

维护:

OK!

---------------------- android培训java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值