黑马程序员-交通灯管理系统的分析、设计、实现

 

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

业务和需求分析:

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

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

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

3.左转车辆受信号灯控制,右转车辆不受信号灯控制

4.具体信号灯控制逻辑与显示生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑

    * 东西向和南北向的车辆交替放行

    * 同方向等待车辆应先放行直行车辆,再放行左转车辆

5.假设每辆车通过路口所用的时间为1秒

6.随机生成车辆的时间间隔和红绿灯交换的时间间隔自定,可以自定义设置

7.不识闲GUI,只考虑系统逻辑实现,通过Log方式展现程序运行结果


面向对象的分析与设计:

* 设计时要遵循一个原则,谁拥有数据,谁就提供操作这些数据的方法

1.每条路线上都会出现多辆车,路线上要随机增加新的车,在绿灯期间还要每秒钟减少一辆车。

   * 设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线

   * 每条路线上随机增加新的车辆,增加到一个集合中保存

   * 每条路线每隔一秒检查是否为绿灯,是的话则将代表本条路线的集合中的第一辆车溢出,即表示穿过了路口

2.每条路线每隔一秒检查是否为绿灯,当变为红灯时,将下一个方向的灯变绿

   * 设计一个Lamp类来表示交通灯,每个交通灯都只有两种状态,红或绿。每个交通灯都有变红和变绿的方法,并且能返回自己的红绿状态

   * 一共有12条路线,所以需要12个交通灯。右转弯的路线本来不受交通灯的控制,但是为了让程序采用统一的处理方式,故假设出有4个

    控制右转弯的交通灯,只是它们的状态一直为绿灯

   * 除了右转弯方向的其它8条路线的交通灯,它们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组灯中各取出一个灯,        按东西向和南北向将其分为两对,再使这两对灯轮流切换红绿灯状态即可,为了实现这样的效果,Lamp类中要有一个变量记录和自己

     相反方向的灯,还要有一个变量来记录下一个要切换状态的灯(和自己成直角线的路线的灯)

   * 无论在程序的哪个地方去获取某个方向的灯,每次获取到的都是同一个实例对象,所以Lamp用枚举来现在就很方便

   * 设计一个LampController类,它定时让当期的绿灯变红

 

图例:


代码实现:

1.------------------------------------------------------------------------------------------------------------------

 

package com.itheima.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;

 

/**

 * 这个类用来表示路

 * 

 * @author mrng

 */

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

try {

// 在1-5秒钟之内产生一两汽车

Thread.sleep((new Random().nextInt(10 + 5)) * 1000);

catch (InterruptedException e) {

e.printStackTrace();

}

// 将汽车添加到集合中

vechicles.add(Road.this.name + "_" + i);

}

}

});

 

/**

 * 定义一个定时器,每隔一秒钟检查灯的状态 

 * 参数解释: 

 * 1,要执行的任务 

 * 2,过多长时间执行 

 * 3,过多长时间再次执行

 * 4,时间模式(这里使用的是秒)

 */

ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(new Runnable() {

public void run() {

// 如果是绿灯就放行

if (Lamp.valueOf(Road.this.name).isGreen()) {

// 如果集合里有汽车的话执行移除操作

if (!vechicles.isEmpty()) {

// 将集合里的第一辆车移除,表示通过了路口

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

}

}

}

}, 1, 1, TimeUnit.SECONDS);

}

 

public List<String> getVechicles() {

return vechicles;

}

 

public void setVechicles(List<String> vechicles) {

this.vechicles = vechicles;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

}

 

2.------------------------------------------------------------------------------------------------------------------

 

package com.itheima.traffic;

 

/**

 * 这个类用来表示交通灯

 * 

 * @author mrng

 */

