java版的贪吃蛇毕业论文.docx

上传人:夺命阿水 文档编号:1298504 上传时间:2024-06-05 格式:DOCX 页数:21 大小:146.83KB
返回 下载 相关 举报
java版的贪吃蛇毕业论文.docx_第1页
第1页 / 共21页
java版的贪吃蛇毕业论文.docx_第2页
第2页 / 共21页
java版的贪吃蛇毕业论文.docx_第3页
第3页 / 共21页
java版的贪吃蛇毕业论文.docx_第4页
第4页 / 共21页
java版的贪吃蛇毕业论文.docx_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《java版的贪吃蛇毕业论文.docx》由会员分享,可在线阅读,更多相关《java版的贪吃蛇毕业论文.docx(21页珍藏版)》请在课桌文档上搜索。

1、贪吃蛇姓名:摘要:本文用J2SE实现大家耳熟能详的一个贪吃蛇游戏来综合运用所学知识,本游戏运用软件工程思想(螺旋模型),打好游戏主体框架,JAVA的面向对象思想,封装类,接口等概念,来完成本游戏,打到综合运用知识的目的。(1) .本游戏开发平台:WINXP:(2) .JAVA开发环境:JDKl.6+Eclipse;(3) .开发语言:J2SE关键词:中央控制器;游戏面板;食物;蛇;石头TheGreedSnakeAbstract:Inthispaper,J2SEimplementationofaSnakegamefamiliartotheintegrateduseofwhattheyhaveIe

2、amed,thisgameistheuseofsoftwareengineeringthinking(spiralmodel),themainframeworkofthefightgame,JAVAobject-orientedthinking,wrapperclasses,interfaceconceptstocompletethisgame,hittingtheintegrateduseofknowledgeandpurpose.(1) .Thegamedevelopmentplatform:WINXP;(2) .JAVADevelopmentEnvironment:JDK1.6+Ecli

3、pse;(3) .DevelopmentLanguages:J2SEKeywords:COntrOller;GamePane1;Food;Snake;GrOUnd前言贪吃蛇游戏背景:蛇引诱夏娃吃了苹果之后,就被贬为毒虫,阴险的象征。而蛇吃东西是整只动物吞进去的,大概在文艺复兴的时候(好象是那个时候但是不确定)就有人发明的一种游戏,是现在贪吃蛇的前身。后来慢慢的发展就变成了今天的贪吃蛇了、现在贪吃蛇主要应用于手机游戏。本文运用软件工程思想、JAVA面向对象编程、类的封装、抽象类的使用(接口),游戏编码规范遵循MVC模式,循序渐进实现贪吃蛇的相关功能。一:游戏中的面向对象分析与设计涉及到几个对象(

4、类)每个类有什么方法1 .首先得有个游戏显示面板(GamePaneI)类该类有一个方法voiddisplay();用来显示游戏面板2 .得有个蛇(SlIake)类该类有以下几个方法:voidmove();移动(走一步)voidChangeDireCtioIl0;改变方向voideatFood();吃食物(身体变长)VooleanisEatBody();蛇是否吃到了自己的身体voiddrawMe();显示3 .一个食物类(Food)类该类有以下方法:booleanisSlIakeEatFOod(SlIake);判断蛇是否吃到了食物voidCiraWMe();显示4 .一个背景石头(GrOUlId

5、)类该类有以下方法:BooleanisSnakeEatRock(Snake);蛇是否吃到了石头voiddrawMe();显示此时类之间的关系如下图所示:二:编写贪吃蛇游戏中的各个类的主体框架性代码本有序遵循MVC(ModeI-View-ControIIer)所以首先建立以上几个实体类并定义相应的包名:liang.snake.entities包下定义Food、GroundSnake三个类,再在IiaiIg.snake.view包下定义GamePalIel类,再在,按照以上说明的各个类具有的方法,写上如下代码:packageIiang.snake.entities;publicclassFoodp

