课程设计报告交通灯模拟程序论文.doc

上传人:韩长文 文档编号:3972028 上传时间:2019-10-11 格式:DOC 页数:24 大小:297.50KB
返回 下载 相关 举报
课程设计报告交通灯模拟程序论文.doc_第1页
第1页 / 共24页
课程设计报告交通灯模拟程序论文.doc_第2页
第2页 / 共24页
课程设计报告交通灯模拟程序论文.doc_第3页
第3页 / 共24页
课程设计报告交通灯模拟程序论文.doc_第4页
第4页 / 共24页
课程设计报告交通灯模拟程序论文.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《课程设计报告交通灯模拟程序论文.doc》由会员分享,可在线阅读,更多相关《课程设计报告交通灯模拟程序论文.doc(24页珍藏版)》请在三一文库上搜索。

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

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

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

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车道都会被阻断。所以在设计红绿灯时,可以两两组合,共有两组(0-1、2-3);而各车道中车辆行驶时间按照交通灯设计时间来

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

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

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

8、type = (int) (Math.random()*(new Date().getTime()*10)%4);随机产生四个方向的小车。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;redStatus = true; /红灯

10、亮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+yellowTimes)j = 0;redStatus = false;gree

11、nStatus = false;yellowStatus = true; /黄灯亮repaint();j+;if (i = redTimes+greenTimes+yellowTimes+yellowTimes-1)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),完成获取图片信息的功能。在确保程序正确的情况下,运行时小车的图片仍然没有出现;最后不得

13、不使用一个小圆代表小车,2、对设计和编码的回顾讨论和分析该程序的设计主要用到以下类库:import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.ArrayList; /实现可变大小的数组import java.util.Collections; /java.util.* 是包括集合、事件处理模式、日期时间工具等各类常用工具包import ja

14、va.util.Date;import java.util.List; /list是有序的collection,使用此接口能够精确的控制每个元素插入的位置import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField;程序中还多次用到线程控制,如控制小车行驶线程CarRunThread,随机产生小车线程CarThread,控制红绿灯状态线程PaintThread等。下面是程序设计中主要的类和

15、线程:Cross类(十字路口)里设定了默认的红灯亮灯时间为10ms,绿灯亮灯时间为10ms,黄灯亮灯时间为3ms。创建数组car,存放小车。Paint()函数用来每10ms根据既定坐标画出公路,粉红色界面随机产生的小车当前的坐标值画出小车及既定坐标圆形的红绿灯和亮灯倒计时时间,组成整个交通图。Lauch()函数用来启动PaintThread(红绿灯倒计时时间计算),CarThread(随机产生小车),CarRunThead(控制小车行驶)三个线程。CarThread类随机产生小车,(long)(Math.random()*1200)计算出随机数,在该时间段里(0到1.2s)随机产生小车。Car

16、RunThread类控制小车行驶,根据Type值即各个方向逐一判断该方向小车的行驶状况,以西-东方向为例:Cross.this.isGreenStatus()| Cross.this.isYellowStatus() & Math.abs(car.getX()-320)5 ) | hasObstructor(car,cars)当南北方向绿灯亮即东西方向红灯亮或者黄灯亮并且小车距离路口不到五个像素点(小车为路口第一辆)或者小车前有障碍物(小车前有车,没有可行进距离),此时小车停。继续判断下一辆小车。否则car.setX(car.getX()+5),小车坐标改变,表明小车可继续前行。小车坐标值超出

17、界面别界则移除该小车。程序每50ms对List里所有小车状态进行循环判断。其中函数hasObstructor用来判断当前小车前方是否有障碍物,对各方向上的小车循环通过计算相邻小车之间距离即相邻小车坐标差值判断是否有可行进距离。当相邻小车距离大于0且不足30个像素点时,小车前方有障碍物。PaintThread线程里面控制了三个灯的亮灯时间,设置全局变量j=0,记录各灯的已亮灯时间,继而用用户设置的亮灯时间减去已亮时间,得到亮灯倒计时。红灯时间+绿灯时间+两倍黄灯时间为一个周期,线程每1s循环统计一次。Car类里,计算了小车方向随机值:type=(int)(Math.random()*(newDa

18、te().getTime()*10)%4);随机产生四个值0,1,2,3 Type=0,小车起点坐标(0,240),为西-东方向; Type=1,小车起点坐标(1500,240),为东-西方向;Type=2,小车起点坐标(235,0),为北-南方向;Type=3,小车起点坐标(280,1500),为南-北方向。CarFactory类里获得Car数组里随机产生的小车,并把产生小车值返回Car类。程序中不同的类实现不同的功能,每个功能又通过各自线程的控制,异步执行从而达到同步效果,最终完成交通灯模拟程序要求。3、程序运行的时空效率分析程序中定义图像应用到了双缓存,方便程序执行。同时程序中使用syn

