java交通信号灯模拟_城市交通信号灯

java交通信号灯模拟_城市交通信号灯                           交通信号灯系统1.题目模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。例如:      由南向而来去往北向的车辆—-直行车辆      由西向而来去往南向的车辆—-右转车辆

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺



                            交通信号灯系统

1.题目

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

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

例如:

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

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

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

        等等

 

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

 

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

 

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

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

 

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

 

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

 

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

 

2.分析

 

根据题意我们可以分析出交通灯控制车辆行驶图(如下)

java交通信号灯模拟_城市交通信号灯

 

 

用面向对象思想分析得出:

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

 

         设计一个Road类来表示路线,每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12Road实例对象。


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


        
每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。

         每条路线每隔一秒都会检查控制本路线的灯是否为绿,一个灯由绿变红时,应该将下一个方向的灯变绿。


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


        
总共有12条路线,所以,系统中总共要产生12个交通灯。右拐弯的路线本来不受灯的控制,但是为了让程序采用统一的处理方式,故假设出有四个右拐弯的灯,只是这些灯为常亮状态,即永远不变黑。


       
除了右拐弯方向的其他8条路线的灯,它们是两两成对的,可以归为4组,所以,在编程处理时,只要从这4组中各取出一个灯,对这4个灯依次轮询变亮,与这4个灯方向对应的灯则随之一同变化,因此Lamp类中要有一个变量来记住自己相反方向的灯,在一个Lamp对象的变亮和变黑方法中,将对应方向的灯也变亮和变黑。每个灯变黑时,都伴随者下一个灯的变亮,Lamp类中还用一个变量来记住自己的下一个灯。

        无论在程序的什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以Lamp类改用枚举来做显然具有很大的方便性,永远都只有代表12个方向的灯的实例对象。

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

 

3.写代码

根据上述分析编写代码,代码分为如下步奏:

 

Road

        每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合。

        Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车(用一个路线名_id”形式的字符串进行表示)。

        Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则打印车辆集合和将集合中的第一辆车移除掉。

[java] view plaincopy

1.    <span style=“font-size:14px”>package com.itheima.lin.Traffic;  

2.      

3.    import java.util.ArrayList;  

4.    import java.util.List;  

5.    import java.util.Random;  

6.    import java.util.concurrent.ExecutorService;  

7.    import java.util.concurrent.Executors;  

8.    import java.util.concurrent.ScheduledExecutorService;  

9.    import java.util.concurrent.TimeUnit;  

10.    

11.  /** 

12.   * 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12Road实例对象。 

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

14.   * 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。 

15.   * 

16.   */  

17.  public class Road {  

18.      private List<String> vechicles = new ArrayList<String>();  

19.        

20.      private String name =null;  

21.      public Road(String name){  

22.          this.name = name;  

23.            

24.          //模拟车辆不断随机上路的过程       

25.          ExecutorService pool = Executors.newSingleThreadExecutor();  

26.          pool.execute(new Runnable(){  

27.              public void run(){  

28.                  for(int i=1;i<1000;i++){  

29.                      try {  

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

31.                      } catch (InterruptedException e) {  

32.                          e.printStackTrace();  

33.                      }  

34.                      vechicles.add(Road.this.name + “_” + i);  

35.                  }                 

36.              }  

37.                

38.          });  

39.            

40.          //每隔一秒检查对应的灯是否为绿,是则放行一辆车          

41.          ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);  

42.          timer.scheduleAtFixedRate(  

43.                  new Runnable(){  

44.                      public void run(){  

45.                          if(vechicles.size()>0){  

46.                              boolean lighted = Lamp.valueOf(Road.this.name).isLighted();  

47.                              if(lighted){  

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

49.                              }  

50.                          }  

51.                            

52.                      }  

53.                  },  

54.                  1,  

55.                  1,  

56.                  TimeUnit.SECONDS);  

57.            

58.      }  

59.  }</span>  



