交通灯模拟报告.docx
- 文档编号:10717597
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:28
- 大小:79.90KB
交通灯模拟报告.docx
《交通灯模拟报告.docx》由会员分享,可在线阅读,更多相关《交通灯模拟报告.docx(28页珍藏版)》请在冰豆网上搜索。
交通灯模拟报告
合肥学院
计算机科学与技术系
课程设计报告
2010~2011学年第一学期
课程
JAVA语言程序设计
课程设计名称
交通灯模拟程序
专业班级
08网络工程<1>班
姓名
王啸
指导教师
金莹郭昌建
2011年9月
一、需求分析
随着城市汽车数量越来越多,城市得交通拥挤问题正逐渐引起人们得注意。
交通灯就是交管部分管理城市交通得重要工具。
目前绝大部分交通灯其时间都就是设定好得,不管就是车流高峰还就是低谷,红绿灯得时间都固定不变;还有一些交通灯能根据简单划分得时间段来调整时间,但控制起来都不就是很灵活,这使得城市车流得调节不能达到最优。
本文所述设计正就是针对这一弊端进行了改进,根据实时车流量对各路口得绿灯时间进行动态调节,大大加强了其灵活性与实时性。
二、设计
1、设计思想
根据设计要求首先用JAVA语言得GUI画出十字路口与交通灯设计程序界面,画出十字路口与交通灯。
可以手工设置红、绿等得时间间隔,程序按设定值自动变换每个路口得交通灯颜色。
异步随机生成按照各个路线行驶得车辆:
由南向北得直行车辆
由北向南得直行车辆
由东向西得直行车辆
由西向东得直行车辆
信号灯考录黄灯、红灯与绿灯,具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下得控制逻,南北向车辆与东西向车辆交替放行。
随机产生一些车辆,这些车辆遵守红灯停、绿灯行得交通规则。
生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。
2、功能设计
程序主要实现了以下三大功能:
(1)设计程序界面,画出十字路口与交通灯。
这一功能主要由Java图形用户界面实现,画出十字路口与东西南北四个方向得得双向车道,交叉路口各个方向得交通灯。
(2)可以手工设置红、绿灯得时间间隔,程序按设置值自动变换每个路口交通灯得颜色。
程序界面设有三个文本框,分别可供用户输入红灯时间,绿灯时间,黄灯时间,填完各项数据之后,按下“设置”按钮,程序将根据用户填写数据调整红绿亮灯时间,在用户没有填入符合要求得数据或者没有数据填入时,程序默认得红灯亮灯时间为8秒,绿灯为10秒,黄灯为3秒。
南北方向红灯亮时,东西方向绿灯亮,南北方向绿灯亮时,东西方向红灯亮,红绿灯亮灯时间一致。
四个方向得黄灯同时亮。
(3)随机产生一些车辆,这些车辆遵守红灯停、绿灯行得交通规则
随机产生小车,小车方向随机,通过type=(int)(((Math、random)*(newDate、getTime)*10)%4);Type值随机取值0,1,2,3四个整数,四个数分别各代表四个方向。
再根据不同方向选择不同得汽车图片。
图1就是一个典型得十字路口示意图。
分别用0、1、2、3表明四个流向得主车道,通过分析很容易得知,在同一时间,最多只能有两个车道通行,如0、1通行时,2、3车道都会被阻断。
所以在设计红绿灯时,可以两两组合,共有两组(01、23);而各车道中车辆行驶时间按照交通灯设计时间来决定,红绿灯时间可以自行设定。
图1十字路口交通图
随意产生车辆就是由设定存放车辆得list中(list就是有序得collection使用此接口能够精确得控制每个车辆插入得位置),还使用了可实现可变大小得ArrayList数组(每个ArrayList实例都有一个容量Capacity,用于存放数组得大小,这个容量可以随着添加新车辆而自动增加)。
整个程序中用到多个线程,其中有随机产生车辆、小车行驶方向、控制小车得行驶等,通过线程得同步实现交通控制。
3、详细设计
首先在面板中画固定大小得画布Imageimage=createImage(2000,2000);Graphicsg=image、getGraphics;,然后在画布上画出路线与红绿灯,并且把画布画在面板中。
程序中主要设计流程:
图2程序流程图
以下就是程序中主要设计对象:
(1)每条路线上都会出现多辆车,路线上要随机增加新得车,在相应得灯绿期间车辆各行其道。
若就是车运行出面板则会移除该车:
if(car、getType==0){//由西向东得车辆
if(car、getX>2000){
cars、remove(car);
i;
continue;}
其她方向得车辆也会按此方式移除。
(2)每条路线上随机增加新得车辆,增加到一个集合list中保存privateList
(3)每条路线上当车运行到十字路口时都会判断,都会检查对应路口得信号灯颜色如何,控制本路线得灯若为黄灯或就是红灯则车辆就会停下来,若就是车辆行驶停在十字路口,则其后得车经过判断必须停在后面,等待绿灯亮时继续行驶。
判断当前行驶得车前方就是否有车辆停下:
privatebooleanhasObstructor(Carcar,List
(4)控制小车运行方向:
publicCar{type=(int)(((Math、random)*(newDate、getTime)*10)%4);随机产生四个方向得小车。
Im=Toolkit、getDefaultToolkit、getImage((type+1)+"、jpg");获取小车图片
if(type==0)
{x=0;y=240;}小车方向由西东
elseif(type==1)
{x=1500;y=200;}小车方向由东向西
elseif(type==2)
{x=235;y=0;}小车方向由北向南
elseif(type==3)
{x=280;y=1500;}小车方向由南向北
(5)设计交通灯:
每个交通灯都维护一个状态:
变红、变绿或就是变黄,每个交通灯要有变亮与变黑得方法,并且能返回自己得亮黑状态。
在编程处理时,只要从这两组中各取出两个灯,对这4个灯两两依次轮询变亮,与这4个灯方向对应得灯则随之一同变化,因此交通灯类中要有一个变量来记住自己相反方向得灯,在一个交通灯对象得变亮与变黑方法中,将对应方向得灯也变亮与变黑。
每个灯变黑时,都伴随者下一个灯得变亮。
信号灯运行周期:
publicclassPaintThreadimplementsRunnable{
publicvoidrun{
for(inti=0;i if(i==0){ j=0; redStatus=true;//红灯亮 greenStatus=false; yellowStatus=false; }elseif(i==redTimes){ j=0; redStatus=false; greenStatus=false; yellowStatus=true;//黄灯亮 }elseif(i==redTimes+yellowTimes){ j=0; redStatus=false; greenStatus=true;//绿灯亮 yellowStatus=false; }elseif(i==redTimes+greenTimes+yellowTimes){ j=0; redStatus=false; greenStatus=false; yellowStatus=true;//黄灯亮 } repaint; j++; if(i==redTimes+greenTimes+yellowTimes+yellowTimes1) i=1; try{ Thread、sleep(1000); }catch(InterruptedExceptione){ e、printStackTrace; } } 三、调试及测试 1、调试过程中遇到得主要问题及解决方法 在调试过程中主要就是控制小车行驶比较难以实现,起初当所有面板中静态得图片处理完成后,无法将下载得小车图片加入面板后进行运动操作,主要问题就是开始把小车运动想得太简单了以为完成完成下列操作即可: (1)创建Image类得对象数组car,用来缓存要演示得小车图片, (2)利用getDocumentBase函数方法获取图片信息,(3)再使用Thread、sleep方法,但就是当运行程序时会报错,显示 找不到getDocumentBase,原因就是所做得程序就是Application程序,不能使用函数getDocumentBase,而使用Im=Toolkit、getDefaultToolkit、getImage((type+1)+"、jpg"),才可完成获取图片信息得功能。 2、对设计与编码得回顾讨论与分析 该程序得设计主要用到以下类库: importjava、awt、BorderLayout; importjava、awt、Color; importjava、awt、Dialog; importjava、awt、Graphics; importjava、awt、Image; importjava、awt、Toolkit; importjava、awt、event、ActionEvent; importjava、awt、event、ActionListener; importjava、awt、event、WindowAdapter; importjava、awt、event、WindowEvent; importjava、awt、image、BufferStrategy;//处理与操作来自于网上得图片定义图像对象,双缓存 importjava、util、ArrayList;//实现可变大小得数组 importjava、util、Collections;//java、util、*就是包括集合、事件处理模式、日期时间工具等各类常用工具包 importjava、util、Date; importjava、util、List;//list就是有序得collection,使用此接口能够精确得控制每个元素插入得位置 importjavax、swing、JButton; importjavax、swing、JFrame; importjavax、swing、JLabel; importjavax、swing、JPanel; importjavax、swing、JTextField; 程序中还多次用到线程控制,比如控制小车行驶线程CarRunThread,随机产生小车线程CarThread,控制红绿灯状态线程PaintThread等。 下面就是程序设计中主要得类与线程: Luche类里设定了默认得红灯亮灯时间为8ms,绿灯亮灯时间为10ms,黄灯亮灯时间为3ms。 创建数组car,存放小车。 Paint函数用来每10ms根据既定坐标画出公路,绿地界面随机产生得小车当前得坐标值画出小车及既定坐标圆形得红绿灯与亮灯倒计时时间,组成整个交通图。 Lauchh函数用来启动PaintThread(红绿灯倒计时时间计算),CarThread(随机产生小车),CarRunThead(控制小车行驶)三个线程。 CarThread类随机产生小车,(long)(Math、random*1200)计算出随机数,在该时间段里(0到1、2s)随机产生小车。 CarRunThread类控制小车行驶,根据Type值即各个方向逐一判断该方向小车得行驶状况,以西东方向为例: Luche、this、isGreenStatus||Luche、this、isYellowStatus)&&Math、abs(car、getX320)<5)||hasObstructor(car,cars) 当南北方向绿灯亮即当前方向红灯亮或者黄灯亮并且小车距离路口不到五个像素点(小车为路口第一辆)或者小车前有障碍物(小车前有车,没有可行进距离),此时小车停。 继续判断下一辆小车。 否则car、setX(car、getX+5);小车坐标改变,表明小车可继续前行。 小车坐标值超出界面别界则移除该小车。 程序每10ms对List里所有小车状态进行循环判断。 其中函数hasObstructor用来判断当前小车前方就是否有障碍物,对各方向上得小车循环通过计算相邻小车之间距离即相邻小车坐标差值判断就是否有可行进距离。 当相邻小车距离大于0且不足46个像素点时,小车前方有障碍物。 PaintThread线程里面控制了三个灯得亮灯时间,设置全局变量j=0,记录各灯亮灯时间,继而用用户设置得亮灯时间减去已亮时间,得到亮灯倒计时。 红灯时间+绿灯时间+两倍黄灯时间为一个周期,线程每1000ms循环统计一次。 Car类里,计算了小车方向随机值: type=(int)(((Math、random)*(newDate、getTime)*10)%4); 随机产生四个值0,1,2,3,获取Type+1、jpg小车图片: Type=0,小车起点坐标(0,240),为西东方向,小车图片为1、jpg; Type=1,小车起点坐标(1500,240),为东西方向,小车图片为2、jpg; Type=2,小车起点坐标(235,0),为北南方向,小车图片为3、jpg; Type=3,小车起点坐标(280,1500),为南北方向,小车图片为4、jpg。 CarFactory类里获得Car数组里随机产生得小车,并把产生小车值 返回Car类。 程序中不同得类实现不同得功能,每个功能又通过各自线程得控制,异步执行从而达到同步效果,最终完成交通灯模拟程序要求。 3、程序运行得时空效率分析 程序中定义图像应用到了双缓存,方便程序执行。 同时程序中使用synchronizedList得到得就是同步容器,使线程同步执行,节约运行时间,程序中设定当车辆运行超出范围时则移除该车,因此已经移除得车不会再继续占用空间。 但就是程序中不足得就是,因为信号灯得变化间隔就是1s所以在每次隔10ms执行publicvoidpaint(Graphicsg1)时,信号灯得交替时间还未到而被重画,这样会不同程度得浪费资源,不过这个程序就是小程序可能不会有大得影响,若就是扩大程序,则需进一步完善。 4、测试数据集 (1)默认设置信号灯持续时间: 图3运行结果1 (2)重新设置信号灯持续时间: 图4运行结果2 四、经验与体会。 通过学习了近一个学期得JAVA课后,设计完成了交通灯程序,通过这个程序,我对线程有了很深得认识,对于它就是如何实现以及两个或更多得线程共同使用时如何条用得,有了更进一步得了解。 学习该语言期间,明显感到它与其她得高级语言不同,比起C或C++更方便使用,或许我接触得时间还不长,使用得机会还不多,尤其就是大段程序设计。 另一个则就是画图,由这个程序我已基本上掌握了画图得程序写法。 不过对于此程序得有些地方我觉得有必要作些说明,这样能帮助更好得理解我得方法。 importjava、awt、*;importjava、awt、event、*; 这两行就是对于程序中要用到得抽象窗口工具包做个定义。 因为JAVA提供得用于语言开发得类库,称为应用程序编程接口,分别放在不同得包中。 前一句就是AWT核心包,后一句就是提供事件类与监听器得包。 WindowListener,ponentListener,ItemListener 这一行就是对程序中用可能要用到得EVENT事件类总得声明一下,以后得程序里必须包含着各个事件类所相对应得接口。 这些接口中包含所要执行得程序代码或就是调用得函数名,若就是无此接口任务时,可不写任何代码。 同时,通过进一步巩固、加深了我们所学专业课程得基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题得能力。 全面考核我们所掌握得基本理论知识及其实际业务能力,从而达到提高学生素质得最终目得。 利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理得综合能力。 对于给定得设计题目,如何进行分析,理清思路,并给出相应得数学模型。 熟练掌握JAVA语言得GUI设计、多线程技术,灵活运用各种类库。 五、源程序 importjava、awt、BorderLayout; importjava、awt、Color; importjava、awt、Dialog; importjava、awt、Graphics; importjava、awt、Image; importjava、awt、Toolkit; importjava、awt、event、ActionEvent; importjava、awt、event、ActionListener; importjava、awt、event、WindowAdapter; importjava、awt、event、WindowEvent; importjava、awt、image、BufferStrategy; importjava、util、ArrayList; importjava、util、Collections; importjava、util、Date; importjava、util、List; importjavax、swing、JButton; importjavax、swing、JFrame; importjavax、swing、JLabel; importjavax、swing、JPanel; importjavax、swing、JTextField; publicclassMainFrameextendsJFrame{ privateJLabelredlight_label=newJLabel("红灯时间: 秒"); privateJLabelgreenlight_label=newJLabel("绿灯时间: 秒"); privateJLabelyellowlight_label=newJLabel("黄灯时间: 秒"); privateJTextFieldredlight_field=newJTextField; privateJTextFieldgreenlight_field=newJTextField; privateJTextFieldyellowlight_field=newJTextField; privateJButtonbtn_set=newJButton("设置"); privateLucheluche=newLuche; publicMainFrame{ setTitle("交通灯模拟程序"); setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE); setSize(600,600); setLayout(null); redlight_label、setBounds(10,10,200,25); redlight_field、setBounds(70,10,40,25); greenlight_label、setBounds(150,10,200,25); greenlight_field、setBounds(210,10,40,25); yellowlight_label、setBounds(280,10,200,25); yellowlight_field、setBounds(340,10,40,25); add(yellowlight_field); add(greenlight_field); add(redlight_field); add(greenlight_label); add(yellowlight_label); add(redlight_label); btn_set、setBounds(400,10,80,25);//设置窗口位置与大小,出示位置为(400,10)参数单位为像素 add(btn_set); luche、setBounds(0,50,2000,2000); add(luche); luche、lauch; add(btn_set); btn_set、addActionListener(newActionListener{ //Override publicvoidactionPerformed(ActionEventarg0){ try{ intredTimes=Integer、parseInt(redlight_field、getText); intgreenTimes=Integer、parseInt(greenlight_field、getText); intyellowTimes=Integer、parseInt(yellowlight_field、getText); luche、setRedTimes(redTimes); luche、setGreenTimes(greenTimes); luche、setYellowTimes(yellowTimes); }catch(NumberFormatExceptione){ e、printStackTrace;//用来在屏幕上输出当前异常对象使用得堆栈得轨迹 } } }); setVisible(true); } publicstaticvoidmain(String[]args){ newMainFrame; } } classLucheextendsJPanel{ privatebooleanredStatus=false,greenStatus=false,yellowStatus=false; intj=0; privateintredTimes=8; privateintgreenTimes=10; privateintyellowTimes=3; privateList setBackground(Color、GREEN); } publicvoidup
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 交通灯 模拟 报告