19、chronizedList得到的是同步容器,使线程同步执行,节约运行时间,程序中设定当车辆运行超出范围时则移除该车,因此已经移除的车不会再继续占用空间。但是程序中不足的是,因为信号灯的变化间隔是1s所以在每次隔10ms执行public void paint(Graphics g1)时,信号灯的交替时间还未到而被重画,这样会不同程度的浪费资源,不过这个程序是小程序可能不会有大的影响,若是扩大程序,则需进一步完善。4、测试数据(1)默认设置信号灯持续时间,南北红灯,东西绿灯图3 运行结果1 (2)默认设置信号灯持续时间,南北黄灯,东西黄灯图4 运行结果2 (3)默认设置信号灯持续时间,南北绿灯,东

20、西红灯图5 运行结果3(4)重新设置信号灯持续时间,南北红灯,东西绿灯图4 运行结果4(5)重新设置信号灯持续时间,南北黄灯,东西黄灯图5 运行结果5(6)重新设置信号灯持续时间,南北绿灯,东西红灯图6 运行结果6四、经验和体会。通过学习了近一个学期的JAVA课后,设计完成了交通灯程序,通过这个程序,我对线程有了很深的认识,对于它是如何实现以及两个或更多的线程共同使用时如何条用的,有了更进一步的了解。学习该语言期间,明显感到它与其他的高级语言不同,比起C或C+更方便使用,或许我接触的时间还不长,使用的机会还不多,尤其是大段程序设计。另一个则是画图,由这个程序我已基本上掌握了画图的程序写法。不过

21、对于此程序的有些地方我觉得有必要作些说明,这样能帮助更好的理解我的方法。import java.awt.*;import java.awt.event.*;这两行是对于程序中要用到的抽象窗口工具包做个定义。因为JAVA提供的用于语言开发的类库,称为应用程序编程接口,分别放在不同的包中。前一句是AWT核心包,后一句是提供事件类和监听器的包。WindowListener,ComponentListener,ItemListener这一行是对程序中用可能要用到的EVENT事件类总的声明一下,以后的程序里必须包含着各个事件类所相对应的接口。这些接口中包含所要执行的程序代码或是调用的函数名,若是无此接口

22、任务时,可不写任何代码。同时,通过进一步巩固、加深了我们所学专业课程的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。全面考核我们所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。 熟练掌握JAVA语言的GUI设计、多线程技术,灵活运用各种类库。五、源程序package Traffic;import java.awt.Color;import java.awt.Gra

23、phics;import java.awt.Image;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.ArrayList;/实现可变大小的数组import java.util.Collections;/java.util.* 是包括集合、事件处理模式、日期时间工具等各类常用工具包import java.util.Date;import java.util.List;/list是有序的collection,使用此接口能够精确的控制每个元素插入的位置import jav

24、ax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;/无边框容器import javax.swing.JTextField;public class TrafficLight extends JFrame/具有边框的容器private static final long serialVersionUID = -6854335226474596144L;private JLabel redlight_label = new JLabel(红灯时间: 秒);/标

25、签private JLabel greenlight_label = new JLabel(绿灯时间: 秒);private JLabel yellowlight_label = new JLabel(黄灯时间: 秒);private JTextField redlight_field = new JTextField();/文本框private JTextField greenlight_field = new JTextField();private JTextField yellowlight_field = new JTextField();private JButton btn_se

