ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:79.90KB ,
资源ID:10717597      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10717597.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(交通灯模拟报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

交通灯模拟报告.docx

1、交通灯模拟报告合肥学院计算机科学与技术系课程设计报告20102011学年第一学期课程JAVA语言程序设计课程设计名称交通灯模拟程序专业班级08网络工程班姓名王啸指导教师金莹 郭昌建2011年9月一、 需求分析随着城市汽车数量越来越多,城市得交通拥挤问题正逐渐引起人们得注意。交通灯就是交管部分管理城市交通得重要工具。目前绝大部分交通灯其时间都就是设定好得,不管就是车流高峰还就是低谷,红绿灯得时间都固定不变;还有一些交通灯能根据简单划分得时间段来调整时间,但控制起来都不就是很灵活,这使得城市车流得调节不能达到最优。本文所述设计正就是针对这一弊端进行了改进,根据实时车流量对各路口得绿灯时间进行动态调

2、节,大大加强了其灵活性与实时性。二、设计1、设计思想根据设计要求首先用JAVA语言得GUI画出十字路口与交通灯设计程序界面,画出十字路口与交通灯。可以手工设置红、绿等得时间间隔,程序按设定值自动变换每个路口得交通灯颜色。异步随机生成按照各个路线行驶得车辆: 由南向北得直行车辆 由北向南得直行车辆 由东向西得直行车辆 由西向东得直行车辆信号灯考录黄灯、红灯与绿灯,具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下得控制逻,南北向车辆与东西向车辆交替放行。随机产生一些车辆,这些车辆遵守红灯停、绿灯行得交通规则。生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。2、功能设计

3、程序主要实现了以下三大功能:(1)设计程序界面,画出十字路口与交通灯。这一功能主要由Java图形用户界面实现,画出十字路口与东西南北四个方向得得双向车道,交叉路口各个方向得交通灯。(2)可以手工设置红、绿灯得时间间隔,程序按设置值自动变换每个路口交通灯得颜色。程序界面设有三个文本框,分别可供用户输入红灯时间,绿灯时间,黄灯时间,填完各项数据之后,按下“设置”按钮,程序将根据用户填写数据调整红绿亮灯时间,在用户没有填入符合要求得数据或者没有数据填入时,程序默认得红灯亮灯时间为8秒,绿灯为10秒,黄灯为3秒。南北方向红灯亮时,东西方向绿灯亮,南北方向绿灯亮时,东西方向红灯亮,红绿灯亮灯时间一致。四

4、个方向得黄灯同时亮。(3)随机产生一些车辆,这些车辆遵守红灯停、绿灯行得交通规则随机产生小车,小车方向随机,通过type = (int) (Math、random)*(new Date、getTime)*10)%4);Type值随机取值0,1,2,3四个整数,四个数分别各代表四个方向。再根据不同方向选择不同得汽车图片。图1就是一个典型得十字路口示意图。分别用0、1、2、3表明四个流向得主车道,通过分析很容易得知,在同一时间,最多只能有两个车道通行,如0、1通行时,2、3车道都会被阻断。所以在设计红绿灯时,可以两两组合,共有两组(01、23);而各车道中车辆行驶时间按照交通灯设计时间来决定,红绿

5、灯时间可以自行设定。图1 十字路口交通图随意产生车辆就是由设定存放车辆得list中 (list就是有序得collection使用此接口能够精确得控制每个车辆插入得位置),还使用了可实现可变大小得ArrayList数组(每个ArrayList实例都有一个容量Capacity,用于存放数组得大小,这个容量可以随着添加新车辆而自动增加)。整个程序中用到多个线程,其中有随机产生车辆、小车行驶方向、控制小车得行驶等,通过线程得同步实现交通控制。3、详细设计 首先在面板中画固定大小得画布Image image = createImage(2000, 2000); Graphics g=image、getG

