交通灯管理系统


题目需求:

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:
1、异步随机生成按照各个路线行驶的车辆。
例如:
       由南向而来去往北向的车辆 ---- 直行车辆
       由西向而来去往南向的车辆 ---- 右转车辆
       由东向而来去往南向的车辆 ---- 左转车辆
       。。。
2、信号灯忽略黄灯,只考虑红灯和绿灯。
3、应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。
4、具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。
注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。
5、每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。
6、随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
7、不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。


需求分析:

1、首先依据现实交通灯情形并结合题目需求分析出所有的车辆行驶情况,并画出行驶路线图,共12种行驶路线(如图所示)

2、分析12条路线在同一时刻相互之间的关系:
    (1)题中指出所有右转车辆不受控制,因此可以将右转控制灯考虑为一直绿色(GREEN),因此4条右转路线不受其他路线情况的影响
    (2)题中第4条又指出“南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆”
因此可以将剩余8条路线分为两组,如图所示途中所标1、2、3、4为一组,剩余a、b、c、d为一一对应的一组。
对应关系为(1-a  2-b 3-c  4-d),每一个对应关系的灯的应该是同时为红同时为绿。

这样只用控制其中的一组灯,另外一组便可一一对应被控制。可以选择按1 2 3 4顺序依次放行(即依次安排绿灯),这样另外一组便放行相对应的

3、分析该需求中需要定义哪些类?
    (1)需求中出现的事物共有4种 :车、灯、路线、控制系统(控制灯的转换,隐含)
    (2)分析每一种事物在需求中的出现形式:
            灯:1、有属性的,红、绿,所以应该将其抽象出来。
                    2、又因为灯有且仅有12种灯分别控制12条路线上的车辆。可以可考虑使用枚举enum。
            路线:1、路线上有车;车在受控制地减少,也在随机地增加。应该抽象出来。
                      2、每一个实例便是一条路线,有12条路线。(也可以考虑为enum)
           控制系统:控制红绿变换的时间time,设置红绿灯的交换时间间隔的行为,控制红绿变换的行为。也应该抽象出来。
           车:需求中没有车所包含的特点(属性)或者行为(方法),而车的出现仅仅是路线上的一个成员,因此不应该把车定义为对象。

综上分析,应该定义3个类,分别是 :

灯(Lamp):
        定义为enum类型,因为有且仅有12个实例对象
         将灯分为3组:1、由控制系统直接控制的灯,也是主要操作的灯
                                2、由控制系统间接控制的灯,此组灯和第一组灯相对应,因此可以隐含操作
                                3、右转的路线上的灯,不受控制系统控制,初始化之后不会改变 
         行为: 1、判断当前灯是否为绿灯。
                     2、当前灯变绿。变绿同时将对应的灯变绿
                     3、当前灯变红。变红同时将对应等变红,并把下一个灯变绿

路线(Road):
          注:本人在练习时将此处的Road也定义为enum,因为它同Lamp是一个道理,有且仅有12个实例对象。
          成员变量:包含该路线的名称、储存车辆的集合。
          实现的行为方法:1、随机产生车辆
                                      2、根据控制灯,移除车辆

控制系统(LampController):
          定义为class,可以设置红绿灯交替的间隔时间,控制对应路线上的灯的变换。
          成员变量:当前灯、控制红绿灯变换的时间
          实现的行为:1、在一定频率内将当前绿灯进行切换

                                2、设置红绿灯切换的时间间隔


项目实现代码如下:

一、路线类Road

 

