版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 java程序设计实验报告题 目 弹球游戏 姓 名 学 号 学 院 数计学院 专 业 软件工程 年 级 2009 级 指导教师 2010年 4 月 16 日一、实验目的1、 掌握swing图形用户界面编程以及事件处理等,掌握java绘图技术。2、 掌握多线程编程的基本原理,能使用runnable、executorservice等接口进行线程的创建、启动等工作。3、 培养独立查找资料,并解决问题的能力。二、实验任务1、 设计并编程实现弹球游戏:用户能通过gui组件指定生成小球的数量,每个小球将从随机的位置出现,并具有随机颜色,随机速度以及随机的运动方向,小球沿初始方向匀速运动,当碰到窗口边缘时,
2、小球将依据受力原理改变运动方向(可简化考虑,受力只改变小球的运动方向,小球仍按照初始速度匀速运动,且不考虑小球之间的碰撞)。鼠标在界面中显示为方块状,玩家需按住鼠标来回移动以避开运动的小球及屏幕四周,如果鼠标碰到任一小球或者窗口四周,则游戏结束。程序需提供计时功能,并最终显示玩家能坚持多少秒。2、 程序要求:(1) 具备相应界面,并通过事件编程,实现相应的gui组件功能。(2) 使用多线程技术,在程序窗口区域绘制小球,并以线程控制小球的移动,实现动画效果。(3) 实现鼠标与屏幕四周,以及与小球的碰撞检测。三、开发工具与平台1.开发工具:eclipse默认是一个和jbuilder类似的java开
3、发工具,但它不仅仅只 是java开发工具,只要装上相应的插件,eclipse也可作为其它语言的开发工具。如c/c+插件(cdt)。2.开发平台:jdk1.5四、设计思路1.界面设计 (1)制作一个简单的面板jframe,文件保存为bollframe.java其中为一public的类 bollframe,其构造方法为:bollframe(int n)super(); settitle(我的弹球小游戏);setdefaultcloseoperation(jframe.exit_on_close);dimension dimension = toolkit.getdefaulttoolkit().g
4、etscreensize();/得到 电脑屏幕大小setsize(450,450);setlocation(dimension.width-game.getwidth()/2-250, (dimension.height-game.getheight()/2-250);/设置面板显示基中;this.n = n;mybollpanel = new bollpanel(n);/构造一个画板; add(mybollpanel);/将画板放入jframecreatemenu();/创建菜单;setjmenubar(bar);(2)构造画板类,文件保存为bollpanel.java 其构造函数如下:bo
5、llpanel(int n) this.n = n;/ executorthread = executors.newcachedthreadpool();/创建线程池; mouse = new mousethread(mxnow,mynow,groupthread,this);/启动鼠标线程; this.setisover(false);/游戏开始线程条件的判断; for(int i =0 ;in;+i)mybollthread =new bollthread(this);groupthread.add(mybollthread);/executorthread.execute(mybollt
6、hread);/小球线程加入线程池; addmouselistener(this); addmousemotionlistener(this);paint()方法如下构造: public void paint(graphics g) if(!this.getisover() /如果游戏还没结束; super.paint(g);/清除原先的图像 g.setcolor(color.red); g.setfont(new font(宋体,font.bold+font.italic,15); g.drawstring(你已坚持:+gett()+s, 15, 15);/计时器的显示; for(int i
7、 = 0;i(getwidth()-23)|xnow(getheight()-23)|ynow0)/碰到上下边界;groupthread.get(i).dy = -groupthread.get(i).dy; groupthread.get(i).setxnow(xnow+groupthread.get(i).getdx();/ 设置下一个位置; groupthread.get(i).setynow(ynow+groupthread.get(i).getdy(); if(ismouse) g.drawimage(new imageicon(boll.gif).getimage(), mxnow
8、, mynow, 40,40, this);/鼠标的图像; /end paint();总体界面如下:2.逻辑设计(1).首先,我们考虑到多个小球的运动,实质上是多线程的使用,n个小球我们就同时启动n个线程去控制每个小球的运动。因此我构造出一个类作为一个小球的线程,保存文件为bollthread.java,顾名思义,小球线程类。相关构造方法如下: public bollthread(bollpanel my) this.mypanel = my; xstart = data.nextint(200);/随机产生开始位置; ystart = data.nextint(200); setxnow(x
9、start);/设置现在的位置; setynow(ystart); setdx();/设置随机方向使用;注意:若不设置为随机,则所有小球将相同一个方向运动; setdy(); (2)再次,小球的出现需要有载体,这就是画板,前面界面设置中已提到过,通过让多个小球共享一个画板,以及通过线程控制小球的重绘,最后通过画板显示给用户。(3)在第(2)点中提到的画板上我们需要实现鼠标的监听,以下给出几个重要的鼠标事件监听:public void mousepressed(mouseevent e) /单击启动鼠标事件; if(e.getbutton()=mouseevent.button1) copy.s
10、chedule(new task(), 0,1000);/启动定时器; for(int i =0 ;i(this.getwidth()-30)|mxnow(this.getheight()-30)|mynow=0)/鼠标是否碰到边界; / executorthread.shutdown(); this.setisover(true); copy.cancel(); joptionpane.showmessagedialog(null, 你撞墙了,下次小心点。游戏结束,提示 ,joptionpane.ok_option); this.removemouselistener(this); this
11、.removemousemotionlistener(this); for(int i =0 ;in;+i) int xnow =groupthread.get(i).getxnow(); int ynow = groupthread.get(i).getynow(); if(ispeng(xnow,ynow,mxnow,mynow) / executorthread.shutdown(); this.setisover(true); copy.cancel(); joptionpane.showmessagedialog(null, if(你撞球了)+n+挑战失败,游戏结束.,提示 ,jop
12、tionpane.ok_option); /system.exit(0); this.removemouselistener(this); this.removemousemotionlistener(this); /鼠标的上下左右边和 球碰撞的情况, (4) 如果游戏开始后我们突然松开鼠标,让我们控制的小球(或眼睛)停留在最后松开的点上,那么小球碰到它还会判断是否相撞吗?答案是可以的,我们可以通过编写一个鼠标线程类来实现,保存文件为mousethread.java;让此线程在我们按下鼠标开始游戏时同时启动,在我们松开鼠标时启动判断相撞事件。相关的构造方法如下:mousethread(int
13、mxnow,int mynow,listgroup,bollpanel bollpane)this.mxnow = mxnow;/传入鼠标现在位置;this.mynow = mynow;this.groupthread = group;/传入小球线程组;this.bollpane = bollpane;/传入画板对象;3. 程序测试在程序测试中,先后测试出了,以下几个注意点:a. 在判断小球与鼠标控制的小球(“眼睛”)相撞时,条件中用到两点之间的距离问题,发现条件不能是两点距离刚好等于两相撞物体半径和,此条件太苛刻,可能引起判断的失误(概率蛮高的呵呵),而应该是小于半径和。b. .在小球碰撞或
14、控制的小球(”眼睛“)碰到边界游戏结束时,已经停止了线程,小球竟然还能动,而且是缓慢移动,但是判断是否碰撞及边界问题都能正常执行,与我所意料的完全相反,到现在也不知道是怎么回事,只能在paint() 里进行条件判断,只让bollpanel留下最后一次的个小球及“眼睛”位置。c.这是最后才调试出来的,也是这个游戏中较难注意到的。 就是一些boolean变量的设置: private boolean istime;/定时器是否启动; private boolean isgroupthread;/所有小球线程组是否启动; private boolean ismousethread;/鼠标线程是否启动;
15、 private boolean ismouse;/鼠标事件是否启动; private boolean isover;/游戏是否结束; 刚开始时并没有注意到这些,如果我点击鼠标左键开始游戏时,启动了小球线程,这时要设置变量isgroupthread = true标志小球线程组已启动,释放鼠标启动鼠标线程时,ismousethread = true让鼠标线程来控制与小球相撞的判断,定时器也在这时响应启动 istime =true开始计时,若不设置这些的话,将发生以下本质上的共同错误: :等我释放鼠标后想再次控制小球,就必须在一次启动鼠标事件,这时将重新启动一次计时器,重新启动一次小球线程组,重新
16、启动鼠标线程;这样的结果是导致游戏的结果不确定性,没碰到小球(实际上已碰撞)它就检测碰撞结束游戏。以及计时器的计时紊乱等。具体调试后的相关代码实现见附录.。五、实验总结 通过这次的程序设计,我更加明白了学以致用的道理,对线程的应用使得我更好更快的掌握了线程的本质,同时,在此次的程序设计中,经过不断地调试,是我明白了一个程序或项目要做到“精致”,是是需要花多大的精力和耐心,总之,学以致用,会将学到的知识应用到实际中才是学之根本。 此次实验也更了解到了线程的知识,比如:一个线程stop后,不能再用start启动,而应当重新实例化,在start()。也就是说线程的状态转换过程(新建-就绪-运行-阻塞
17、-死忙)是不可逆的,这是个人理解,至少从本实验中可以得到验证。 最后,感谢老师的指导和同学们对我的帮助。 6、 附录 以下是调试后的相关算法实现:a: public boolean ispeng(int xnow,int ynow,int mxnow,int mynow)/利用两点之间的距离算法,判断是否撞球int x1 = xnow+15,y1 = ynow+15;int x2 = mxnow+20,y2 = mynow+20;int mulx = x1-x2,muly = y2 -y1;double sum = math.pow(muly, 2)+math.pow(mulx, 2);if(
18、summath.pow(35, 2)/注意是小于! return true;else return false; b: public void paint(graphics g) if(!this.getisover() /在此判断游戏是否结束; super.paint(g);/清除原先的图像 g.setcolor(color.red); g.setfont(new font(宋体,font.bold+font.italic,15); g.drawstring(你已坚持:+gett()+s, 15, 15); for(int i = 0;i(getwidth()-23)|xnow(gethei
19、ght()-23)|ynow0)/碰到上下边界;groupthread.get(i).dy = -groupthread.get(i).dy; groupthread.get(i).setxnow(xnow+groupthread.get(i).getdx(); groupthread.get(i).setynow(ynow+groupthread.get(i).getdy(); if(ismouse) g.drawimage(new imageicon(boll.gif).getimage(), mxnow, mynow, 40,40, this); /end paint();c :(1)public void mousepressed(mouseevent e) /单击启动鼠标事件; if(e.getbutton()=mouseevent.button1) if(ismousethread)/鼠标线程是否活着; mouse.stop(); ismousethread = false; if(!istime) copy.schedule(new task(), 0,1000);/启动定时器; istime = true; if(!isgroupthread) for(int i =0 ;i(this.getwidt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北师大版小学五年级下册语文全册教案
- 利用智能图像处理技术提升防伪效果
- 2024高中地理第六章人类与地理环境的协调发展章末总结提升练含解析新人教版必修2
- 2024高中生物第4章种群和群落第3节群落的结构课堂演练含解析新人教版必修3
- 2024高考物理一轮复习第八章恒定电流实验10练习使用多用电表学案新人教版
- 2024高考化学一轮复习第4章非金属及其化合物第12讲氯及其化合物卤族元素学案
- 2024高考历史一轮复习方案专题三现代中国的政治建设祖国统一与对外关系专题整合备考提能教学案+练习人民版
- 2024高考地理一轮复习第一章第2讲地球的自转及地理意义教案含解析新人教版
- (4篇)2024年幼儿园家访工作总结
- 2024年湖北交通职业技术学院高职单招职业技能测验历年参考题库(频考版)含答案解析
- 一年级语文上册《两件宝》教案1
- 咨询公司工作总结(共5篇)
- pcs-985ts-x说明书国内中文版
- GB/T 38836-2020农村三格式户厕建设技术规范
- 小品《天宫贺岁》台词剧本手稿
- 京东商业计划书课件
- 医院患者伤口换药操作课件
- 肥料采购验收单模板
- 部编版五年级下册语文根据课文内容填空(常用)
- 中铁集团会计核算手册
- 伤口护理小组工作总结共34张课件
评论
0/150
提交评论