Lamp

 

        系统中有12个方向上的灯,在程序的其他地方要根据灯的名称就可以获得对应的灯的实例对象,综合这些因素,将Lamp类用java5中的枚举形式定义更为简单。

        每个Lamp对象中的亮黑状态用lighted变量表示,选用S2NS2WE2WE2N这四个方向上的Lamp对象依次轮询变亮,Lamp对象中还要有一个oppositeLampName变量来表示它们相反方向的灯,再用一个nextLampName变量来表示此灯变亮后的下一个变亮的灯。这三个变量用构造方法的形式进行赋值,因为枚举元素必须在定义之后引用,所以无法再构造方法中彼此相互引用,所以,相反方向和下一个方向的灯用字符串形式表示。

        增加让Lamp变亮和变黑的方法:lightblackOut,对于S2NS2WE2WE2N这四个方向上的Lamp对象,这两个方法内部要让相反方向的灯随之变亮和变黑,blackOut方法还要让下一个灯变亮。

        除了S2NS2WE2WE2N这四个方向上的Lamp对象之外,其他方向上的Lamp对象的nextLampNameoppositeLampName属性设置为null即可,并且S2NS2WE2WE2N这四个方向上的Lamp对象的nextLampNameoppositeLampName属性必须设置为null,以便防止lightblackOut进入死循环。

[java] view plaincopy

1.    <span style=“font-size:14px”>package com.itheima.linbin.traffic;  

2.      

3.    /** 

4.     * 每个Lamp元素代表一个方向上的灯,总共有12个方向,所有总共有12Lamp元素。 

5.     * 有如下一些方向上的灯,每两个形成一组,一组灯同时变绿或变红,所以, 

6.     * 程序代码只需要控制每组灯中的一个灯即可: 

7.     * s2n,n2s     

8.     * s2w,n2e 

9.     * e2w,w2e 

10.   * e2s,w2n 

11.   * s2e,n2w 

12.   * e2n,w2s 

13.   * 上面最后两行的灯是虚拟的,由于从南向东和从西向北、以及它们的对应方向不受红绿灯的控制, 

14.   * 所以,可以假想它们总是绿灯。 

15.   * 

16.   */  

17.  /**/  

18.    

19.  public enum Lamp {  

20.      /*每个枚举元素各表示一个方向的控制灯*/     

21.      S2N(“N2S”,“S2W”,false),S2W(“N2E”,“E2W”,false),E2W(“W2E”,“E2S”,false),E2S(“W2N”,“S2N”,false),  

22.      /*下面元素表示与上面的元素的相反方向的灯,它们的相反方向灯下一个灯应忽略不计!*/  

23.      N2S(null,null,false),N2E(null,null,false),W2E(null,null,false),W2N(null,null,false),  

24.      /*由南向东和由西向北等右拐弯的灯不受红绿灯的控制,所以,可以假想它们总是绿灯*/  

25.      S2E(null,null,true),E2N(null,null,true),N2W(null,null,true),W2S(null,null,true);  

26.        

27.      private Lamp(String opposite,String next,boolean lighted){  

28.          this.opposite = opposite;  

29.          this.next = next;  

30.          this.lighted = lighted;  

31.      }  

32.    

33.    

34.      /*当前灯是否为绿*/   

35.      private boolean lighted;  

36.      /*与当前灯同时为绿的对应方向*/     

37.      private String opposite;  

38.      /*当前灯变红时下一个变绿的灯*/     

39.      private String next;  

40.      public boolean isLighted(){  

41.          return lighted;  

42.      }  

43.        

44.      /** 

45.       * 某个灯变绿时,它对应方向的灯也要变绿 

46.       */   

47.      public void light(){  

48.          this.lighted = true;  

49.          if(opposite != null){  

50.              Lamp.valueOf(opposite).light();  

51.          }  

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

53.            

54.      }  

55.        

56.      /** 

57.       * 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿 

58.       * @return 下一个要变绿的灯 

59.       */   

60.      public Lamp blackOut(){  

61.          this.lighted = false;  

62.          if(opposite != null){  

63.              Lamp.valueOf(opposite).blackOut();  

64.          }         

65.            

66.          Lamp nextLamp= null;  

67.          if(next != null){  

68.              nextLamp = Lamp.valueOf(next);  

69.              System.out.println(绿灯从 + name() + “——–>切换为 + next);            

70.              nextLamp.light();  

71.          }  

72.          return nextLamp;  

73.      }  

74.  }</span>  



LampController

整个系统中只能有一套交通灯控制系统,所以,LampController类最好是设计成单例。

LampController构造方法中要设定第一个为绿的灯。

LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿。

 

[java] view plaincopy

1.    <span style=“font-size:14px”>package com.itheima.linbin.traffic;  