package com.heima.exam.traffic;import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/*** 路线* 定义为enum,有且只有12个实例对象 * 成员变量:包含该路线的名称、储存车辆的集合。* 实现的行为方法:1、随机产生车辆* 				2、根据控制灯,移除车辆* @author zhangyunfei**/
public enum Road {//路线的12个实例对象S2N("S2N"),S2W("S2W"),E2W("E2W"),E2S("E2S"),N2S("N2S"),N2E("N2E"),W2E("W2E"),W2N("W2N"),S2E("S2E"),E2N("E2N"),N2W("N2W"),W2S("W2S");private List<String> vehicles= new LinkedList<String>();		//路线上用于存放车辆的数组,private String roadName = null;								//路线的名字private long removeTime = 1;								//移除车辆的频率,按题目要求每隔1s离开一辆。单位sprivate Road(String roadName){this.roadName = roadName;				//初始化路线时将路线名字初始化//定义线程,实现随机产生车辆ExecutorService pool = Executors.newSingleThreadExecutor();pool.execute(new Runnable(){@Overridepublic void run(){for(int i = 1; i < 1000; i++){				//产生999辆车try {Thread.sleep(((int)(Math.random()*10)+1) * 1000);	//1-10秒钟随机产生车} catch (InterruptedException e) {e.printStackTrace();}Road.this.vehicles.add(Road.this.roadName+"_"+i);	//向该路线上产生车,车以路线名_标号命名//System.out.println("++" + Road.this.roadName+ " 方向新来了车 " + Road.this.roadName+"_"+i);	//}}});//定义定时器,实现根据控制灯移除车辆ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){@Overridepublic void run(){//根据控制系统,把该路线上的第一辆车移走if(!vehicles.isEmpty()){//判断路线上不为空,即有车boolean lighted = Lamp.valueOf(Road.this.roadName).isLighted();//获取当前路线的灯的颜色if(lighted){		//如果该路线上的灯为绿色System.out.println("--" + vehicles.remove(0) + " 开走了!");//开走路线上的第一辆车}}}},removeTime,		removeTime,TimeUnit.SECONDS);}}

 

二、灯类Lamp

 

package com.heima.exam.traffic;/*** 灯* 定义为enum类型,因为有且仅有12个实例对象* 将灯分为3组:1、由控制系统直接控制的灯,也是主要操作的灯* 				2、由控制系统间接控制的灯,此组灯和第一组灯相对应,因此可以隐含操作* 				3、右转的路线上的灯,不受控制系统控制,初始化之后不会改变* 行为:1、判断当前灯是否为绿灯。* 		2、当前灯变绿。变绿同时将对应的灯变绿* 		3、当前灯变红。变红同时将对应等变红,并把下一个灯变绿* @author zhangyunfei**/
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 boolean lighted;				//标识灯的红绿,true为、false为红private String opposite;				//与当前灯相对的另一个灯private String next;					//当前灯的下一个灯//参数分别为:当前灯对应的灯、下一个灯、初始化为的颜色private Lamp(String opposite,String next,boolean current){this.opposite = opposite;this.next = next;this.lighted = current;}//判断该灯是否为绿灯,返回true表示绿灯,返回false表示红灯public boolean isLighted(){	return lighted;}//灯变为绿色,相对应的灯也变为绿色public void light(){this.lighted = true;//将对应的灯变为绿色if(opposite != null){			//将灯分为两组,一组对面灯设置为null,防止死循环Lamp.valueOf(opposite).light();	//由灯的名字来获取该枚举的实例对象System.out.println(this.name() + " 灯变绿了!");			//显示路线上的灯变绿}}//灯变为红色,并返回下一个灯的实例对象public Lamp lightOut(){this.lighted = false;if(opposite != null){Lamp.valueOf(opposite).lightOut();}Lamp nextLight = null;//将下一个灯变为绿色if(next != null){nextLight = Lamp.valueOf(next);System.out.println("绿灯将从 "+this.name() + " 灯切换为 "+ next);			//显示路线上的灯变绿nextLight.light();}return nextLight;}
}

三、控制系统类LampController

 

 

