版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、贪吃蛇是一款非常经典的手机游戏。它有很多算法,这里详细分析一种比较优秀的算法。首先介绍下主要用到的七个类:lWormMain:最主要的类,控制所有其它类的运行和销毁。lWormPit:处理键盘输入事件并实例化Worm类和WormFood类的。lWorm:抽象了贪吃蛇的属性和动作lWormFood:抽象了食物的属性和动作lWormScore:用来纪录分数的类lWormLink:抽象了蛇身上的一段,保存了这段的坐标、方向和所有状态。lWormException:处理异常类基本概念介绍节:一条蛇可以看成有许多正方形的“小格子”拼凑成,我把它称作节。节是蛇身上最小的单位。段:当许多节连成一条直线,我称
2、它为段。上图的贪吃蛇只有一段,如果它拐弯就变成两段。链表:用来保存每一段的状态,链表的元素单位是段。且链表的最后一个元素表示蛇的头部段。坐标系:MIDP中的坐标以左上角那点为(0,0),向右则x递增,向下则y递增。Worm类一条完整的贪吃蛇是由一段一段组成的。链表中保存的第一个元素是蛇的尾巴段,最后一个元素是蛇的头部段。当蛇运动的时候,它头部段增加一节而尾段减少一节。如果它吃到了食物,尾部段就不减少一节。也就是说,蛇是从头部段开始长的。下面的代码段显示了Worm类保存的各种属性:/*贪吃蛇可能移动的方向*/publicfinalstaticbyteDOWN=2;publicfinalstati
3、cbyteLEFT=4;publicfinalstaticbyteRIGHT=6;publicfinalstaticbyteUP=8;/贪吃蛇的当前方向privatebytecurrentDirection;/保存贪吃蛇每一段的列表privateVectorworm=newVector(5,2);/是否需要更新状态privatebooleanneedUpdate;/是否在运动中privatebooleanmoveOnNextUpdate;/是否吃到食物privatebooleanhasEaten;/贪吃蛇的初始位置、长度和方向privatefinalstaticintINIT_X=3;priv
4、atefinalstaticintINIT_Y=8;privatefinalstaticintINIT_LEN=8;privatefinalstaticbyteINIT_DIR=RIGHT;下面重点介绍下Worm类中的几个方法:lpublicvoidsetDirection(bytedirection)这个方法用来改变贪吃蛇运动的方向,只能90度。看下面的实现代码:if(direction!=currentDirection)&!needUpdate) /取出列表中的最后一个元素(蛇的头部)WormLinksl=(WormLink)worm.lastElement();intx=sl.getE
5、ndX();inty=sl.getEndY();/不同的运动方向坐标的改变也不一样switch(direction)caseUP:/当这段向上运动的时候 if(currentDirection!=DOWN)y-;needUpdate=true; break;caseDOWN:/当这段向下运动的时候 if(currentDirection!=UP)y+;needUpdate=true; break;caseLEFT:/当这段向左运动的时候 if(currentDirection!=RIGHT)x-;needUpdate=true; break;caseRIGHT:/当这段向右运动的时候 if(c
6、urrentDirection!=LEFT)x+;needUpdate=true; break;/当更改方向后需要更新if(needUpdate=true) worm.addElement(newWormLink(x,y,0,direction); currentDirection=direction; lpublicvoidupdate(Graphicsg)这个函数是更新贪吃蛇状态。每次更新都把头部增加一节,尾部减少一节。如果它吃到食物尾部段就不减少一节。看起来就像整只蛇长了一节。/把贪吃蛇头部增加一格 head=(WormLink)worm.lastElement(); head.incr
7、easeLength();/如果没有吃到食物则尾部减少一格 if(!hasEaten) WormLinktail; tail=(WormLink)worm.firstElement(); inttailX=tail.getX(); inttailY=tail.getY(); /如果尾部块长度为0就删除 tail.decreaseLength(); if(tail.getLength()=0) worm.removeElement(tail); /尾部减少一格 g.setColor(WormPit.ERASE_COLOUR); drawLink(g,tailX,tailY,tailX,tailY
8、,1); else /如果吃到食物就不删除尾部 hasEaten=false; needUpdate=false; /确认是否在边界中 if(!WormPit.isInBounds(head.getEndX(),head.getEndY() /如果不在,就死了 thrownewWormException(over the edge); headX=(byte)head.getEndX(); headY=(byte)head.getEndY(); /贪吃蛇的头部增加一格 g.setColor(WormPit.DRAW_COLOUR); drawLink(g,headX,headY,headX,h
9、eadY,1); /判断是否吃到自己 for(inti=0;iworm.size()-1;i+)sl=(WormLink)worm.elementAt(i);if(sl.contains(headX,headY) thrownewWormException(you ate yourself); lvoiddrawLink(Graphicsg,intx1,inty1,intx2,inty2,intlen)这个函数用来画蛇的一段,一只完整的蛇是一段一段组成的。/把长度转换成像素长度len*=WormPit.CELL_SIZE;/ (x1 = x2)说明这一段是垂直的if(x1=x2)/把x1转成像
10、素长度 x1*=WormPit.CELL_SIZE; / (y2 y1)说明是向上运动 if(y2y1)/就把头、尾左边交换并转成像素y1=y2*WormPit.CELL_SIZE; else /把y1转成像素y1*=WormPit.CELL_SIZE; g.fillRect(x1,y1,WormPit.CELL_SIZE,len);else/这是水平的一段 y1*=WormPit.CELL_SIZE; if(x2x1) /就把头、尾左边交换并转成像素x1=x2*WormPit.CELL_SIZE; elsex1*=WormPit.CELL_SIZE; g.fillRect(x1,y1,len
11、,WormPit.CELL_SIZE);lpublicvoidpaint(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类贪吃蛇是由一节
12、一节组成的。因为它经常有一些节连成一条直线形成段,所以这是一种相对有效的方法来保存整个蛇。X,Y表示段头部的坐标,然后段的头部开始按照方向向后画若干节。(段的头尾和蛇的头尾不是一个概念)下面代码段是WormLink中的段得属性:/段头部坐标privateintx,y;/段长度privateintlen;/移动方向privatebytedir;下面重点介绍几个重要函数:lpublicvoiddecreaseLength()这是从段的头部减少一格/首先段的总长度减少1len-;switch(dir)/不同的方向左边的改变也不一样caseWorm.LEFT: x-; break;caseWorm.R
13、IGHT: x+; break;caseWorm.UP: y-; break;caseWorm.DOWN: y+; break;lpublicvoidpaint(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();
14、drawLink(g,x1,y1,x2,y2,len);WormLink类贪吃蛇是由一节一节组成的。因为它经常有一些节连成一条直线形成段,所以这是一种相对有效的方法来保存整个蛇。X,Y表示段头部的坐标,然后段的头部开始按照方向向后画若干节。(段的头尾和蛇的头尾不是一个概念)下面代码段是WormLink中的段得属性:/段头部坐标privateintx,y;/段长度privateintlen;/移动方向privatebytedir;下面重点介绍几个重要函数:lpublicvoiddecreaseLength()这是从段的头部减少一格/首先段的总长度减少1len-;switch(dir)/不同的方向
15、左边的改变也不一样caseWorm.LEFT: x-; break;caseWorm.RIGHT: x+; break;caseWorm.UP: y-; break;caseWorm.DOWN: y+; break;lpublicbooleancontains(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: r
16、eturn(x=this.x)&(y=getEndY();caseWorm.DOWN: return(x=this.x)&(y=this.y)&(y(level1) /*增加游戏难度*/ forceRedraw=true; foodEaten=0; level+; if(tonePlayer!=null)try tonePlayer.setMediaTime(0); tonePlayer.start();catch(MediaExceptionme) else if(audioPlayer!=null)try Manager.playTone(69,50,100);/ Play audioca
17、tch(MediaExceptionme) g.setColor(WormPit.ERASE_COLOUR);/填充长方形(三个字的宽度)g.fillRect(width-(SCORE_CHAR_WIDTH*3)-START_POS, height-START_POS, (SCORE_CHAR_WIDTH*3), SCORE_CHAR_HEIGHT);g.setColor(WormPit.DRAW_COLOUR);/显示新的分数g.drawString(+score, width-(SCORE_CHAR_WIDTH*3)-START_POS, height-START_POS,Graphics
18、.TOP|Graphics.LEFT);/重新生成食物myFood.regenerate();intx=myFood.getX();inty=myFood.getY();while(myWorm.contains(x,y)/如果食物和贪吃蛇的身体重复就重新生成 myFood.regenerate(); x=myFood.getX();y=myFood.getY(); /画出食物 myFood.paint(g);catch(WormExceptionse)gameOver=true;lpublicvoidpaint(Graphicsg)画出整个屏幕(重载paint函数)/如果强制重新画整个屏幕if(forceRedraw) forceRedraw=false; /清除背景 g.setColor(WormPit.ERASE_COLOUR); g.fillRect(0,0,getWidth(),getHeight(); /画出边界 g.setColor(WormPit.DRAW_COLOUR); g.drawRect(1,1,(width-START_POS),(height-START_POS); /显示当前的难度等级 g.drawString(L: +level,START_POS,height,Graphics.TOP|Graphics
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026小组作业幼师面试题及答案
- 2026烟草计算机面试题及答案
- 2026医院转岗面试题目及答案
- 2026英国高薪面试题及答案
- 预防心理困扰拥抱阳光心灵,小学主题班会课件
- 2026做家教面试题目及答案
- 2026单词陪练师面试题及答案
- 2026海口中学面试题目及答案
- 健康成长:安全知识小学主题班会课件
- 项目延期申请说明信(8篇)范文
- 2026年征兵人格测试题及答案
- 2026江苏盐城市地方立法研究中心选调2人笔试题库附答案详解(考试直接用)
- 住房出租合同范本(7篇)
- 流沙处理方案
- 重性精神疾病患者管理服务规范
- 辽宁某大酒店幕墙工程施工组织设计(铝合金窗、石材干挂)
- 机电材料主辅材界定表
- Q-SY 15004.6-2021 石油石化企业安保防恐防范规范 第6部分:石油天然气管道
- 安全隐患排查监理细则范文
- CJJT 268-2017 城镇燃气工程智能化技术规范
- 教师校园网络安全培训
评论
0/150
提交评论