JAVA吃豆豆项目报告.docx
- 文档编号:24022696
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:16
- 大小:291.79KB
JAVA吃豆豆项目报告.docx
《JAVA吃豆豆项目报告.docx》由会员分享,可在线阅读,更多相关《JAVA吃豆豆项目报告.docx(16页珍藏版)》请在冰豆网上搜索。
JAVA吃豆豆项目报告
PINGDINGSHANUNIVERSITY
专业实训(四)
项目报告
题目:
基于JAVA的吃豆豆游戏开发
院(系):
软件学院
专业年级:
10级
姓名:
苏振鹏
学号:
101530140
指导教师:
黄淼
2012年6月1日
目录
PINGDINGSHANUNIVERSITY0
1项目简介2
1.1项目意义2
1.2项目说明2
1.3关键技术3
2总体设计3
2.1主类设计3
2.2各个模块的设计4
3详细设计与实现6
3.1地图的刷新绘制6
3.2地图路径与豆豆路径的生成7
3.3碰撞检测代替的实现9
3.4怪物自动路径的设置10
3.5被怪物追到以及吃到豆豆的检测12
4项目截图13
4.1主界面13
4.2游戏积分14
4.3游戏失败14
5项目说明14
5.1游戏程序打包14
6结论15
1项目简介
1.1项目意义
实现小时候PC上经典游戏,吃豆子。
练习JAVA基础技能。
掌握图片绘制方法,刷新方法。
以及多线程的使用,文件读取与操作,字符串的分析等诸多技能。
完成课程设计。
1.2项目说明
吃豆豆游戏规则介绍:
黄色的是吃豆豆主角,你需要把画面内所有白色的小豆豆都吃掉,而同时又有数个各种颜色的怪物追杀。
如果被怪物追上,代表游戏失败并结束。
如果吃光了所有白色小豆豆,那么恭喜你,您过关了。
游戏操作:
空格开始游戏,按上下左右键控制主角移动方向。
1.3关键技术
本项目采用JAVA编程语言进行开发。
使用JFrame做窗体,Graphice做画笔绘制图形。
其中关键技术包括:
1、画面的绘制与更新。
2、怪物自动行进路线的设计。
3、吃豆豆方向的控制。
4、豆豆被吃掉以及主角被怪物抓到的检测。
5、更新吃豆豆得到的分数。
6、地图的生成与制作
7、地图集的解析
8、碰撞检测的代替
2总体设计
2.1主类设计
共包含8个类。
分别是主类EatBean、界面类Frame、主角类Bean、豆豆类Food、怪物类Monster、资源类StaticValue、豆豆路径类MakeFood、行走路径类MakeMap
2.2各个模块的设计
Frame类:
继承JFrame类,在paint方法中,实现对界面的绘制,并将界面线绘制到缓存中,再绘制到界面上,避免出现刷新闪烁现象。
地图直接采用背景图片,无须绘制方式。
用了特殊的方法处理了与地图的碰撞处理。
将在随后的详细设计中介绍。
实现KeyListener与Runnable接口。
初始化声明主角、豆豆、怪物类。
监听KeyListener中的keyPressed方法,获取键盘上VK_UP、下VK_DOWN、左VK_RIGHT、右VK_LEFT、空格VK_SPACE来开始游戏,并调用Bean类的控制方法来控制主角的上下左右的行动。
Runnable接口中的run方法负责每30毫秒调用repaint方法重绘地图,刷界面。
addSoucre方法,当主角吃下一个豆豆的时候调用改方法。
并判定是否吃完所有的豆豆,如果吃完所有豆豆,判断游戏获胜,停止怪物的移动。
并在游戏界面中心显示youwin。
gameOver方法,当怪物追到主角的时候,调用该方法。
判定游戏结束,显示youlose。
writeMap方法在程序中未被执行。
是制作地图的时候需要使用的方法,以保存行走路径。
Bean类:
包含属性x,y,tx,ty,image,listPonit,listFood,makeMap,monsters等。
实现部分属性的get方法。
初始化中,获取怪物数组以及食物数组。
利用left、right、up、down来改变想x,y坐标来实现主角的移动。
并讲值先赋予tx,ty临时坐标。
检测tx,ty是否在行动路线坐标集中。
如果存在,表明可以移动,则将tx,ty赋予x,y。
否则不可移动,对tx,ty进行还原,即不做移动处理。
主角将不能移动。
继承Runnable接口,在run方法中完成对吃食物已经被怪物追到的判断处理。
因为3方都是在既定路线中行进。
只需判断是否出现坐标重复既可,但是为了避免出现相邻都无事,进行泛判断。
只要在一个很近的距离内,都会被判断吃到豆豆货被怪物追上。
如果吃到豆豆,就调用该对象的dead方法,如果被怪物追上,则调用自身的dead方法,并调用Frame类的游戏结束方法。
Food类:
包含属性x,y,life,hasAdd。
实现部分属性的get方法其中dead方法来控制豆豆是否显示,并且调用Frame的addSoucer方法,增加游戏积分。
利用hasAdd属性,控制多次调用dead方法导致积分不正常现象。
Monster类:
与Bean类相似,不过因为怪物需要自己实现行走,所以没有外部调用怪物的方向方法,继承Runnable接口,在Run方法中实现怪物的自动行走方法。
因为在Bean中已经实现了追到主角的判断,所以不需要在Moster中实现该判断。
并且声明的Moseter较多,使用该方法,造成程序效率稍低。
在详细介绍中会介绍关于怪物自动寻路的设计。
goon与go方法用来实现怪物的自动行走,自动寻路。
MakeFood、MakeMap类:
分别获取目录下的map.txt和food.txt,并进行解析,分别获取Point数组和Food数组,并返回。
StaticVaule类:
资源类,将所有图片资源读取到BufferedImage中,并设置为静态对象。
提供别的类使用
3详细设计与实现
3.1地图的刷新绘制
地图的刷新在Frame类中完成,Frame类继承JFrame对象,实现其paint方法。
除Food对象外,所有对象均在paint方法中绘制。
首先生成创建imgae,获取image的画笔Graphics,利用Graphics完成游戏界面的绘制。
Food类的绘制,遍历Food集合,向Food类的paint方法传入画笔。
绘制背景,主角,怪物。
Food对象用自身方法绘制自己。
另绘制积分字段,根据游戏胜利或失败绘制游戏状态。
最后讲image画入Frame中,完成界面的绘制过程。
Frame继承了Runnable方法,在其run方法中,每30毫秒,调用repaint方法,重绘场景,完成地图场景的刷新。
publicvoidpaint(Graphicsg)
{
//TODO自动生成方法存根
BufferedImageimage=newBufferedImage(570,720,BufferedImage.TYPE_3BYTE_BGR);
Graphicsg2=image.getGraphics();
//绘制主角
g2.drawImage(StaticValue.background,0,25,this);
g2.drawImage(bean.getImage(),bean.getX(),bean.getY(),this);
//绘制怪物
g2.drawImage(monster1.getImage(),monster1.getX(),monster1.getY(),this);
g2.drawImage(monster2.getImage(),monster2.getX(),monster2.getY(),this);
g2.drawImage(monster3.getImage(),monster3.getX(),monster3.getY(),this);
g2.drawImage(monster4.getImage(),monster4.getX(),monster4.getY(),this);
g2.drawImage(monster5.getImage(),monster5.getX(),monster5.getY(),this);
g2.drawImage(monster6.getImage(),monster6.getX(),monster6.getY(),this);
g2.drawImage(monster7.getImage(),monster7.getX(),monster7.getY(),this);
g2.drawImage(monster8.getImage(),monster8.getX(),monster8.getY(),this);
//绘制豆豆
Iterator
while(iterator.hasNext())
{
Foodfood=iterator.next();
food.Paint(g2);
}
//绘制积分
Stringstr="现在的积分:
"+source;
g2.drawString(str,15,700);
//胜利
if(winGame)
{
Stringstrs="YouWin";
g2.drawString(strs,270,335);
}
if(loseGame)
{
Stringstrs="YouLose";
g2.drawString(strs,270,700);
}
g.drawImage(image,0,0,this);
}
3.2地图路径与豆豆路径的生成
游戏初始化时,通过初始化对象MakeFood和MakeMap类,读取目录下map.txt和food.txt获取路径。
15:
570表示坐标点,-区分不同的坐标点。
利用字符串的split方法,将每个每个坐标点取出,生成Point对象,并存入ArrayList
Stringmap=newString(buffer);
String[]point=map.split("-");
Set
for(inti=0;i { String[]p=point[i].split(": "); if(! p[0].equals("")&&! p[1].equals("")) { intx=Integer.parseInt(p[0]); inty=Integer.parseInt(p[1]); Pointpoint2=newPoint(x,y); points.add(point2); } } Iterator while(it.hasNext()){ listPoint.add(it.next());//Set转化List } 该坐标点,是在程序制作初期。 利用Frame类中的writeMap方法实现。 该方法使得,主角移动路线自动保存下来。 在生成地图路径的时候,只需要遍历行走所有主角和怪物规定可以行走的路线即可。 仅仅生成允许行走路线的坐标点。 豆豆类的坐标点类似,添加对空格的监听,如果主角行走在该位置,按下空格,变保存这个坐标点。 这些坐标点讲用于随后生成豆豆的位置。 3.3碰撞检测代替的实现 该游戏并不对主角进行碰撞检测,而是使用了替代方法。 省去了地图绘制过程。 地图只需要背景图片即可,方便绘制各种地图。 利用之前所生成的坐标点集合。 主角并不对地图边缘进行碰撞检测。 因为之前已经将全部可行走路经点生成。 只需要判断主角行走路径是否在该集合内即可。 只要在集合内的坐标点行动,就不会出现和地图边缘碰撞的情况,也就不必再做碰撞碰撞检测。 publicbooleanup() { ty-=5; if(listPoint.contains(newPoint(tx,ty))) { y=ty; }else{ ty+=5; returnfalse; } returntrue; } 主角或怪物移动的时候,先改变tx、ty临时坐标,判断临时坐标是否在坐标集中。 如果在,将临时坐标赋予坐标。 否则恢复临时坐标,将无法移动。 用这种方法替代了传统的边缘检测。 3.4怪物自动路径的设置 怪物的自动路径是用随机变量生成的。 怪物的上下左右方法,比主角多了返回值。 如果可以继续前进,再返回true。 如果不能,再返回false。 根据随机数,让怪物前进。 如果无法继续前进,再换方向。 随机数种子是获取当前时间做随机数种子。 因为每个怪物的启动时间有延迟。 所以每个怪物的随机数种子不一样,保证每个怪物的行走路线不一样。 publicvoidrun() { try { Thread.sleep(time*300); }catch(InterruptedExceptione1) { //TODOAuto-generatedcatchblock e1.printStackTrace(); } while(true&&! Frame.winGame) { goon(); try { Thread.sleep(60); }catch(InterruptedExceptione) { //TODOAuto-generatedcatchblock e.printStackTrace(); } } } publicvoidgoon() { Randomrandom; if(! go(go)) { random=newRandom(newjava.util.Date().getTime()+type*10); go=(Math.abs(random.nextInt()))%4; } } publicbooleango(inti) { switch(i) { case0: returnthis.up(); case1: returnthis.down(); case2: returnthis.left(); case3: returnthis.right(); } returntrue; } 继承Runnable接口,在run方法中,让怪物不断调用goon()方法。 以此实现怪物的自动寻走方法。 3.5被怪物追到以及吃到豆豆的检测 继承Runnable接口,在run方法中完成对吃食物已经被怪物追到的判断处理。 因为3方都是在既定路线中行进。 只需判断是否出现坐标重复既可,但是为了避免出现相邻都无事,进行泛判断。 只要在一个很近的距离内,都会被判断吃到豆豆货被怪物追上。 如果吃到豆豆,就调用该对象的dead方法,如果被怪物追上,则调用自身的dead方法,并调用Frame类的游戏结束方法。 publicvoidrun(){ //TODO自动生成方法存根 while(true) { Iterator Monstermonster; while(iterator.hasNext()) { monster=iterator.next(); if((this.getX()==monster.getX())&&(this.getY()==monster.getY())) dead(); if((this.getX()==monster.getX()+5)&&(this.getY()==monster.getY()+5)) dead(); if((this.getX()==monster.getX()+5)&&(this.getY()==monster.getY()-5)) dead(); if((this.getX()==monster.getX()-5)&&(this.getY()==monster.getY()+5)) dead(); if((this.getX()==monster.getX()-5)&&(this.getY()==monster.getY()-5)) dead(); } Iterator Foodfood; while(iterator2.hasNext()) { food=iterator2.next(); if((this.getX()==food.getX())&&(this.getY()==food.getY())) food.dead(); if((this.getX()==food.getX()+5)&&(this.getY()==food.getY()+5)) food.dead(); if((this.getX()==food.getX()+5)&&(this.getY()==food.getY()-5)) food.dead(); if((this.getX()==food.getX()-5)&&(this.getY()==food.getY()+5)) food.dead(); if((this.getX()==food.getX()-5)&&(this.getY()==food.getY()-5)) food.dead(); } } } 4项目截图 4.1主界面 4.2游戏积分 4.3游戏失败 5项目说明 5.1游戏程序打包 首先编写一个清单文件如下: Moon.mf Manifest-Version: 1.5 Main-Class: EatBean//主类的类名 Created-By: 1.5(SunMicrosystemsInc.) 然后在Dos同一目录下面生成EatBean.jar文件,命令如下: jarcfmEatBean.jarMoon.mf所有用到的.class文件,中间用空格隔开或者jarcfmEatBean.jarMoon.mf*.class 6结论 在整个系统的需求分析过程中对开发前期工作地流程步骤有了深入的掌握;在开发过程我进一步学习了Java的基础语法,在整个系统开发的过程中,我学到了很大新的知识,前学过的许多知识点在运用过程中也有了更为深入的分析。 并且同时更加熟练使用工具Eclipse。 最初对系统没有一个完整的概貌,考虑不是很全面,所以系统功能实现时,碰到不少困难,但是我还是学习到了很多的技术性的知识。 在进行了一番全面的详细设计以后,设计思路也更加明确。 在以后的开发设计中,我要学会进行详细设计后再开始代码的编写。 对程序结构进行分析,用软件工程的知识进行软件开发。 同时,要认真学习JAVA基础知识,基础扎实,才能开发更完善的程序。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 豆豆 项目 报告