6、raphics;,然后在画布上画出路线与红绿灯,并且把画布画在面板中。 程序中主要设计流程: 图2 程序流程图 以下就是程序中主要设计对象:(1)每条路线上都会出现多辆车,路线上要随机增加新得车,在相应得灯绿期间车辆各行其道。若就是车运行出面板则会移除该车:if(car、getType = 0)/由西向东得车辆if(car、getX2000)cars、remove(car);i;continue;其她方向得车辆也会按此方式移除。(2)每条路线上随机增加新得车辆,增加到一个集合list中保存private List cars = Collections、synchronizedList(new

7、ArrayList)(3)每条路线上当车运行到十字路口时都会判断,都会检查对应路口得信号灯颜色如何,控制本路线得灯若为黄灯或就是红灯则车辆就会停下来,若就是车辆行驶停在十字路口,则其后得车经过判断必须停在后面,等待绿灯亮时继续行驶。判断当前行驶得车前方就是否有车辆停下:private boolean hasObstructor(Car car, List cars),若有循环考虑接下来运行得车辆,否则car、setX(car、getX+/5)或car、setY(car、getY+/5)小车以5像素得大小前移。(4)控制小车运行方向:public Car type = (int) (Math、r

8、andom)*(new Date、getTime)*10)%4);随机产生四个方向得小车。 Im = Toolkit、getDefaultToolkit、getImage(type + 1) + 、jpg);获取小车图片if(type=0)x = 0;y = 240;小车方向由西东else if(type=1)x = 1500;y = 200;小车方向由东向西else if(type=2)x = 235;y = 0;小车方向由北向南else if(type=3)x = 280;y = 1500;小车方向由南向北(5)设计交通灯:每个交通灯都维护一个状态:变红、变绿或就是变黄,每个交通灯要有变亮

9、与变黑得方法,并且能返回自己得亮黑状态。在编程处理时,只要从这两组中各取出两个灯,对这4个灯两两依次轮询变亮,与这4个灯方向对应得灯则随之一同变化,因此交通灯类中要有一个变量来记住自己相反方向得灯,在一个交通灯对象得变亮与变黑方法中,将对应方向得灯也变亮与变黑。每个灯变黑时,都伴随者下一个灯得变亮。信号灯运行周期:public class PaintThread implements Runnable public void run for (int i = 0; i redTimes+greenTimes+yellowTimes+yellowTimes; i+) if(i=0) j = 0;

10、 redStatus = true;/红灯亮 greenStatus = false; yellowStatus = false; else if(i=redTimes) j = 0; redStatus = false; greenStatus = false; yellowStatus = true;/黄灯亮 else if(i=redTimes+yellowTimes) j = 0; redStatus = false; greenStatus = true;/绿灯亮 yellowStatus = false; else if(i=redTimes+greenTimes+yellowTi

11、mes) j = 0; redStatus = false; greenStatus = false; yellowStatus = true;/黄灯亮 repaint; j+; if (i = redTimes+greenTimes+yellowTimes+yellowTimes1) i = 1; try Thread、sleep(1000); catch (InterruptedException e) e、printStackTrace; 三、 调试及测试1、调试过程中遇到得主要问题及解决方法 在调试过程中主要就是控制小车行驶比较难以实现,起初当所有面板中静态得图片处理完成后,无法将下载

12、得小车图片加入面板后进行运动操作,主要问题就是开始把小车运动想得太简单了以为完成完成下列操作即可:(1)创建Image类得对象数组car,用来缓存要演示得小车图片,(2)利用getDocumentBase函数方法获取图片信息,(3)再使用Thread、sleep方法,但就是当运行程序时会报错,显示找不到getDocumentBase,原因就是所做得程序就是Application程序,不能使用函数getDocumentBase,而使用 Im = Toolkit、getDefaultToolkit、getImage(type + 1) + 、jpg),才可完成获取图片信息得功能。2、对设计与编码得

