还剩10页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
《J__a语言程序设计》课程设计实习报告题目班级学号姓名同组人员指导老师张彬
一、实验目的
1、掌握Swing图形用户界面编程以及__处理等,掌握j__a绘图技术
2、掌握多线程编程的基本原理,能使用Runnable、ExecutorServi__等接口进行线程的创建、启动等工作
3、培养__查找资料,并解决问题的能力
二、实验任务
1、设计并编程实现弹球游戏用户能通过GUI组件指定生成小球的数量,每个小球将从随机的位置出现,并具有随机颜色,随机速度以及随机的运动方向,小球沿初始方向匀速运动,当碰到窗口边缘时,小球将依据受力原理改变运动方向(可简化考虑,受力只改变小球的运动方向,小球仍按照初始速度匀速运动,且不考虑小球之间的碰撞)鼠标在界面中显示为方块状,玩家需按住鼠标来回__以避开运动的小球及屏幕四周,如果鼠标碰到任一小球或者窗口四周,则游戏结束程序需提供计时功能,并最终显示玩家能坚持多少秒
2、程序要求
(1)具备相应界面,并通过__编程,实现相应的GUI组件功能
(2)使用多线程技术,在程序窗口区域绘制小球,并以线程控制小球的__,实现动画效果
(3)实现鼠标与屏幕四周,以及与小球的碰撞检测
三、__工具与平台
1.__工具Eclipse默认是一个和Jbuilder类似的J__a__工具,但它不仅仅只是J__a__工具,只要装上相应的插件,eclipse也可作为其它语言的__工具如C/C++插件CDT
2.__平台JDK
1.5
四、设计思路
1.界面设计
(1)制作一个简单的面板JFrame,文件保存为bollFrame.j__a其中为一public的类bollFrame,其构造方法为bollFrameintn{super;setTitle我的弹球小游戏;setDefaultCloseOperationJFrame.EXIT_ON_CLOSE;Dimensiondimension=Toolkit.getDefaultToolkit.getScreenSize;//得到电脑屏幕大小setSize450450;setLocationdimension.width-game.getWidth/2-250dimension.height-game.getHeight/2-250;//设置面板显示基中;this.n=n;myBollPanel=newbollPaneln;//构造一个画板;addmyBollPanel;//将画板放入JFramecreateMenu;//创建菜单;setJMenuBarbar;}
(2)构造画板类,文件保存为bollPanel.j__a其构造函数如下bollPanelintn{this.n=n;//executorThread=Executors.newCachedThreadPool;//创建线程池;mouse=newmouseThreadmxNowmyNowgroupThreadthis;//启动鼠标线程;this.setIsOverfalse;//游戏开始线程条件的判断;forinti=0;in;++i{myBollThread=newbollThreadthis;groupThread.addmyBollThread;//executorThread.executemyBollThread;//小球线程加入线程池;}addMouseListenerthis;addMouseMotionListenerthis;}Paint方法如下构造publicvoidpaintGraphicsg{if!this.getIsOver//如果游戏还没结束;{super.paintg;//清除原先的图像g.setColorColor.RED;g.setFontnewFont宋体Font.BOLD+Font.ITALIC15;g.drawString你已坚持+getT+S1515;//计时器的显示;forinti=0;in;++i{//画出每个线程球intxNow=groupThread.geti.getxNow;intyNow=groupThread.geti.getyNow;g.setColorgroupThread.geti.getColor;g.fillOvalxNowyNow3030;ifxNowgetWidth-23||xNow0{//碰到左右边界;groupThread.geti.dx=-groupThread.geti.dx;}ifyNowgetHeight-23||yNow0{//碰到上下边界;groupThread.geti.dy=-groupThread.geti.dy;}groupThread.geti.setxNowxNow+groupThread.geti.getdx;//设置下一个位置;groupThread.geti.setyNowyNow+groupThread.geti.getdy;}}ifi__ouse{g.drawI__genewI__geIconboll.gif.getI__gemxNowmyNow4040this;//鼠标的图像;}}//endpaint;总体界面如下
2.逻辑设计
1.首先,我们考虑到多个小球的运动,实质上是多线程的使用,n个小球我们就同时启动n个线程去控制每个小球的运动因此我构造出一个类作为一个小球的线程,保存文件为bollThread.j__a,顾名思义,小球线程类相关构造方法如下publicbollThreadbollPanelmy{this.myPanel=my;xStart=data.nextInt200;//随机产生开始位置;yStart=data.nextInt200;setxNowxStart;////设置现在的位置;setyNowyStart;setdx;//设置随机方向使用;注意若不设置为随机,则所有小球将相同一个方向运动;setdy;}2再次,小球的出现需要有载体,这就是画板,前面界面设置中已提到过,通过让多个小球共享一个画板,以及通过线程控制小球的重绘,最后通过画板显示给用户3在第
(2)点中提到的画板上我们需要实现鼠标的监听,以下给出几个重要的鼠标__监听publicvoidmousePressedMouseEvente{//单击启动鼠标__;ife.getButton==MouseEvent.BUTTON1{copy.schedulenewtask01000;//启动定时器;forinti=0;in;++i{Threadmy=newThreadgroupThread.geti;my.start;//启动游戏,启动小球线程;}mxNow=e.getX;myNow=e.getY;i__ouse=true;if!mouse.isAlive{mouse.start;//启动鼠标线程;}}//endife.getButton==MouseEvent.BUTTON1;}//注意按下鼠标开始游戏;publicvoidmouseDraggedMouseEvente{//游戏过程中通过按住鼠标左键控制“眼睛”的__来躲避小球;mxNow=e.getX;//TODOAuto-generatedmethodstubmyNow=e.getY;ifmxNowthis.getWidth-30||mxNow=0||myNowthis.getHeight-30||myNow=0{//鼠标是否碰到边界;//executorThread.shutdown;this.setIsOvertrue;copy.can__l;JOptionPane.showMessageDialognull你撞墙了,下次小心点游戏结束提示JOptionPane.OK_OPTION;this.removeMouseListenerthis;this.removeMouseMotionListenerthis;}forinti=0;in;++i{intxNow=groupThread.geti.getxNow;intyNow=groupThread.geti.getyNow;ifisPengxNowyNowmxNowmyNow{//executorThread.shutdown;this.setIsOvertrue;copy.can__l;JOptionPane.showMessageDialognullif你撞球了{+\n+挑战失败,游戏结束.}提示JOptionPane.OK_OPTION;//System.exit0;this.removeMouseListenerthis;this.removeMouseMotionListenerthis;}//鼠标的上下左右边和球碰撞的情况,}}4如果游戏开始后我们突然松开鼠标,让我们控制的小球(或眼睛)停留在最后松开的点上,那么小球碰到它还会判断是否相撞吗?答案是可以的,我们可以通过编写一个鼠标线程类来实现,保存文件为mouseThread.j__a;让此线程在我们按下鼠标开始游戏时同时启动,在我们松开鼠标时启动判断相撞__相关的构造方法如下mouseThreadintmxNowintmyNowListbollThreadgroupbollPanelbollpane{this.mxNow=mxNow;//传入鼠标现在位置;this.myNow=myNow;this.groupThread=group;//传入小球线程组;this.bollpane=bollpane;//传入画板对象;}
3.程序测试在程序测试中,先后测试出了以下几个注意点A.在判断小球与鼠标控制的小球(“眼睛”)相撞时,条件中用到两点之间的距离问题,发现条件不能是两点距离刚好等于两相撞物体半径和,此条件太苛刻,可能引起判断的失误(概率蛮高的呵呵),而应该是小于半径和B..在小球碰撞或控制的小球(”眼睛“)碰到边界游戏结束时,已经停止了线程,小球竟然还能动,而且是缓慢__,但是判断是否碰撞及边界问题都能正常执行,与我所意料的完全相反,到现在也不知道是怎么回事,只能在paint里进行条件判断,只让bollPanel留下最后一次的个小球及“眼睛”位置C.这是最后才调试出来的,也是这个游戏中较难注意到的就是一些boolean变量的设置privatebooleanisTime;//定时器是否启动;privatebooleanisGroupThread;//所有小球线程组是否启动;privatebooleani__ouseThread;//鼠标线程是否启动;privatebooleani__ouse;//鼠标__是否启动;privatebooleanisOver;//游戏是否结束;刚开始时并没有注意到这些,如果我__鼠标左键开始游戏时,启动了小球线程,这时要设置变量isGroupThread=true标志小球线程组已启动,释放鼠标启动鼠标线程时,i__ouseThread=true让鼠标线程来控制与小球相撞的判断,定时器也在这时响应启动isTime=true开始计时,若不设置这些的话,将发生以下本质上的共同错误:等我释放鼠标后想再次控制小球,就必须在一次启动鼠标__,这时将重新启动一次计时器,重新启动一次小球线程组,重新启动鼠标线程;这样的结果是导致游戏的结果不确定性,没碰到小球(实际上已碰撞)它就检测碰撞结束游戏以及计时器的计时紊乱等具体调试后的相关代码实现见附录.
五、实验总结通过这次的程序设计,我更加明白了学以致用的道理,对线程的应用使得我更好更快的掌握了线程的本质,同时,在此次的程序设计中,经过不断地调试,是我明白了一个程序或项目要做到“精致”,是是需要花多大的精力和耐心,总之,学以致用,会将学到的知识应用到实际中才是学之根本此次实验也更了解到了线程的知识,比如一个线程stop后,不能再用start启动,而应当重新实例化,在start也就是说线程的状态转换过程(新建-就绪-运行-阻塞-死忙)是不可逆的,这是个人理解,至少从本实验中可以得到验证最后,感谢老师的指导和同学们对我的帮助