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

2024-04-14 08:18

本文主要是介绍【黑马程序员】交通灯管理系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

--------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ------

1.   交通灯管理系统的项目需求:

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

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

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

(4)    具体信号灯控制逻辑与现实相同:南北方向车辆与东西方向车辆交替

放行,同方向车辆应该先放行直行车辆而后放行左转车辆。

(5)    每辆车通过路口时间为1秒(可通过Sleep的方式模拟)

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

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


2.交通灯控制逻辑分析:

(1)4个路口,每个路口有直走,左转,右转3个方向。其中现实中右转不受灯控制为了统一各个方向的特征,

假设右转有1个常绿的灯。

(2)每种车辆运动方式对应一个灯,就有12个灯,考虑到对称性,只需考虑4个灯,再除去常绿的灯,只需写3个灯的控制代码。


3.车辆运动逻辑分析:

(1)车辆运动受自己运动方向的交通灯控制

(2)车辆通过路口要考虑自己前方路口是否有车


4.面向对象设计原则:

(1) 谁拥有数据,谁就应该对外提供操作数据的方法,

(2)一个对象变成另一个对象,改方法不能放在对象本身,如stone->knife :Knife k=KnifeFactory.careakKnife(Stone s1,Stones2)


5.面向对象分析:

(1)当车辆要了解自己前方是否有车,应该从某处获得该信息。因为车辆都在路上,路在程序中可视为一个集合,车辆就是其中的 元素。所以路应该有增加,减少和查询的方法。

(2)路随机生成车辆,并根据等的状态决定其是否通过。

(2)每隔一定时间改变灯的状态,要有一个交通灯控制器。

(2)在这个项目中,不需要体现车辆移动的过程,只需捕捉车辆穿过路口的过程,只要过了路口,这车就不需要考虑了。所以车不 需要单独设计成一个对象,用一个字符串表示就可以了。

(3)不管多少辆车,灯都是固定的12个,每个灯在2个状态间切换,所以可以用枚举来表示交通灯,每个元素表示灯控制的一个方 向。


7.程序实现:

(1)Lamp枚举,记录交通灯状态,定义交通灯枚举元素间的变化关系

enum Lamp{S2N("N2S",false,"S2W"),S2W("N2E",false,"W2E"),S2E("N2W",true,"S2E"),W2E("E2W",false,"W2N"),W2N("E2S",false,"S2N"),W2S("E2N",true,"W2S"),N2S(null,false,null),N2E(null,false,null),N2W(null,false,null),   E2W(null,false,null),E2S(null,false,null),E2N(null,false,null);private String opposite;private boolean lighted;private String next;private Lamp(String opposite,Boolean lighted,String next){this.opposite=opposite;this.lighted=lighted;this.next=next;}public void light(){this.lighted=true;if(opposite!=null){Lamp LampOpposite=Lamp.valueOf(opposite);LampOpposite.light();}System.out.println(name()+"lamp is green,下面总共应该6个方向能看到车辆穿过!");}public Lamp blackOut(){this.lighted=false;if(opposite!=null){Lamp lampOpposite=Lamp.valueOf(opposite);lampOpposite.blackOut();}Lamp nextLamp=null;if(next!=null){nextLamp=Lamp.valueOf(next);System.out.println("绿灯从"+name()+"------->切换为"+nextLamp.name());nextLamp.light();}return nextLamp;}public boolean isLighted(){return this.lighted;}
}


(2)LampController 交通灯控制器类:控制交通灯随时间变化


package com.isoftsone.interview;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class LampController {private static LampController instance=new LampController();public static LampController getInstance(){return instance;}private Lamp currentLamp=null;public LampController(){currentLamp=Lamp.S2N;}public void start(){currentLamp.light();Executors.newScheduledThreadPool(1).scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {// TODO 自动生成的方法存根currentLamp=currentLamp.blackOut();}},10,10,TimeUnit.SECONDS);}}
(3)Road类:生成随机车辆,并根据交通灯控制车辆的通过
package com.isoftsone.interview;
import java.util.*;
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() {	    @Overridepublic void run() {// TODO 自动生成的方法存根for(int i=1;i<1000;i++){try {Thread.sleep((new Random().nextInt(10)+1)*1000);} catch (InterruptedException e) {// TODO 自动生成的 catch 块e.printStackTrace();}vechicles.add(Road.this.name+"_"+i);}}});ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);timer.scheduleAtFixedRate(new Runnable() {	    @Overridepublic void run() {// TODO 自动生成的方法存根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);}
(4)TransportLamp交通灯项目主类,调用各个项目各个部分实现功能
package com.isoftsone.interview;import javax.swing.text.StyledEditorKit.ForegroundAction;public class TransportLamp {public static String[] RoadLine={"S2N","S2W","S2E","N2S","N2W","N2E","W2E","W2N","W2S","E2W","E2N","E2S"};public static void main(String[] args) {// TODO 自动生成的方法存根new LampController().start();for(int i=0;i<12;i++){new Road(RoadLine[i]);	}}}

--------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ------


这篇关于【黑马程序员】交通灯管理系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/902539

相关文章

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统

引言 在企业级应用开发中,数据库操作是非常重要的一环。Spring Data JPA提供了一种简化的方式来进行数据库交互,它使得开发者无需编写复杂的JPA代码就可以完成常见的CRUD操作。此外,设计模式如单例模式可以帮助我们更好地管理和控制对象的创建过程,从而提高系统的性能和可维护性。本文将展示如何结合Spring Boot、Spring Data JPA以及单例模式来构建一个基本的库存管理系统

【干货分享】基于SSM的体育场管理系统的开题报告(附源码下载地址)

中秋送好礼 中秋佳节将至,祝福大家中秋快乐,阖家幸福。本期免费分享毕业设计作品:《基于SSM的体育场管理系统》。 基于SSM的体育场管理系统的开题报告 一、课题背景与意义 随着全民健身理念的深入人心,体育场已成为广大师生和社区居民进行体育锻炼的重要场所。然而,传统的体育场管理方式存在诸多问题,如资源分配不均、预约流程繁琐、数据统计不准确等,严重影响了体育场的使用效率和用户体验。

基于SSM+Vue+MySQL的可视化高校公寓管理系统

系统展示 管理员界面 宿管界面 学生界面 系统背景   当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前,不接受信息改革带来的信息技术的企业随时面临被淘汰,被取代的风险。所以当今,各个行业领域,不管是传统的教育行业

图书管理系统系统分享

分享一个图书管理系统,Java、SpringBoot、Vue和MySQL开发的图书馆管理系统 gitee项目地址:https://gitee.com/yuanmomoya/open-source-project/tree/master/books-management-system GitHub项目地址:https://github.com/yuanmomoya/open-source-pro

基于springboot+vue+uniapp的“共享书角”图书借还管理系统小程序

开发语言:Java框架:springboot+uniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 后台登录界面 管理员功能界面 出借者管理 图书信息管理 图书归还管理 出租收入管理

LabVIEW程序员是怎样成长为大佬

成为一名LabVIEW编程领域的“大佬”需要时间、实践、学习和解决复杂问题的经验。尽管LabVIEW作为一种图形化编程语言在初期可能相对容易上手,但要真正成为精通者,需要在多个层面上深入理解。以下是LabVIEW程序员如何逐步成长为“大佬”的路径: 1. 打好基础 LabVIEW的大佬们通常在初期会打下非常坚实的基础,理解LabVIEW编程的核心概念,包括: 数据流编程模型:Lab

2025届计算机毕业设计:如何构建Java SpringBoot+Vue个人健康档案管理系统?

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录