红绿灯JAVA课程设计报告.docx
- 文档编号:11958984
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:20
- 大小:203.84KB
红绿灯JAVA课程设计报告.docx
《红绿灯JAVA课程设计报告.docx》由会员分享,可在线阅读,更多相关《红绿灯JAVA课程设计报告.docx(20页珍藏版)》请在冰点文库上搜索。
红绿灯JAVA课程设计报告
合肥学院
计算机科学与技术系
课程设计报告
2012~2013学年第一学期
课程
课程设计名称学生姓名
学号
专业班级
指导教师
2013
JAVA语言
JAVA语言课程设计朱鹏飞
1104011011
11级计本(3)班檀明、张艳明
年
1月
一、课程设计目的
通过课程设计,学生在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《JAVA语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用JAVA语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)熟练掌握JAVA语言的GUI设计、多线程技术,灵活运用各种类库。
二、课程设计名称及内容
名称:
交通灯模拟程序
内容:
设计一个交通灯管理的模拟程序,实现在一个十字路口的交通管理三、任务和要求
1.设计程序界面,画出十字路口和交通灯。
2.可以手工设置红、绿等的时间间隔,程序按设定值自动变换每个路口的交通灯颜色。
3.随机产生一些车辆,这些车辆遵守红灯停、绿灯行的交通规则。
四、设计方案提示
分别设置两个线程代表东西和南北方向的交通灯,根据设定值变换交通灯颜色
每个车辆对应一个线程,利用线程技术实现车辆的红灯停、绿灯行的行为五、总体设计思路
从实验的要求上看,要实现交通灯的管理,需要解决的问题有两大部分:
(一)绘制出交通灯及路口上的线路,以界面的形式展现出来。
以此作为程序运行的一个进程。
(二)程序对交通灯时间按计数器进行监听,倒计时时间为0的时候就进行切换。
同时设置文本框,当操作员将时间写入文本框当中之后,点击确定按钮就将程序中的红绿灯的时间重置。
以此作为一个线程。
(三)随机在各个路口产生车辆,符合条件则通过,不符合条件则暂停。
以此作为程序运行的另一个进程。
程序中用到的6个类,介绍如下:
1.主类:
TrafficLight
该类是从Jframe类中继承过来的,该类当中定义了文本框、文本区、按钮这些对象成员变量。
然后,在主类的构造方法中,设置窗口的大小并将这些组添加到窗口容器当中。
这些组建是采用默认的顺序布局,根据设定的大小和其实位置添加到容器中。
为“确定”按钮注册监听器,对其动作进行监听。
在try-catch中处理的是:
从文本框中获取数据并将其转换成整型作为红绿灯的时间,在对设置的红绿灯时间进行修改。
异常处理的方式是输出当前异常所产生的位置。
在主方法当中,是创建一个TrafficLight类的对象,通过构造方法来实现所需的功能。
2.绘制窗口的类Luche
该类是JPanel类的子类,该类当中含有的方法及其作用如下:
(1)该类当中的一个构造方法Luche()
该方法的功能是将被十字路分割成的四块区域的背景设置为绿色。
(2)绘制界面的方法(即该类中程序的执行入口):
publicvoidpaint(Graphicsg1)
设置十字路口,即根据具体的坐标绘制两个构成“十”字的道路。
再根据车子的位置用for循环创建对象,以车子对象的两个成员变量(横纵坐标值)作为绘制填充圆的圆心所在位置,以及根据相应的矩形大小绘制填充圆。
对这几个灯进行判断,在其位红色、绿色的情况下,对其进行不同的处理。
加载图片对象,用try-catch对异常处理,加载是时间间隔为10毫秒。
(3)repaint()方法,循环的调用paint()方法。
(4)publicList
返回Car,即加Car移出,另一个是将获得Car赋给该类当中的成员变量。
(5)lauch()
该方法的作用就是:
创建是三个线程对象,分别是界面的绘制的、车子对象的创建、时间倒计时对象。
(6)其他的一些方法:
这些方法的作用就是盘对灯的颜色,然后将该类当中的成员变量附上该值。
3.随机产生车子线程类:
classCarThreadimplementsRunnable
该类的功能是实现Runnable接口功能:
在run()方法中,用while循环,在永真的条件下,将car对象添加到其中。
用try-catch处理异常,在产生异常的情况下,就输出该异常对象。
4.控制小车子行驶的线程类:
classCarRunThreadimplementsRunnable
控制的原理同上,再永真的while循环当中,产生Car对象,对其类型(所在
的位置)进行判断然后根据不同的线路将其移除(在满足条件的情况下)。
该类当中有一个方法:
privatebooleanhasObstructor(Carcar,List
5.时间倒计时:
publicclassPaintThreadimplementsRunnable
这个方法主要作用是对倒计时的时间进行根性,根性的周期在try-catch中进行控制,设置为1秒。
5.车子类:
classCar
该类当中的一个构造方法:
用一个随机数产生器产生随机0-3这四个随机整数,由这4个数来确定产生的车子的起始坐标,即确定车子的行驶方向。
同时,这里有6个方法对这些车子对象的3个成员变量进行赋值。
6.创建车子的类:
classCarFactory
该类当中只有一个方法,这个方法就是使创建一个Car类的对象,并返回这个类对象。
六、具体设计
各个类之间的关系:
主类:
TrafficLight
绘制窗口类的对象
该类父类:
Jframe
标签对象:
greenlight_label、
Luchelucheredlight_label
作为成员变量
文本框对象:
redlight_field、
greenlight_field
按钮对象:
btn_set
容器类的子类:
classLucheextendsJPanel
用循环创建Car类的对象
绘图类对象Graphicsg(闭屏获取图片)Graphicsg1(播放图片)
创建并启动3个线程对象
newPaintThread()newCarThread()newCarRunThread()
车运动的类CarRunThrea
时间倒计时(类):
产生小车的类:
PaintThreaCarThread
实现Runnable接口
实现Runnable接口
实现Runnable接口
同时调用了CarFactory类中的方法
创建并返回Car对象
以上各个类的具体实现如下:
1.Car类:
通过产生0-3之间的随机数,初始化3个成员变量。
3个成员变量
包含的方法
对应的方法的功能
车子所在横坐标privateintx
getX()、setX(intx)
获取横坐标、设置横坐标为当前获取的值
车子所在纵坐标privateinty
getY()、setY(inty)
获取纵坐标、设置纵坐标为当前纵坐标
车子行驶的方向
privateinttype;
getType()、
setType(inttype)
获取编号、设置编号为
当前编号(即车子的行驶方向)
2.产生车子的类:
classCarFactory
该类当中仅有一个静态方法:
publicstaticCargetCar()
执行的语句:
returnnewCar();
其功能就是穿件Car对象,同时返回该对象。
3.时间倒计时的类:
publicclassPaintThreadimplementsRunnable
变量j:
全局变量(记录显示的时间)
执行的方法:
publicvoidrun()
方法中执行了一个循环:
for(inti=0;i try{ Thread.sleep(1000);//暂停1秒 }catch(InterruptedExceptione){ e.printStackTrace();//输出异常所在的位置 } 结合,在没有异常的情况下,即循环的周期为1秒(时间更新周期)。 在循环周期类: 由于程序运行的时间的影响,经调试分析: 设置的红绿灯的时间应大于5秒for(inti=0;i if(i==0){//程序开始运行 j=0;//开始设置南北方向红灯亮,东西方向绿灯亮redStatus=true; greenStatus=false; } elseif(i==redTimes){ j=0;//当时间周期到来时,两路口的交通灯也进行切换 redStatus=false; greenStatus=true; } elseif(i==redTimes+greenTimes){ j=0;//实际是不能出现的状态(即所有方向上的灯都不 亮) redStatus=false; greenStatus=false; } repaint(); j++;//执行周期的记录 if(i==redTimes+greenTimes) i=-1; } 实现的功能是: 在执行周期内循环执行交通灯颜色的切换,在达到周期的前一秒,将计时变量重新设置到初始状态。 4.控制车子运动的类: classCarRunThreadimplementsRunnable 方法一: publicvoidrun() 外循环: while(true)//条件为永真 内循环: for(inti=0;i 实现的功能判断如下: (以一个条件为例) if(car.getType()==0)//对对象的类型进行判断 { if(car.getX()>2000) {//条件是已经超出了界面的边界范围,将其移除cars.remove(car); i--; continue;//结束本次循环跳转至下次循环 } if((Luche.this.isGreenStatus()&&Math.abs(car.getX()- 210)<5)||hasObstructor(car,cars)) {continue;}//条件是: //绿灯是是亮的但车距边界已小于 5像素或者是车子不可移动 else {car.setX(car.getX()+5);}//在满足移动的条件下,将车子 的右移5个像素单位 } 这个进程的周期是: Thread.sleep(50);//进程暂停50毫秒 方法二: 判断是否有障碍物 privatebooleanhasObstructor(Carcar,List 分别对4个方向进行判断(选择其一方向) if(car.getType()==0){//西->东方向 for(inti=0;i Carcar2=(Car)cars.get(i);//从已有的车子线程中取出下一个线程对象赋给当前新创建的对象 intdistance=(car2.getX()-car.getX());//判断这两个对象之间的距离if(car2.getType()==0&&distance<30&&distance>0) returntrue;//没有障碍物的条件是: 两者距离在30像素之间 } } 在不成立的条件下,返回false,但只用了一个。 因为在每次用到的时候,看上去是有4个判断,但真正只会执行其中一个(单线程)。 5.随机产生小车的线程 在while(true)循环体中执行: 添加车子: cars.add(CarFactory.getCar()); 进程的周期为1秒: Thread.sleep((long)(Math.random()*1200)); 6.绘制界面的类: classLucheextendsJPanel 变量列表显示如下: 变量名、类型及修饰符 功能 privateBooleanredStatus 控制南北方向的红灯,初值为false privateBooleangreenStatus 控制东西方向的绿灯,初值为false privateintredTimes 记录红灯时间周期 privateintgreenTimes 记录绿灯的时间周期 intj=0 全局变量,记录执行次数 privateList 动态数组存储车子线程对象 方法列表显示如下: 方法名 功能 Luche() 构造方法,仅用来设置界面的背景颜色 paint() 创建的对象有: Imageimage、Graphicsg、Colorc=g.getColor();//创建颜色类对象,并获取当期的颜色; Carcar=(Car)cars.get(i);//用循环创建Car类对象,赋上的值是已存在的对象数组中的同类对象; if(redStatus==true){//南北方向红灯亮 即: 根据对象的值,绘制交通灯的位置和颜色 publicvoid setRedStatus(boolean redStatus) this.redStatus=redStatus;//给当前对象附上更新之后的值 publicboolean isGreenStatus() returngreenStatus; publicvoid setGreenStatus(boolean greenStatus) this.greenStatus=greenStatus; publicint getRedTimes() returnredTimes;//获取文本框中的红灯设置时间 publicvoid setRedTimes(int redTimes) this.redTimes=redTimes;//更新红灯设置时间 publicint getGreenTimes() returngreenTimes; publicvoid setGreenTimes(int greenTimes) this.greenTimes=greenTimes; publicList getCars() returncars;//返回从动态数组中产生车子对象 Publicvoid setCars(List this.cars=cars;//将该时间点上的车子对象赋值给正在执行的车子线程 publicvoidlauch() 创建3个线程 newThread(newPaintThread()).start(); newThread(newCarThread()).start(); newThread(newCarRunThread()).start(); 7.主类: publicclassTrafficLightextendsJFrame (1)含有的成员 ①标签: privateJLabelredlight_label=newJLabel("红灯时间: 秒"); privateJLabelgreenlight_label=newJLabel("绿灯时间: 秒"); ②文本框: privateJTextFieldredlight_field=newJTextField(); privateJTextFieldgreenlight_field=newJTextField(); ③按钮 privateJButtonbtn_set=newJButton("设置"); ④容器类的子类对象 privateLucheluche=newLuche(); (2)方法: 构造方法: publicTrafficLight() 实现的功能是: 添加组件, 动作处理: publicvoidactionPerformed(ActionEventarg0){//该方法对发生在按钮上的事件进行处理 //异常处理 try{ intredTimes= Integer.parseInt(redlight_field.getText());//获取设置时间的文本框中的文本并转换成整形 intgreenTimes= Integer.parseInt(greenlight_field.getText()); if(redTimes greenTimes=redTimes; elseif(redTimes>greenTimes) redTimes=greenTimes; //当获得了值之后就对开始设定的进行修改luche.setRedTimes(redTimes); luche.setGreenTimes(greenTimes); }catch(NumberFormatExceptione){}//异常处理 } 说明: 由于程序能够运行简单,在设置时间之后,将红绿灯的时间间隔均设置为等长的。 即用上述的 if(redTimes greenTimes=redTimes; elseif(redTimes>greenTimes) redTimes=greenTimes; 解决该问题。 主方法功能: newTrafficLight();//创建对象,通过构造方法的调用使程序运行 程序运行的结果: 1.未手动设置红绿灯的时间: 2.手动设置时间之后: (1)第一组测试数据: (2)第二组测试数据: 七、总结 Java课程设计编写的程序是不仅要实现一个单一的功能,而且是要对一个任务做多个操作,并将这些功能合理的组合到一起。 这样更加适用于对现实问题的解决能力。 比如,我所做的的课题: 十字路口红绿灯模拟,不仅要用GUI绘制图形,而且还要用两个线程分别对交通灯和车辆进行处理。 通过这样一次比较大的实验,提高了我将所学的各个知识点综合到一起应用,而且还学到了以前没有学到的知识,比如: 将java和数据库SQLserver相连接。 实现java语言对数据库的操纵。 令我印象最深的一点就是,在课程设计的时候,可以检查到自己平时学习的疏漏点。 比如: 在编写对时间计数的时候处理的情况少了一种 elseif(i==redTimes+greenTimes){ j=0; redStatus=false; greenStatus=false; } 一旦,在文本框中输入数据的时候,程序就会运行错误,时间就异常的终止,导致红绿灯不能进行切换。 这个错误,让我明白了: 在编程时,对于时间的处理的时候要考虑全面,这样才能增加程序的健壮性。 但有时确实就不能考虑那么全面,所以就要反复调试(选择不同的测试数据)。 检错与改错的能力还是要靠多写一些程序,多分析,掌握经验。 在这次课程设计当中,通过对一个对象的功能的逐步分解、细化,在用类、方法来完成每一个小的细节,最终通过在组合实现总体的功能了。 通过这次课程设计,我也想向学校里提一些建议: 最重要的一点就是时间安排问题上,一个是时间安排的太少了,因为java课程设计要实现的功能是很多的,并且java的内容多;另一个就是时间安排的不合理,安排在最后两周,但这段时间会有很多课程要考试,所以还要有时间来复习,这样就更紧张,导致很多学生的程序不是自己来思考和编写的。 这样,课程设计也就不会达到预期的作用啦! 八、其它 程序设计可在Eclipse、JDK1.5或JBuilder环境下实现 九、参考资料 [1] [2] [3] [4] 吕凤羽、马皓《JAVA程序设计》清华大学出版社耿祥义《JAVA课程设计》清华大学出版 黄小东《Java课程设计案例精编》中国水利水电出版社印旻《Java与面向对象程序设计》清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 红绿灯 JAVA 课程设计 报告