public enum Lamp {

/**

 * S2N(由南向北,直行),S2W(由南向西,左转),E2W(由东向西,直行),E2S(由东向南,左转),

 * N2S(由北向南,直行),N2E(由北向东,左转),W2E(由西向东,直行),W2N(由西向北,左转),

 * S2E(由南向东,右转),N2W(由北向西,右转),E2N(由东向北,右转),W2S(由西向南,右转);

 */

S2N("N2S""S2W"false), S2W("N2E""E2W"false), E2W("W2E""E2S"false), E2S("W2N""S2N"false),

N2S(nullnullfalse), N2E(nullnullfalse), W2E(nullnullfalse), W2N(nullnullfalse),

S2E(nullnulltrue), N2W(nullnulltrue), E2N(nullnulltrue), W2S(nullnulltrue);

// 与当前灯相反方向的灯

private String opposite;

// 当前灯变红时下一个要变绿的灯

private String next;

// 当前灯是否为绿灯

private boolean isGreen;

// 返回当前灯的状态

public boolean isGreen() {

return this.isGreen;

}

private Lamp() { }

private Lamp(String opposite, String next, boolean isGreen) {

this.opposite = opposite;

this.next = next;

this.isGreen = isGreen;

}

// 将当前灯变为绿灯

public void Changed2Green() {

this.isGreen = true;

// 如果当前的灯需要控制相反方向的灯和当前灯的状态一致

if (this.opposite != null) {

Lamp.valueOf(opposite).Changed2Green();

System.out.println("-----" + this.name() + "-------" + opposite + "-----");

}

}

// 将当前灯变为红灯

public Lamp Changed2Red() {

this.isGreen = false;

// 如果当前的灯需要控制相反方向的灯和当前灯的状态一致

if (this.opposite != null) {

Lamp.valueOf(opposite).Changed2Red();

}

// 当前灯变红后,将下一个灯变绿

Lamp nextLamp = null;

if (this.next != null) {

nextLamp = Lamp.valueOf(next);

nextLamp.Changed2Green();

}

// 将下一个要变绿的灯返回给LampController

return nextLamp;

}

}


 

3.------------------------------------------------------------------------------------------------------------------

 

package com.itheima.traffic;

 

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

 

/**

 * 交通灯的控制器

 * 

 * @author mrng

 */

public class LampController {

// 当前状态为绿色的灯

private Lamp currentLamp = Lamp.S2N;

public LampController() {

//将当前灯变绿

currentLamp.Changed2Green();

 

// 每10秒钟切换一次灯的状态

ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);

timer.scheduleAtFixedRate(new Runnable() {

public void run() {

// 将当前灯变红后,得到下一个变绿的灯

currentLamp = currentLamp.Changed2Red();

}

}, 5, 5, TimeUnit.SECONDS);

}

}


 

4.------------------------------------------------------------------------------------------------------------------

 

package com.itheima.traffic;

 

/**

 * 主类

 * 

 * @author mrng

 */

public class MainClass {

public static void main(String[] args) {

String[] directions = { "S2N""S2W""E2W""E2S",//

"N2S""N2E""W2E""W2N",//

"S2E""N2W""E2N""W2S" };

// 创建12条路线

for (String direction : directions) {

new Road(direction);

}

 

// 开启LampController

new LampController();

}

}

------- android培训java培训、期待与您交流! ----------   
详细请查看:http://edu.csdn.net/heima/
实验目的 1.基本掌握自顶向下的电子系统设计方法 2.学会使用PLD和硬件描述语言设计数字电路,掌握 Quartus II等开发工具的使用方法 3.培养学生自主学习、正确分析和解决问题的能力 设计要求 我在本课程中所选择的课题是用Verilog HDL实现交通灯控制器。该课题的具体内容及要求如下: 主干道与乡村公路十字交叉路口在现代化的农村星罗棋布,为确保车辆安全、迅速地通过,在交叉路口的每个入口处设置了红、绿、黄三色信号灯。红灯禁止通行;绿灯允许通行;黄灯亮则给行驶中的车辆有时间行驶到禁行线之外。主干道和乡村公路都安装了传感器,检测车辆通行情况,用于主干道的优先权控制。 (1)当乡村公路无车时,始终保持乡村公路红灯亮,主干道绿灯亮。 (2)当乡村公路有车时,而主干道通车时间已经超过它的最短通车时间时,禁止主干道通行,让乡村公路通行。主干道最短通车时间为25s 。 (3)当乡村公路和主干道都有车时,按主干道通车25s,乡村公路通车16s交替进行。 (4)不论主干道情况如何,乡村公路通车最长时间为16s。 (5)在每次由绿灯亮变成红灯亮的转换过程中间,要亮5s时间的黄灯作为过渡。 (6)用开关代替传感器作为检测车辆是否到来的信号。用红、绿、黄三种颜色的发光二极管作交通灯。 (7)要求显示时间,倒计时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值