2.      

3.    import java.util.concurrent.Executors;  

4.    import java.util.concurrent.ScheduledExecutorService;  

5.    import java.util.concurrent.TimeUnit;  

6.      

7.    public class LampController {  

8.        private Lamp currentLamp;  

9.          

10.      public LampController(){  

11.          //刚开始让由南向北的灯变绿;       

12.          currentLamp = Lamp.S2N;  

13.          currentLamp.light();  

14.    

15.    

16.          /*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/        

17.          ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);  

18.          timer.scheduleAtFixedRate(  

19.                  new Runnable(){  

20.                      public  void run(){  

21.                          System.out.println(来啊);  

22.                          currentLamp = currentLamp.blackOut();  

23.                  }  

24.                  },  

25.                  10,  

26.                  10,  

27.                  TimeUnit.SECONDS);  

28.      }  

29.  </span>  



Main

for循环创建出代表12条路线的对象。

接着再获得LampController对象并调用其start方法。

[java] view plaincopy

1.    <span style=“font-size:14px”>package com.itheima.linbin.traffic;  

2.      

3.    public class MainClass {  

4.      

5.        /** 

6.         * @param args 

7.         */  

8.        public static void main(String[] args) {  

9.              

10.          /*产生12个方向的路线*/        

11.          String [] directions = new String[]{  

12.                  “S2N”,“S2W”,“E2W”,“E2S”,“N2S”,“N2E”,“W2E”,“W2N”,“S2E”,“E2N”,“N2W”,“W2S”       

13.          };  

14.          for(int i=0;i<directions.length;i++){  

15.              new Road(directions[i]);  

16.          }  

17.            

18.          /*产生整个交通灯系统*/         

19.          new LampController();  

20.      }  

21.    

22.  }  

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194044.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月13日 下午4:43
下一篇 2025年11月13日 下午5:15


相关推荐

  • pycharm远程部署_远程连接服务器失败

    pycharm远程部署_远程连接服务器失败在这之前你要确保服务器上已经创建好虚拟环境你本地已经安装好pycharm1创建本地文件远程服务器上已经有一个文件了。现在你在本地创建一个同名文件。服务器上的虚拟环境为DrQA,所以我在本地新建一个DrQA空文件夹。2用pycharm打开空项目3配置服务器的解释器左上角File→Setting→projectxxx→pythoninterpreter点右上角的小齿轮,然后点add选择SSHInterpreter,然后在上边填上服务器的地址、usernam

    2022年8月25日
    8
  • Centos开启6379端口

    Centos开启6379端口查看zone名称[root@vm-centos-1data]#firewall-cmd–get-active-zones#显示publicinterfaces:ens33开启6379端口[root@vm-centos-1data]#firewall-cmd–zone=public–add-port=6379/tcp–permanent#显示…

    2022年5月22日
    82
  • JBox使用详解

    JBox使用详解插件说明 nbsp jBox 是一款基于 jQuery 的多功能对话框插件 能够实现网站的整体风格效果 给用户一个新的视觉享受 nbsp 运行环境 nbsp 兼容 IE6 Firefox Chrome Safari Opera 等主流浏览器 备注 IE 不支持边框的圆角样式 不推荐大家使用蛋痛的 IE 浏览器 nbsp 使用授权 nbsp jBox 永久免费使用 但是必须保留相关的版权信息 如果有好的建议 请 Email kudych

    2026年3月17日
    1
  • 2026年云上/Windows本地部署OpenClaw步骤+必装Skill,解锁AI Agent 潜力教程

    2026年云上/Windows本地部署OpenClaw步骤+必装Skill,解锁AI Agent 潜力教程

    2026年3月13日
    3
  • 初学dtree

    初学dtree一篇详细的总结 https blog csdn net judyfun article details 在 http www destroydrop com javascripts tree 下载 dtree 源码具体参数看上面博客如果说要做成可以搜索的 tree 我搜索到 ztree 可以实现 而 dtree 很少实现这功能 大家可以百度一哈 nbsp 接下来是最近笔试遇到的类似

    2026年3月17日
    2
  • 讯飞星火 X1 全新升级,号称整体效果对标 OpenAI o1 和 DeepSeek R1

    讯飞星火 X1 全新升级,号称整体效果对标 OpenAI o1 和 DeepSeek R1

    2026年3月14日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号