package com.heima.exam.traffic;import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;/*** 控制系统* 成员变量:当前灯、控制红绿灯变换的时间* 实现的行为:1、在一定频率内将当前绿灯进行切换* 				2、设置红绿灯切换的时间间隔* @author zhangyunfei**/
public class LampController {private Lamp currentLamp;//当前灯private int changeTime = 5;		//红绿灯交换时间间隔,默认为5s,单位s//初始化时定义当前灯,并把当前灯点亮public LampController(){currentLamp = Lamp.S2N;currentLamp.light();//在设置的时间里控制灯的切换ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable(){@Overridepublic void run(){LampController.this.currentLamp = currentLamp.lightOut();}},changeTime, changeTime,TimeUnit.SECONDS);}//自行设置红绿灯交换的时间间隔public void setChangeTime(int time){this.changeTime = time;}}

四、包含主方法的类MainClass

 

 

package com.heima.exam.traffic;
/*** 启动交通灯管理系统* @author zhangyunfei**/
public class MainClass {/*** @param args*/public static void main(String[] args) {/*//初始化12条路线String[] roadNames = new String[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};for(int i = 0; i < roadNames.length; i++){new Road(roadNames[i]);}*///返回所有实例对象,再次只为将所有实例初始化Road.values();//开启控制系统new LampController();}
}





 



 

转载于:https://www.cnblogs.com/james1207/p/3341765.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

REDIS提供的map,list,set,sortedset使用测试

public class RedisTest {public JedisPool jedisPool null;public void init(){//创建配置信息JedisPoolConfig pool new JedisPoolConfig();//设置最大的总链接数pool.setMaxTotal(300);//设置最大空闲链接数pool.setMaxIdle(100);//设置最大等待时间pool.setMaxWaitMilli…

Java 多线程-生产者、消费者

一、整体代码 ThreadDemo.java public class ThreadDemo { public static void main(String[] args) { Godown godown new Godown(0); Consumer c1 new Consumer(50, godown); Consumer c2 new Consumer(20, godown); Consumer c3 new Consumer(30, godown); Producer p1 …

scala初学之helloWorld

特此声明&#xff0c;本文中的代码 部分或全部来源王家林的scala教程&#xff1b;虽然王家林一直被大家所诟病&#xff0c;而且也无法确定这些scala的程序代码是不是他的。但是作为一个初学者觉得就算代码不是他的&#xff0c;他只是拿过来翻译一次&#xff0c;看他的视频也是能…

scala初学之函数定义、流程控制、异常处理入门

特此声明&#xff0c;本文中的代码 部分或全部来源王家林的scala教程&#xff1b;虽然王家林一直被大家所诟病&#xff0c;而且也无法确定这些scala的程序代码是不是他的。但是作为一个初学者觉得就算代码不是他的&#xff0c;他只是拿过来翻译一次&#xff0c;看他的视频也是能…

HGOI20190707 题解

Problem A 钢铁侠的诞生 现在有$n$个数字$a_i \leq 10^9 $&#xff0c;然后取出$m$个数字&#xff0c;保证合法。 从小到大输出剩余的$n-m$个数字。 对于100%的数据$m\leq n \leq 3\times 10^5$ Sol : 直接map映射然后用iterator来遍历整个map输出答案即可。 复杂度大概是$O(n…

scala初学之Tuple、Array、Map、文件操作入门实战

特此声明&#xff0c;本文中的代码 部分或全部来源王家林的scala教程&#xff1b;虽然王家林一直被大家所诟病&#xff0c;而且也无法确定这些scala的程序代码是不是他的。但是作为一个初学者觉得就算代码不是他的&#xff0c;他只是拿过来翻译一次&#xff0c;看他的视频也是能…

Java连载3-编译与运行阶段详解JRE,JDK,JVM关系

一、 1.JDK下载地址&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk12-downloads-5295953.html 二、Java的加载与执行 1.Java程序运行包括&#xff1a; &#xff08;1&#xff09;编译阶段&#xff1a;检查Java源程序是否符合Java语法&#xff0c;符…

KMP算法NEXT数组纯手工生成

用一个实际的例子来说明&#xff0c;经历了看懂&#xff0c;看不懂&#xff0c;看懂&#xff0c;看不懂&#xff0c;看懂...后我终于决定把它记下来了。 例子字符串为&#xff1a;abaabaca 首先可以肯定&#xff0c;第一个位置永远位0&#xff0c;第二个位置永远为1.那么可以…

P1078 文化之旅

题面 这题好像是初二时老师讲过的一道题&#xff0c;但是。。我没听&#xff1f;&#xff1f;反正没交过就对了。。 我本来想的是深搜spfa&#xff0c;写到50行实现不了&#xff1f;&#xff1f;果断看tj&#xff0c;floyd&#xff1f;&#xff1f;&#xff1f;&#xff08;黑人…

KMP算法中NEXT数组的作用以及代码实现

在http://blog.csdn.net/u012613903/article/details/79004094中写到了如何手工去求一个NEXT数组&#xff0c;这个在很多考试中可以用来解题。但是在实际的使用中&#xff0c;NEXT数组究竟发挥着什么样的作用&#xff0c;如何用代码实现KMP算法呢&#xff1f; KMP算法是用来确…

最长公共连续子串

给出两个字符串&#xff08;可能包含空格&#xff09;,找出其中最长的公共连续子串,输出其长度。 注意这里是找连续子串。 算法&#xff1a;动态规划。f[i][j]表示第一个字符串前i个字符中与第二个字符串前j个中的最长连续子串长度 那么状态转移为&#xff1a;当s1(i)s2(j)时&a…

求最长回文串-从动态规划到马拉车之路(上)

要解决的问题&#xff1a; 给定一个字符串&#xff0c;要求求出这个字符串中的最长的回文串子串。 例子&#xff1a; cbddba的最长回文子串为 bddb cbdedba的最长回文子串为dbedb 由上面的例子可以看到&#xff0c;在考虑回文子串的问题时需要考虑奇偶性。因为奇回文关于中…

为什么Python中称__lt__、__gt__等为“富比较”方法

Python中基类object提供了一系列可以用于实现同类对象进行“比较”的方法&#xff0c;可以用于同类对象的不同实例进行比较&#xff0c;包括__lt__、__gt__、__le__、__ge__、__eq__和__ne__六个方法。 那么为什么叫“富比较”(“rich comparison”)方法呢&#xff1f;查了相关…

求最长回文串-从动态规划到马拉车之路(下)

预备知识&#xff1a; &#xff08;1&#xff09;在一个数轴上有两点i和j&#xff08;i<j&#xff09;关于点m对称&#xff0c;那么有 i 2m-j&#xff1b; 证明&#xff1a; 因为 i<j 且 i 和 j 关于 m 对称&#xff0c;那么有 &#xff08;i j&#xff09;/ 2 m 所…

项目管理实战之团队管理 (转自:zhuweisky)

一个系统不仅需要优秀的分析和设计&#xff0c;更需要一个良好的过程将其从蓝图转化为实现。这个过程中最重要的是对团队的管理&#xff0c;也就是人的管理。一个优秀的团队和一个糟糕的团队的效能是天壤之别&#xff0c;她们之间的比例不是1:100或1:1000这样量化的数字能够表示…

python3 内置方法

# -*- coding:utf-8 -*- # Author: Evan Mi import functools # 取绝对值 print(abs:, abs(-1)) # 如果一个可迭代对象的所有元素都为真&#xff0c;返回true ;空也返回真 print(all:, all([1, 0, -3])) # 有一个为真就全为真 print(any:, any([1, 0, -1])) # 变成可打印的字符…

JS 职责链模式

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><script>/*职责链模式 所有对象依次处理请求&#xff0c;1不能处理传给2&#xff0c;2不能处理传给3....*//*场景 打折 100以下不打折&…

python3字符串常用操作

# -*- coding:utf-8 -*- # Author: Evan Miname "my name is alex"print(name.capitalize()) # 首字母大写 print(name.count("a")) # 统计整个字符中a的个数 print(aaaaa.count("a", 0, len(aaaaa)-1)) # 前闭后开 print(name.center(50, &…

通过NGINX location实现一个域名访问多个项目

location ~ \.php$ {   root /home/webroot; //此目录下有多个项目 project1 &#xff0c;project2...   fastcgi_pass $php_upstream;   fastcgi_index index.php;   include fastcgi.conf; } location ~/project1 {   index index.php;   fastcgi_pass $php_u…

python3 set相关操作

# -*- coding:utf-8 -*- # Author: Evan Mi# 创建一个set list_1 [1, 3, 5, 7, 3, 6, 7, 9] list_1 set(list_1) list_2 set([2, 6, 0, 66, 22, 8, 4]) print(list_1, type(list_1))# 交集 print(list_1.intersection(list_2)) print(list_1 & list_2) # 并集 print(lis…