26、t = new JButton(设置);private Cross cross = new Cross();public TrafficLight()setTitle(交通灯模拟程序);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/当点击关闭按钮时,退出setSize(600, 600);/窗口大小setLayout(null);redlight_label.setBounds(10, 10, 200, 25);/设置窗口位置和大小,初始位置(10,10),宽度为200像素,高度为25像素redlight_field.setBounds(70,

27、 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(yellow

28、light_label);add(redlight_label);btn_set.setBounds(400, 10, 80, 25);/设置按钮的大小,初始位置为(400,10)参数单位为像素cross.setBounds(0, 50, 2000, 2000);/整个十字路口的大小add(cross);cross.lauch();/启动路口(包括红绿灯倒计时,往路中随机添加小车和控制小车的行驶方向)add(btn_set);btn_set.addActionListener(new ActionListener()/为按钮注册监听public void actionPerformed(Act

29、ionEvent arg0) try int redTimes = Integer.parseInt(redlight_field.getText(); int greenTimes = Integer.parseInt(greenlight_field.getText(); int yellowTimes = Integer.parseInt(yellowlight_field.getText(); cross.setRedTimes(redTimes); cross.setGreenTimes(greenTimes); cross.setYellowTimes(yellowTimes);

30、catch (NumberFormatException e) e.printStackTrace();/用来在屏幕上输出当前异常对象使用的堆栈的轨迹);setVisible(true);public static void main(String args) /主函数new TrafficLight();class Cross extends JPanel private static final long serialVersionUID = -6174068071511812667L;private boolean redStatus = false, greenStatus = fal

31、se, yellowStatus = false;int j = 0; /全局变量,用来记录交通灯已经亮过的时间private int redTimes = 10;private int greenTimes = 10;private int yellowTimes = 3;private List cars = Collections.synchronizedList(new ArrayList();/创建一个数组 car /因为头上已经引入了指定的包,只要使用类名来创建就可以了, synchronizedList得到的是同步容器Cross() /构造函数setBackground(Colo

32、r.blue);public void paint(Graphics g1) Image image = createImage(2000, 2000); Graphics g = image.getGraphics();/创建供绘制闭屏图像使用的图形上下文Color c = g.getColor();g.setColor(Color.pink);g.fillRect(0, 0, 2000, 2000);/整一个粉红色区域g.setColor(new Color(76,74,70);g.fillRect(0, 180, 2000, 100);/东西方向g.fillRect(220, 0, 10

33、0, 1000);/南北方向g.setColor(Color.white);g.drawLine(0, 230, 2000, 230);/东西方向的分隔线g.setColor(Color.white);g.drawLine(270, 0, 270, 1000);/南北方向的分隔线g.setColor(Color.black);for(int i = 0;i cars.size();i + )Car car = (Car) cars.get(i);/获取列表中的车赋给Car类g.fillOval(car.getX(), car.getY(), 10,10);if (redStatus = tru

34、e) /南北方向红灯亮g.setColor(Color.RED);g.fillOval(270, 165, 15, 15);/画圆(交通灯),北面的红灯g.fillOval(255, 280, 15, 15);/南面的红灯g.drawString(redTimes-j+, 250, 178);/北面的时间g.drawString(redTimes-j+, 270, 293);/南面的时间g.setColor(Color.GREEN);g.fillOval(320, 260, 15, 15);/东面的绿灯g.fillOval(205, 185, 15, 15);/西面绿灯g.drawString

35、(redTimes-j+, 320, 225);/东面的时间g.drawString(redTimes-j+, 200, 245);/西面的时间 else g.setColor(Color.BLACK);g.fillOval(270, 165, 15, 15);g.fillOval(255, 280, 15, 15);g.fillOval(320, 260, 15, 15);g.fillOval(205, 185, 15, 15); if (yellowStatus = true) g.setColor(Color.YELLOW);g.fillOval(285, 165, 15, 15);/北

36、面的黄灯g.fillOval(240, 280, 15, 15);/南面的黄灯g.drawString(yellowTimes-j+, 250, 178);g.drawString(yellowTimes-j+, 270, 293);g.fillOval(320, 245, 15, 15);/东面的黄灯g.fillOval(205, 200, 15, 15);/西面的黄灯g.drawString(yellowTimes-j+, 320, 225);g.drawString(yellowTimes-j+, 200, 245); else g.setColor(Color.BLACK);g.fil

37、lOval(285, 165, 15, 15);g.fillOval(240, 280, 15, 15);g.fillOval(320, 245, 15, 15);g.fillOval(205, 200, 15, 15);if (greenStatus = true) g.setColor(Color.GREEN);g.fillOval(300, 165, 15, 15);g.fillOval(225, 280, 15, 15);g.drawString(greenTimes-j+, 250, 178);g.drawString(greenTimes-j+, 270, 293);g.setCo

38、lor(Color.RED);g.fillOval(320, 230, 15, 15);g.fillOval(205, 215, 15, 15);g.drawString(greenTimes-j+, 320, 225);g.drawString(greenTimes-j+, 200, 245); else g.setColor(Color.BLACK);g.fillOval(300, 165, 15, 15);g.fillOval(225, 280, 15, 15);g.fillOval(320, 230, 15, 15);g.fillOval(205, 215, 15, 15);g.set

39、Color(c);g1.drawImage(image,0, 0, null);try Thread.sleep(10); catch (InterruptedException e) repaint();public boolean isRedStatus() return redStatus;public void setRedStatus(boolean redStatus) this.redStatus = redStatus;public boolean isGreenStatus() return greenStatus;public void setGreenStatus(boo

40、lean greenStatus) this.greenStatus = greenStatus;public boolean isYellowStatus() return yellowStatus;public void setYellowStatus(boolean yellowStatus) this.yellowStatus = yellowStatus;public int getRedTimes() return redTimes;public void setRedTimes(int redTimes) this.redTimes = redTimes;public int g

41、etGreenTimes() return greenTimes;public void setGreenTimes(int greenTimes) this.greenTimes = greenTimes;public int getYellowTimes() return yellowTimes;public void setYellowTimes(int yellowTimes) this.yellowTimes = yellowTimes;public List getCars() return cars;public void setCars(List cars) this.cars

42、 = cars;public void lauch() /启动线程new Thread(new PaintThread().start();new Thread(new CarThread().start();new Thread(new CarRunThread().start();setVisible(true);class CarThread implements Runnable/随机产生小车public void run() while(true)cars.add(CarFactory.getCar();try Thread.sleep(long)(Math.random()*120

43、0);/random()产生的随机数大于0小于1.0 catch (InterruptedException e) e.printStackTrace();class CarRunThread implements Runnable/控制小车的行驶public void run() while(true)for(int i = 0;i 2000)cars.remove(car);i-;continue;if(Cross.this.isGreenStatus()|Cross.this.isYellowStatus()& Math.abs(car.getX()-210)5 ) | hasObstructor(car,cars)continue;e

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1