13、回顾讨论与分析该程序得设计主要用到以下类库:import java、awt、BorderLayout;import java、awt、Color;import java、awt、Dialog;import java、awt、Graphics;import java、awt、Image;import java、awt、Toolkit;import java、awt、event、ActionEvent;import java、awt、event、ActionListener;import java、awt、event、WindowAdapter;import java、awt、event、Wind

14、owEvent;import java、awt、image、BufferStrategy;/处理与操作来自于网上得图片 定义图像对象,双缓存import java、util、ArrayList;/实现可变大小得数组import java、util、Collections;/java、util、* 就是包括集合、事件处理模式、日期时间工具等各类常用工具包import java、util、Date;import java、util、List;/list就是有序得collection,使用此接口能够精确得控制每个元素插入得位置import javax、swing、JButton;import jav

15、ax、swing、JFrame;import javax、swing、JLabel;import javax、swing、JPanel;import javax、swing、JTextField;程序中还多次用到线程控制,比如控制小车行驶线程CarRunThread,随机产生小车线程CarThread,控制红绿灯状态线程PaintThread等。下面就是程序设计中主要得类与线程:Luche类里设定了默认得红灯亮灯时间为8ms,绿灯亮灯时间为10ms,黄灯亮灯时间为3ms。创建数组car,存放小车。Paint函数用来每10ms根据既定坐标画出公路,绿地界面随机产生得小车当前得坐标值画出小车及既定

16、坐标圆形得红绿灯与亮灯倒计时时间,组成整个交通图。Lauchh函数用来启动PaintThread(红绿灯倒计时时间计算),CarThread(随机产生小车),CarRunThead(控制小车行驶)三个线程。CarThread类随机产生小车,(long)(Math、random*1200)计算出随机数,在该时间段里(0到1、2s)随机产生小车。CarRunThread类控制小车行驶,根据Type值即各个方向逐一判断该方向小车得行驶状况,以西东方向为例:Luche、this、isGreenStatus| Luche、this、isYellowStatus) & Math、abs(car、getX3

17、20)5 ) | hasObstructor(car,cars)当南北方向绿灯亮即当前方向红灯亮或者黄灯亮并且小车距离路口不到五个像素点(小车为路口第一辆)或者小车前有障碍物(小车前有车,没有可行进距离),此时小车停。继续判断下一辆小车。否则car、setX(car、getX+5);小车坐标改变,表明小车可继续前行。小车坐标值超出界面别界则移除该小车。程序每10ms对List里所有小车状态进行循环判断。其中函数hasObstructor用来判断当前小车前方就是否有障碍物,对各方向上得小车循环通过计算相邻小车之间距离即相邻小车坐标差值判断就是否有可行进距离。当相邻小车距离大于0且不足46个像素点

18、时,小车前方有障碍物。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;T

19、ype=2,小车起点坐标(235,0),为北南方向,小车图片为3、jpg;Type=3,小车起点坐标(280,1500),为南北方向,小车图片为4、jpg。CarFactory类里获得Car数组里随机产生得小车,并把产生小车值返回Car类。程序中不同得类实现不同得功能,每个功能又通过各自线程得控制,异步执行从而达到同步效果,最终完成交通灯模拟程序要求。3、程序运行得时空效率分析程序中定义图像应用到了双缓存,方便程序执行。同时程序中使用synchronizedList得到得就是同步容器,使线程同步执行,节约运行时间,程序中设定当车辆运行超出范围时则移除该车,因此已经移除得车不会再继续占用空间。但

20、就是程序中不足得就是,因为信号灯得变化间隔就是1s所以在每次隔10ms执行public void paint(Graphics g1)时,信号灯得交替时间还未到而被重画,这样会不同程度得浪费资源,不过这个程序就是小程序可能不会有大得影响,若就是扩大程序,则需进一步完善。4、测试数据集(1)默认设置信号灯持续时间: 图3 运行结果1(2)重新设置信号灯持续时间: 图4 运行结果2四、经验与体会。通过学习了近一个学期得JAVA课后,设计完成了交通灯程序,通过这个程序,我对线程有了很深得认识,对于它就是如何实现以及两个或更多得线程共同使用时如何条用得,有了更进一步得了解。学习该语言期间,明显感到它与

