




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、贪吃蛇是一款非常经典的手机游戏。它有很多算法,这里详细分析一种比较优秀的算法。首先介绍下主要用到的七个类:WormMain:最主要的类,控制所有其它类的运行和销毁。WormPit:处理键盘输入事件并实例化 Worm 类和 WormFood 类的。Worm:抽象了贪吃蛇的属性和动作WormFood:抽象了食物的属性和动作WormScore:用来纪录分数的类WormLink:抽象了蛇身上的一段,保存了这段的坐标、方向和所有状态。WormException:处理异常类基本概念介绍节:一条蛇可以看成有许多正方形的小格子”拼凑成,我把它称作节。节是蛇身上最小的单位。段:当许多节连成一条直线,我称它为段。
2、上图的贪吃蛇只有一段,如果它拐弯就变成两段。链表:用来保存每一段的状态,链表的元素单位是段。且链表的最后一个元素表示蛇的头部段。坐标系:MIDP 中的坐标以左上角那点为(0,0),向右则 x 递增,向下则 y 递增。Worm 类一条完整的贪吃蛇是由一段一段组成的。链表中保存的第一个元素是蛇的尾巴段,最后一个元素是蛇的头部段。当蛇运动的时候,它头部段增加一节而尾段减少一节。如果它吃到了食物,尾部段就不减少一节。也就是说,蛇是从头部段开始长的。下面的代码段显示了 Worm 类保存的各种属性:/*贪吃蛇可能移动的方向*/publicfinalstaticbyteDOWN=2;publicfinals
3、taticbyteLEFT=4;publicfinalstaticbyteRIGHT=6;publicfinalstaticbyteUP=8;/贪吃蛇的当前方向privatebytecurrentDirection;保存贪吃蛇每一段的列表privateVectorworm=newVector(5,2);/是否需要更新状态privatebooleanneedUpdate;/是否在运动中privatebooleanmoveOnNextUpdate;/是否吃到食物privatebooleanhasEaten;/贪吃蛇的初始位置、 长度和方向privatefinal staticint INIT_X=
4、3;privatefinal staticint INIT_Y=8;privatefinal staticint INIT_LEN=8;privatefinal staticbyteINIT_DIR=RIGHT;intx=sl.getEndX();inty=sl.getEndY();/不同的运动方向坐标的改变也不一样switch(direction)caseUP:/当这段向上运动的时候if(currentDirection!=DOWN)y-;needUpdate=true;break;caseDOWN:/当这段向下运动的时候if(currentDirection!=UP)y+;needUpda
5、te=true;break;caseLEFT:/当这段向左运动的时候if(currentDirection!=RIGHT)x-;needUpdate=true;break;caseRIGHT:当这段向右运动的时候if(currentDirection!=LEFT)下面重点介绍下 Worm 类中的几个方法:publicvoidsetDirection(bytedirection)这个方法用来改变贪吃蛇运动的方向,只能 90 度。看下面的实现代码:if(direction!=currentDirection)&!needUpdate)/取出列表中的最后一个元素(蛇的头部)WormLinks
6、l=(WormLink)worm.lastElement();x+;needUpdate=true;break;/当更改方向后需要更新if(needUpdate=true)worm.addElement(newWormLink(x,y,0,direction);currentDirection=direction;publicvoidupdate(Graphicsg)这个函数是更新贪吃蛇状态。每次更新都把头部增加一节,尾部减少一节。如果它吃到食物尾部段就不减少一节。看起来就像整只蛇长了一节。/把贪吃蛇头部增加一格head=(WormLink)worm.lastElement();head.in
7、creaseLength();/如果没有吃到食物则尾部减少一格if(!hasEaten)WormLinktail;tail=(WormLink)worm.firstElement();inttailX=tail.getX();inttailY=tail.getY();/如果尾部块长度为 0 就删除tail.decreaseLength();if(tail.getLength()=0)worm.removeElement(tail);/尾部减少一格g.setC010r(WormPit.ERASE_COLOUR);drawLink(g,tailX,tailY,tailX,tailY,1);else
8、/如果吃到食物就不删除尾部hasEaten=false;needUpdate=false;/确认是否在边界中 if(!WormPit.isInBounds(head.getEndX(),head.getEndY()/如果不在,就死了thrownewWormException(overtheedge);headX=(byte)head.getEndX();headY=(byte)head.getEndY();/贪吃蛇的头部增加一格g.setC010r(WormPit.DRAW_COLOUR);drawLink(g,headX,headY,headX,headY,1);/判断是否吃到自己for(i
9、nti=0;iworm.size()-1;i+)sl=(WormLink)worm.elementAt(i);if(sl.contains(headX,headY)thrownewWormException(youateyourself);voiddrawLink(Graphicsg,intx1,inty1,intx2,inty2,intlen)这个函数用来画蛇的一段,一只完整的蛇是一段一段组成的。/把长度转换成像素长度len*=WormPit.CELL_SIZE;/(x1=x2)说明这一段是垂直的if(x1=x2)/把 x1 转成像素长度x1*=WormPit.CELL_SIZE;/(y2y
10、1)说明是向上运动if(y2yi)/就把头、尾左边交换并转成像素yi=y2*WormPit.CELL_SIZE;else/把 yi 转成像素yi*=WormPit.CELL_SIZE;g.fillRect(x1,yi,WormPit.CELL_SIZE,len);else/这是水平的一段yi*=WormPit.CELL_SIZE;if(x2xi)/就把头、尾左边交换并转成像素xi=x2*WormPit.CELL_SIZE;elsexi*=WormPit.CELL_SIZE;g.fillRect(xi,yi,len,WormPit.CELL_SIZE);publicvoidpaint(Graph
11、icsg)画出一只完整的贪吃蛇WormLinksl;intxi,x2,yi,y2;intlen;for(inti=0;iworm.size();i+)/取出每一段,然后画出这一段,连起来就是一只完整的蛇sl=(WormLink)worm.elementAt(i);x1=sl.getX();x2=sl.getEndX();y1=sl.getY();y2=sl.getEndY();len=sl.getLength();drawLink(g,x1,y1,x2,y2,len);WormLink 类贪吃蛇是由一节一节组成的。因为它经常有一些节连成一条直线形成段,所以这是一种相对有效的方法来保存整个蛇。X
12、,Y表示段头部的坐标,然后段的头部开始按照方向向后画若干节。(段的头尾和蛇的头尾不是一个概念)下面代码段是 WormLink 中的段得属性:/段头部坐标privateintx,y;/段长度privateintlen;/移动方向privatebytedir;下面重点介绍几个重要函数:publicvoiddecreaseLength()这是从段的头部减少一格/首先段的总长度减少 1len-;switch(dir)/不同的方向左边的改变也不一样caseWorm.LEFT:caseWorm.RIGHT:x+;break;caseWorm.UP:y-;break;caseWorm.DOWN:y+;bre
13、ak;publicvoidpaint(Graphicsg)画出一只完整的贪吃蛇WormLinksl;intx1,x2,y1,y2;intlen;for(inti=0;iworm.size();i+)/取出每一段,然后画出这一段,连起来就是一只完整的蛇sl=(WormLink)worm.elementAt(i);x1=sl.getX();x2=sl.getEndX();y1=sl.getY();y2=sl.getEndY();len=sl.getLength();drawLink(g,x1,y1,x2,y2,len);WormLink 类贪吃蛇是由一节一节组成的。 因为它经常有一些节连成一条直线
14、形成段, 所以这是一种相对有效的方法来保存整个蛇。X,Y表示段头部的坐标,然后段的头部开始按照方向向后画若干节。(段的头尾和蛇的头尾不是一个概念)X-;break;下面代码段是 WormLink 中的段得属性:/段头部坐标privateintx,y;/段长度privateintlen;/移动方向privatebytedir;下面重点介绍几个重要函数:publicvoiddecreaseLength()这是从段的头部减少一格/首先段的总长度减少 1len-;switch(dir)/不同的方向左边的改变也不一样caseWorm.LEFT:x-;break;caseWorm.RIGHT:x+;bre
15、ak;caseWorm.UP:y-;break;caseWorm.DOWN:publicbooleancontains(intx,inty)判断所给的坐标x,y是否包含在段中switch(dir)/不同的方向判断的方法也不一样caseWorm.LEFT:return(y=this.y)&(x=getEndX();caseWorm.RIGHT:return(y=this.y)&(x=this.x)&(x=getEndX();caseWorm.UP:return(x=this.x)&(y=getEndY();caseWorm.DOWN:return(x=this.x
16、)&(y=this.y)&(y(level1)/*增加游戏难度*/forceRedraw=true;foodEaten=0;level+;if(tonePlayer!=null)trytonePlayer.setMediaTime(0);tonePlayer.start();catch(MediaExceptionme)elseif(audioPlayer!=null)tryManager.playTone(69,50,100);catch(MediaExceptionme)g.setC010r(WormPit.ERASE_COLOUR);/填充长方形(三个字的宽度)/Play
17、audiog.fillRect(width-(SCORE_CHAR_WIDTH*3)-START_POS,height-START_POS,(SCORE_CHAR_WIDTH*3),SCORE_CHAR_HEIGHT);g.setC010r(WormPit.DRAW_COLOUR);/显示新的分数g.drawString(+score,width-(SCORE_CHAR_WIDTH*3)-START_POS,height-START_POS,Graphics.TOP|Graphics.LEFT);/重新生成食物myFood.regenerate();intx=myFood.getX();int
18、y=myFood.getY();while(myWorm.contains(x,y)/如果食物和贪吃蛇的身体重复就重新生成myFood.regenerate();x=myFood.getX();y=myFood.getY();/画出食物myFood.paint(g);catch(WormExceptionse)gameOver=true;画出整个屏幕(重载 paint 函数)/如果强制重新画整个屏幕if(forceRedraw)forceRedraw=false;/清除背景g.setC010r(WormPit.ERASE_COLOUR);g.fillRect(0,0,getWidth(),getHeight();/画出边界g.setC010r(WormPit.DRAW_COLOUR);g.drawRect(1,1,(width-START_POS),(height-START_POS);/显示当前的难度等级g.drawString(L:+level,START_POS,height,Graphic
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 情感认知测试题及答案
- 节奏结构分析能力试题及答案
- 天然林保护与修复新策略
- 社交空间家具设计的特殊要求试题及答案
- 公司厨师服务合同范例
- 家居产品的用户测试与评估考试题及答案
- 大学化妆考试题及答案
- 约束力作图试题及答案
- 学生文学考试题及答案
- 备考土木考试的心态调整策略试题及答案
- 插画版权授权协议书
- 地理西亚+课件-2024-2025学年七年级地理下册人教版
- 放射科质量管理制度
- 科研助理笔试题库及答案
- 产品上市计划
- CHINET2024年全年细菌耐药监测结果
- 药物临床试验质量管理规范解读
- 膀胱癌健康宣教课件
- X线腰椎临床意义
- 零星工程框架协议书范本
- 绽放的梨花(2024年山东滨州中考语文试卷记叙文阅读试题)
评论
0/150
提交评论