红绿灯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)publicListgetCars()、publicvoidsetCars(Listcars)这两个方法的作用是:
返回Car,即加Car移出,另一个是将获得Car赋给该类当中的成员变量。
(5)lauch()
该方法的作用就是:
创建是三个线程对象,分别是界面的绘制的、车子对象的创建、时间倒计时对象。
(6)其他的一些方法:
这些方法的作用就是盘对灯的颜色,然后将该类当中的成员变量附上该值。
3.随机产生车子线程类:
classCarThreadimplementsRunnable
该类的功能是实现Runnable接口功能:
在run()方法中,用while循环,在永真的条件下,将car对象添加到其中。
用try-catch处理异常,在产生异常的情况下,就输出该异常对象。
4.控制小车子行驶的线程类:
classCarRunThreadimplementsRunnable
控制的原理同上,再永真的while循环当中,产生Car对象,对其类型(所在
的位置)进行判断然后根据不同的线路将其移除(在满足条件的情况下)。
该类当中有一个方法:
privatebooleanhasObstructor(Carcar,Listcars),用来判断这个车子及其行驶的方向上是否有障碍物,在有和无的情况下分别作不同的处理。
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;itry{
Thread.sleep(1000);//暂停1秒
}catch(InterruptedExceptione){
e.printStackTrace();//输出异常所在的位置
}
结合,在没有异常的情况下,即循环的周期为1秒(时间更新周期)。
在循环周期类:
由于程序运行的时间的影响,经调试分析:
设置的红绿灯的时间应大于5秒for(inti=0;iif(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,Listcars)
分别对4个方向进行判断(选择其一方向)
if(car.getType()==0){//西->东方向
for(inti=0;iCarcar2=(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
全局变量,记录执行次数
privateListcars
动态数组存储车子线程对象
方法列表显示如下:
方法名
功能
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(Listcars)
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(redTimesgreenTimes=redTimes;
elseif(redTimes>greenTimes)
redTimes=greenTimes;
//当获得了值之后就对开始设定的进行修改luche.setRedTimes(redTimes);
luche.setGreenTimes(greenTimes);
}catch(NumberFormatExceptione){}//异常处理
}
说明:
由于程序能够运行简单,在设置时间之后,将红绿灯的时间间隔均设置为等长的。
即用上述的
if(redTimesgreenTimes=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与面向对象程序设计》清华大学出版社