21、其她得高级语言不同,比起C或C+更方便使用,或许我接触得时间还不长,使用得机会还不多,尤其就是大段程序设计。另一个则就是画图,由这个程序我已基本上掌握了画图得程序写法。不过对于此程序得有些地方我觉得有必要作些说明,这样能帮助更好得理解我得方法。import java、awt、*;import java、awt、event、*;这两行就是对于程序中要用到得抽象窗口工具包做个定义。因为JAVA提供得用于语言开发得类库,称为应用程序编程接口,分别放在不同得包中。前一句就是AWT核心包,后一句就是提供事件类与监听器得包。WindowListener,ponentListener,ItemListene

22、r这一行就是对程序中用可能要用到得EVENT事件类总得声明一下,以后得程序里必须包含着各个事件类所相对应得接口。这些接口中包含所要执行得程序代码或就是调用得函数名,若就是无此接口任务时,可不写任何代码。同时,通过进一步巩固、加深了我们所学专业课程得基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题得能力。全面考核我们所掌握得基本理论知识及其实际业务能力,从而达到提高学生素质得最终目得。利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理得综合能力。对于给定得设计题目,如何进行分析,理清思路,并给出相应得数学模型。 熟练掌握J

23、AVA语言得GUI设计、多线程技术,灵活运用各种类库。五、源程序 import java、awt、BorderLayout;import java、awt、Color;import java、awt、Dialog;import java、awt、Graphics;import java、awt、Image;import java、awt、Toolkit;import java、awt、event、ActionEvent;import java、awt、event、ActionListener;import java、awt、event、WindowAdapter;import java、awt

24、、event、WindowEvent;import java、awt、image、BufferStrategy;import java、util、ArrayList;import java、util、Collections;import java、util、Date;import java、util、List; import javax、swing、JButton;import javax、swing、JFrame;import javax、swing、JLabel;import javax、swing、JPanel;import javax、swing、JTextField;public c

25、lass MainFrame extends JFrame private JLabel redlight_label = new JLabel(红灯时间: 秒); private JLabel greenlight_label = new JLabel(绿灯时间: 秒); private JLabel yellowlight_label = new JLabel(黄灯时间: 秒); private JTextField redlight_field = new JTextField; private JTextField greenlight_field = new JTextField;

26、private JTextField yellowlight_field = new JTextField; private JButton btn_set = new JButton(设置); private Luche luche = new Luche; public MainFrame setTitle(交通灯模拟程序); setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE); setSize(600, 600); setLayout(null); redlight_label、setBounds(10, 10, 200, 25); redlig

27、ht_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(greenlig

28、ht_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(new ActionListener /Override public void actionPerformed(Actio

29、nEvent arg0) try int redTimes = Integer、parseInt(redlight_field、getText); int greenTimes = Integer、parseInt(greenlight_field、getText); int yellowTimes = Integer、parseInt(yellowlight_field、getText); luche、setRedTimes(redTimes); luche、setGreenTimes(greenTimes); luche、setYellowTimes(yellowTimes); catch

30、 (NumberFormatException e) e、printStackTrace;/用来在屏幕上输出当前异常对象使用得堆栈得轨迹 ); setVisible(true); public static void main(String args) new MainFrame; class Luche extends JPanel private boolean redStatus = false, greenStatus = false, yellowStatus = false; int j = 0; private int redTimes = 8; private int greenTimes = 10; private int yellowTimes = 3; private List cars = Collections、synchronizedList(new ArrayList); Luche setBackground(Color、GREEN); public void up

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1