6、ublicbooleanIsSnakeEatFood(Snakesnake)(System.out.printin(Snake,seatfood);returnfalse;publicvoiddrawme()(System.out.printin(,Food,sdrawme,);packageIiang.snake.entities;publicclassGroundpublicbooleanIsSnakeEatRock()returnfalse;publicvoiddrawme()(System.out.printin(,Ground,sdrawme,);packageIiang.snake

7、.entities;publicclassSnakepublicvoidmove()System.out.printin(Snakesmove,);publicvoidChangeDirection(intdirection)ChangeDirection);System.out.printin(Snake,spublicvoideatFood()(System.out.printin(Snakeseatfood);publicbooleanIsEatBody()(System.out.printin(Snake,seatbody);returnfalse;publicvoiddrawMe()

8、System.out.printin(,Snake,sdrawMe);packageIiang.snake.view;importjava.awt.Graphics;importjavax.swing.JPanel;importIiang.snake.entities.Food;importIiang.snake.entities.Ground;importIiang.snake.entities.Snake;publicclassGamePanelextendsJPanelprivateSnakesnake;privateGroundground;privateFoodfood;public

9、voidpaintComponent(Graphicsg)snake.drawMe();ground.drawme();food.drawme();publicvoiddisplay(SnakesnakezGroundground,Foodfood)(this.snake=snake;this.ground=ground;this.food=food;System.out.printin(GamePanel,sdisplay);this.repaint();三:编写ControIer类与实现蛇移动的事件监听由于蛇不能直接操作显示面板(GamePaiIeD所以这里定义一个监听器SnakeList

10、ener:里面定义一个方法:voidSnakeMove(Snake);每当蛇移动一步就触发监听器,调用SilakeMOVed()由Controller去实现监听器的接口,然后由控制器去触发显示面板的事件源,让显示面板完成相应操作。逻辑图如下:通过事件监听建立联系图2事件监听建立联系在Sllake中增加蛇的方向常量:public static finalint UP=I;public static finalint DOWN=-I;public static finalint LEFT=2;public staticfinal int RIGHT=-2;并添加一个接口:packageIiang.

11、snake.Listener;importIiang.snake.entities.Snake;publicinterfaceSnakeListenerpublicvoidSnakeMove(Snakesnake);Controler实现SnakeListener接口并处理案件消息:代码如下:packageIiang.snake.Controller;importjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;importIiang.snake.Listener.SnakeListener;importIiang.snake.en

12、tities.Food;importIiang.snake.entities.Ground;importIiang.snake.entities.Snake;importIiang.snake.view.GamePanel;PubIiCclassControllerextendsKeyAdapterimplementsSnakeListenerSnakesnake=newSnake();Groundground=newGround();Foodfood=newFood();GamePanelgamepanel=newGamePanel();publicController(Snakesnake

13、zGroundground,FoodfoodzGamePanelgamepanel)this.snake=snake;this.ground=ground;this.food=food;this.gamepanel=gamepanel;pxblicvoidkeyReleased(KeyEvente)switch(e.getKeyCode()(caseKeyEvent.VK_UP:snake.ChangeDirection(Snake.UP);break;caseKeyEvent.VK_DOWN:snake.ChangeDirection(Snake.DOWN);break;caseKeyEve

14、nt.VK_LEFT:snake.ChangeDirection(Snake.LEFT);break;caseKeyEvent.VK_RIGHT:snake.ChangeDirection(Snake.RIGHT);break;publicvoidnewgame()snake.start();publicvoidSnakeMove(Snakesnake)gamepanel.display(snake,ground,food);开发到此时,Snake中应该增加监听器,并另启动一个线程来不断调用蛇的move();在Snake中提供一个启动线程的方法,在Snake中增加如下代码:privateSet

15、listener=newHashSet();publicvoidaddSnakeListener(SnakeListener1)if(1!=null)this.listener.add(1);publicvoidstart()(newThread(newSnakeDriver().run();并在RUn方法中增加for(SnakeListener1:listener)(1.SnakeMove(Snake.this);try(Thread.sleep(100O);catch(InterruptedExceptione)e.printStackTrace();四:编写对各个类进行测试的程序代码构建

16、一个新类Game来测试程序代码:packageIiang.snake.Game;importjava.applet.AudioClip;importjava.awt.BorderLayout;importjava.io.File;.MalformedURLException;.URL;importjavax.swing.JFrame;importIiang.snake.Controller.Controller;importIiang.snake.entities.Food;importIiang.snake.entities.Ground;importIiang.snake.entities

17、.Snake;importIiang.snake.view.GamePanel;publicclassGamepublicstaticvoidmain(Stringargs)JFramejf=newJFraIne(”我的论文”);Snakesnake=newSnake();Groundground=newGround();Foodfood=newFood();GamePanelgamepanel=newGamePanel();Controllercontroller=newController(snake,ground,food,gamepane1);jf.SetDefaultcioseOpe

18、ration(JFrame.EXIT_ON_CLOSE);jf.SetLocation(400zO);jf.setSize(800z600);jf.add(gamepane1);jf.addKeyListener(controller);snake.addSnakeListener(controller);jf.SetVisible(true);controller.newgame();运行这个带有main。的类,在Eclipse的Console窗口中可以看到如下信息:Snake,smoveGamePanel,SdisplaySnakesdrawMeGround,sdrawmeFood,sdr

19、awmeSnake,sdrawMeGround,sdrawmeFood,sdrawmeSnakesmoveGamePanelsdisplaySnake,sdrawMeGroundsdrawmeFood,sdrawme这就意味着,当蛇移动一次,就触发监听器,有控制器(COntrOIIer)给GamePanel发送指令,让它重画,GamePanel中的publicvoiddisplay(Snakesnake,Groundground,Foodfood)(System,out.printin(nGamePanel,sdisplay*1);this.snake=snake;this.ground=gr

20、ound;this.food=food;this.repaint();这个方法依次画出几个实体,所以打印出上述信息。到了这一步我们的基本框架打好了,下面开始第5步五:蛇的数据结构设计与移动显示分析:要区分蛇头和蛇尾巴,这就要求这个数据结构是有序的,还要经常访问第一个和最后一个节点,所以LinkedList最合适,因为它有getFirst(),getLast()方法和removeLast()方法蛇下一步移动到哪是由方向控制的,前面已经定义过,蛇透坐标如下图:根据原蛇头和方向计算新蛇头的坐标X坐标01234向上移动y坐标减1向左移动X坐标减1向下移动y坐标加1向右移动X坐标加1图3蛇头方向计算新蛇

21、头坐标在SlIake的move。中增加body.removeLast();intx=body.getFirst().x;inty=body.getFirst().y;switch(direction)(caseUP:y-;break;caseDOWN:y+;break;caseLEFT:一;break;caseRIGHT:x+;break;Pointnewhead=newPoint(x,y);/加头body.addFirst(newhead);并定义privateintdirection;为了能更方便的维护游戏,这里定义Global类来定义常量如下:packageIiang.snake.Glo

22、bal;publicclassGlobalpublicstaticfinalintCELL_SIZE=20;publicstaticintHIGHT=30;publicstaticintWIDTH=30;并修改游戏中窗口大小为:jf.setSize(Global.CELL_SIZE*Global.WIDTH,Global.CELL_SIZE*Global.HIGHT);再加上如下代码,对蛇初始化:publicSnake()(init();publicvoidinit()(intX=Global.WIDTH/2;inty=Global.HIGHT/2;intnodenum=3;for(inti=

23、0;inodenum;i+)(body.addFirst(newPoint(x+zy);this.direction=RIGHT;在蛇的drawMe(Graphicsg)中些上如下让蛇显示的代码:这里的画图采用填充3D矩形来实现:for(Pointp:body)(g.fill3DRect(p.x*Global.CELL_SIZE,p.y*Global.CELL_SIZE,Global.CELL_SIZEzGlobal.CELL_SIZE,true);画图的规则如下图;格子坐标和像素坐标这个点的像素坐标为X坐标:格子的宽度Mefty坐标:格子的高度*topleft是这泌壬距左边界的距离top是这

24、个格子距上边界的距离图4计算格子坐标和像素坐标此时运行Game类就可以看到蛇显示在面板中了,如图:图5显示面板显示的蛇但是蛇越走越长,是因为没有擦除以前的图像,在GamePanel的paintcomponent(Graphicsg)中添力口如下代码:g.SetColor(newColor(Oxcfcfcf);g.fill3DRect(0zOzGlobal.CELL_SIZE*Global.WIDTHGlobal.CELL_SIZE*Global.HIGHTztrue);此时蛇就可以正常移动了如图:图6移动中的蛇通过按键改变移动方向,此时的蛇身体节点显示为白色,我们再在蛇的绘制方法中位器指定颜色

25、:代码如下:六:试与修正蛇的移动与显示问题此时的蛇当移动到窗口边界的时候就能走出窗口还有蛇可以穿过自己的身体,这些游戏规则中式不允许的,下面来修正这些问题,修改Snake中的move。方法如下:首先定义PUbliCintOlddirection,newdirection;防止蛇穿过自己身体:publicvoidmove()(/去尾if(olddirection+newdirection!=0)(olddirection=newdirection;body.removeLast();intx=body.getFirst().x;inty=body.getFirst().y;switch(Oldd

26、irection)(caseUP:if(y=Global.HIGHT)(y=0;break;caseLEFT:一;if(x=Global.WIDTH)break;Pointnewhead=newPoint(x,y);/加头body.addFirst(newhead);System.out.printin(Snake,smove,);publicvoidChangeDirection(intdirection)(System.out.printin(SnakesChangeDirection);newdirection=direction;并修改蛇的初始化方法如下:Olddirection=ne

27、wdirection=RIGHT;此时就修正了上面的问题,可以运行Game类来测试下七:编写与测试表示食物的类并实现吃食物首先在SIIake类中添加publicPointgetHead()(returnbody.getFirst();用来获取头结点,然后再Food类中写上如下代码:packageIiang.snake.entities;importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Point;importIiang.snake.Global.Global;publicclassFoodextendsPointpublic

28、voidnewfood(Pointp)(this.SetLocation(p);publicbooleanisSnakeEatFood(Snakesnake)System.out.printin(Snake,seatfood);returnthis.equals(snake.getHead();publicvoiddrawme(Graphicsg)(System.out.printin(Food,sdrawme,);g.fill3DRect(this.x*Global.CELL_SIZE,this.y*Global.CELL_SIZE,Global.CELL_SIZE,Global.CELL_

29、SIZEztrue);此时就可以画出食物并判断蛇是否吃到了食物,接下来就可以在Controller中处理吃食物的代码,吃了食物我们只要把先前移动去除的尾巴再给加上就实现了蛇吃食物身体变长的效果了,如下:定义PointoldTail;在蛇move()中保存去除的尾巴:oldTail=body.removeLast();在Controller中的SnakeMove(Snakesnake)中海力口if(food.isSnakeEatFood(snake)(snake.eatFood();food.newfood(ground.getPoint();并在Snake中的eatFood()中增加如下代码:

30、body.addLast(oldTail);此时要运行游戏依赖与下一步的石头处理中的getPoint()方法实现随机产生食物下面开始继续开发:八:为游戏增加作为障碍物的石头这里添加石头我们用2维数组来表示,置1则为石头,否则为空,在Ground类中写上如下代码:packageIiang.snake.entities;importjava.awt.Color;importjava.awt.Graphics;importjava.awt.Point;importjava.util.Random;importIiang.snake.Global.Global;publicclassGroundpri

31、vatestaticintrocks=newintGlobal.WIDTHGlobal.HIGHT;publicstaticColorshitou=null;publicGround()(for(intx=0;xGlobal.WIDTH;x+)(rocksx0=1;rocksxGlobal.HIGHT-1=1;Shitou=Color.RED;publicvoidclear()(for(intx=0;xGlobal.WIDTH;*+)(for(inty=0;yGlobal.HIGHT;y+)rocksxy=0;publicbooleanIsSnakeEatRock(Snakesnake)(fo

32、r(intx=0;xGlobal.WIDTH;x+)for(inty=0;yGlobal.HIGHT;y+)if(rocksxy=l&x=snake.getHead().x&y=snake.getHead().y)(returntrue;)returnfalse;publicstaticPointgetPoint()(Randomrandom=newRandom();intx=0,y=0;dox=random.nextlnt(Global.WIDTH);y=random.nextlnt(Global.HIGHT);while(rocksxy=1);returnnewPoint(xzy);pub

33、licvoiddrawme(Graphicsg)(System.out.printin(Ground,sdrawme”);for(intx=0;xGlobal.WIDTH;x+)for(inty=0;yGlobal.HIGHT;y+)(if(rocksxy=l)(g.setcolor(shitou);true);g.fill3DRect(x*Global.CELL_SIZE,y*Global.CELL_SIZEzGlobal.CELL_SIZEzGlobal.CELL_SIZEz再在各个调用方法中填上相应参数,运行Game类,效果如图:图8添加了食物、石头后的图为窗口数值大小增加35PX因为此

34、时的窗口标题栏占用了些空间,导致下面的石头没有显示出来,修改Game类中的jf.setSize(Global.CELL_SIZE*Global.WIDTH+10,Global.CELL_SIZE*Global.HIGHT+35);再测试,效果显示完全正常下面继续开发:九:为蛇增加吃到石头而死掉的功能这里我们采用吃食物一样的方式,当舌头的坐标与石头重合时,就让蛇死掉,至于蛇死掉我们只需要将Snake中的县城结束掉即可,所以我们在Snake中定义booleanlife=true;当蛇头坐标与石头坐标重合的时候只要将此变量设置为false,用life作为蛇线程的循环条件,具体代码如下:定义蛇的die

35、方法publicvoiddie()(life=false;JOptionPane.ShowMessageDialog(Game.jfz”您控制的蛇因为意外死亡,呜呼哀哉,死的可真惨啊”游戏结束“,2);System.out.printin(Thesnakeisdead);并将Game类中的PUbIiCstaticJFramejf=newJFrame(我的论文”);放到main方法前面,下面测试游戏,如下图:图9蛇吃到食物后死亡当蛇吃到石头就死亡了!十:为蛇增加吃到蛇身而死掉的功能:同样我们用舌头去便利蛇身体,当舌头鱼蛇身体重合时则调用蛇的die();代码如下:修改Snake中publicboo

36、leanIsEatBody()(System.out.printin(,Snakeseatbody);for(inti=l;ibody.size();i+)(if(body.get(i).equals(this.getHead()returntrue;returnfalse;并在Controller中的SnakeMove(Snakesnake)中增加如下代码:if(snake.isEatBody()(snake.die();运行游戏测试效果如下图所示:图10蛇吃到身体后死亡到此时贪吃蛇的基本功能已经基本实现由于篇幅有限只写到这,源码以及帮助文档附件我随后贴上!请读者参照我附上的文件包!结束语:通过上述游戏开发过程,我们对J2SE的面向对象设计思想,抽象类的使用(接口)以及软件工程思想有了一次综合性的练习,设计游戏中遇到的逻辑错误,可以通过ECIiPSe的DebUg来进行调试,培养我们的思维,逻辑能力。参考文献:1张孝祥-JAVA就业培训教程2软件工程-西安电子科技大学出版社3胡伏湘,雷军环.Java程序设计实用教程.清华大学出版社,2005.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号