根据android的贪吃蛇游戏设计与开发_第1页
根据android的贪吃蛇游戏设计与开发_第2页
根据android的贪吃蛇游戏设计与开发_第3页
根据android的贪吃蛇游戏设计与开发_第4页
根据android的贪吃蛇游戏设计与开发_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、姓 名西安思源学院课程实训报告课程名称计算机系统综合实训_课题名称基于 Android的贪吃蛇游戏开发专业_ 计算机软件技术_班 级_学号132040800211_指导教师王英强_2015 年 6 月 4 日目录1、程序构思 .42、程序设计.52.1游戏功能.522总设计模块的划分 .62.3游戏主界面模块 .62.4游戏控制模块.62.5类模块设计 .73、程序实现.73.1、游戏界面的实现 .73.2、游戏整个框架的构建 .93.3、 实现键盘响应事件 .143.4、 刷新.153.4、 实现页面的切换 .153.5、加载游戏.163.6、 游戏背景界面的改进 .1.63.8、 添加音效

2、.1.63.9、 游戏本身的完善 .163、类模块具体设计.19TitleView.java .19Sn akeView.java.194.程序结果.225.总结与展望.256.附录.261、程序构思贪吃蛇游戏是一款非常经典的手机游戏,贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。因此,在设计开发过程中, 需要处理好各个类之间间的逻辑依赖关系和数据通信关系。正是因为如此,本次设计的目的在于学习Java程序设计基本技术

3、,学习用an droid开发Java程序的相关技术,熟悉游戏“贪吃蛇”的需求,熟悉项目开发的完整过程。学会怎样进行一 个项目的需求分析、概要设计、详细设计等软件开发过程,熟练地掌握Java程序设计的基本技术和方法,熟练地掌握an droid环境的使用方法,培养初步的项目分析能力和程序设 计能力。2.1 游戏功能本系统主要完成以下几方面的功能:游戏控制功能一一包括游戏的开始、暂停、退出界面布局 其他辅助功能(如游戏帮助,游戏积分,游戏过关等)2、程序设计开始初始化界面和蛇身游戏者按键选择放置食物游戏设计的处理流程图蛇开始运动N蛇长大2.2 总设计模块的划分游戏总设计模块划分为游戏主要界面模块、游

4、戏控制模块和游戏菜单模块。2.3 游戏主界面模块游戏主界面模块主要是指游戏的框图,其包括一下内容:1、游戏界面的边界,即游戏中的墙;2、游戏中蛇的构成,以及苹果的构成;3、游戏中障碍物的构成;4、游戏中分数显示以及关卡显示。2.4 游戏控制模块(1)游戏开始控制:我们的程序是使用上键开始游戏,启动游戏后会有一个初始菜单界面,我们点击“开始游戏”, 弹出一句话“请按上键开始游戏”。游戏开始后蛇向下移动,然后由控制上下左右键来控制 蛇的移动。在程序中我们重新建了一个activity来控制游戏的开始,使游戏的开始界面更美观。(2)游戏暂停控制:我们是使用center键来控制游戏的暂停的,这是一项人性

5、化的设计,当玩家在游戏过程中 突遇紧急情况时可以按center键暂停游戏,等玩家空闲后按center键可以继续游戏。(3)游戏退出控制:在游戏的退出上我们的程序使用了多种方式来应对不同的情况,当玩家正在游戏中时, 如想 退出可以按“1”键,程序会自动跳转到初始菜单界面,在初始菜单界面点击“退出游戏”即可退出游戏。如果玩家在游戏中由于碰到墙或者咬到自己或者碰到障碍物而导致游戏结束 的,游戏或自动弹出一个界面,里面有提示是继续游戏还是退出游戏,当点击“取消”时, 游戏就会自动跳转到初始菜单,再点击“退出游戏”即可。2.5 类模块设计src 源码目录: :二com . Snake. ejitLiro

6、i dHelp, jmv亀rienukctiri ty. j ava.Jav&Snake Vi ew*. j avi Tileiew, j ava田WML讥Sit,知HdSnake.java为主界面类;Sn akeView为贪吃蛇类的视图主要逻辑控制和绘制类;TitleView为界面的整体视图;MenuActivity为菜单类,可以跳转到Help类和Snake类;Help为游戏帮助类。3、程序实现3.1、游戏界面的实现1、 先声明用来存放绘画图像的X,Y轴的位置的数组:private int mTileGrid;2、 编写存放图片索引用图片的X,Y轴位置;public void set

7、Tile( int tile in dex,int x, int y)ILfiElEIJ-. s田 mTileGridxy = tilei ndex; 3把图片素材加入到bitmap中public void loadTile(int key, Drawable tile)Bitmap bitmap =Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888);Can vas can vas = new Can vas(bitmap);tile.setBo un ds(0, 0, mTileSize, mTileSize)

8、;tile.draw(ca nvas);mTileArraykey = bitmap;4、 调用以上的方法以循环的方式位置数组赋值以及图片的索引,private void updateWalls() for (int x = 0; x mXTileCount; x+) setTile(GREEN_STAR, x, 0);setTile(GREEN_STAR, x, mYTileCou nt - 1);for (int y = 1; y mYTileCou nt - 1; y+) setTile(GREEN_STAR, 0, y);/设置左边的界线的位置setTile(GREEN_STAR, m

9、XTileCou nt - 1, y);/设置右边的界线的位置5、 重写VIEW类里面的方法。把界线画出。public void on Draw(Ca nvas can vas)super.o nDraw(ca nvas);for (int x = 0; x mXTileCount; x += 1) for (i nt y = 0; y 0) can vas.drawBitmap(mTileArraymTileGridxy,mXOffset + x * mTileSize,mYOffset + y * mTileSize, mPai nt);同上可见:整个界面其实就是由图片数组拼直面成的。到此

10、,则可以实现游戏背景墙。3.2、游戏整个框架的构建1 实现方案游戏的整个框架的构建包括基本的蛇身,苹果的实现,有两种方案:方案一:使用常用的数组来存储蛇身和苹果的点集的信息。此方案的优点是对数组的操作较为熟悉,实现简单,但是部分操作较为麻烦, 有可能出现数组越界, 或者浪费太多存储空间。方案二:使用动态数组ArrayList来存储蛇身和苹果点集的信息。ArrayList可以用来定义为各种不同类型的数组,不仅仅局限于int整型;而且ArrayList为用户编程提供了各种借口,比如插入,删除元素,统计元素个数等,实现较为简单,不会出现数组越界的问题。结合各种因素的考虑,我们在设计中采用第二种方案。

11、定义Position方法,用于存储蛇身和苹果的点集坐标private class Positi on /存储每个点的坐标public int x;public int y;public Positi on (i nt xpositi on, int ypositi on) x = xpositi on;y = ypositi on;public boolea n equals(i nt n ewx,i nt n ewy) if (x = n ewx & y = n ewy ) return true; return false; 定义setMode方法,用于表示游戏所处的几种状态:进行

12、,暂停,public void setMode(i nt n ewMode)int oldMode = mMode;mMode = n ewMode;if(n ewMode = RUNNING & oldMode != RUNNING)if(n ewMode = PAUSE)if(n ewMode = LOSE)if(n ewMode = READY)苹果的实现声明:private ArrayList mAppleTrail = new ArrayList();用于存储苹果的坐标位置根据游戏的需要,苹果的位置应该是随机产生的,使用java.util.Ra ndom机数实现苹果坐标的随机

13、。int n ewapplex = 2+ra ndom.n ext In t(mYTileCo un t-2)-4);int n ewappley = 2+ra ndom.n ext In t(mXTileCo un t-2)-4);n ewapple = new Positi on(n ewapplex ,n ewappley);检测苹果坐标是否与蛇的坐标以及墙的左边冲突设置冲突标志位:boolean flag = false;int sn akele ngth = mSn akeTrail.size();for (int in dex = 0; in dex sn akele ngth;

14、in dex+)if (mS nakeTrail.get(i ndex).equals( newapple.x ,n ewapple.y) flag = true; 墙的冲突检测方法与上同;当产生的新坐标没有问题时,则把新坐标加入到 中。蛇的实现类中提供的随mAppleTrail声明:private ArrayList mAppleTrail = new ArrayList();用于存储苹果的坐标位置蛇的初始化蛇身的初始化在ininNewGame中实现,直接把最初要呈现给玩家的蛇的情况定义出 来,即添加一定数量的坐标点进入mSn akeTrail中,使得在最初开始游戏时,有蛇可以进 行自由移动

15、。蛇的移动游戏中是通过触发来改变坐标(+1,-1)的方式来改蛇头的方向,包括后面的蛇的碰撞检测都要用到蛇头。获取蛇的头部:Positi on head = mSn akeTrail.get(O);蛇的新头部:Positi on n ewHead = new Positi on (2,2);通过设置整型变量mDirection以及mNextDirection来判断蛇下一步移动方向,然后改变蛇头的坐标,使蛇移动switch (mDirectio n) case EAST:n ewHead = new Positi on( head.x,head.y-1);break;ArrayList mAppl

16、eList =new ArrayList()坐标集里面集依次判蛇的碰撞检测 蛇在移动时,若碰撞到墙壁或者自己身体,则游戏结束。蛇的碰壁检测:if(head.x 1) | (head.y mYTileCount-2)| (head.y mXTileCount-2)setMode(LOSE);return;蛇的自身碰撞的检测:int walle ngth = mWallTrail.size();for ( int wallindex = 0 ; wallindex wallength; wallindex+)Positi on c = mWallTrail.get(walli ndex);if (

17、c.equals (n ewHead.x ,n ewHead.y)setMode(LOSE);return; 蛇吃苹果的实现蛇所经过的每一个坐标, 他们都要在苹果所在的 断,若是坐标相同,那个这个苹果就被蛇吃了 找苹果的方法:int appleco unt = mAppleTrail.size();int apple in dex;for ( apple in dex = 0; apple in dex appleco unt; apple in dex+) Positi on c = mAppleTrail.get(apple in dex);if (c.equals (n ewHead.x

18、 ,n ewHead.y) 3.3、实现键盘响应事件键盘主要起操作作用,可以控制蛇的行走方向:public boolea n on KeyDow n(i nt keyCode,KeyEve nt eve nt)if (keyCode = KeyEve nt.KEYCODE_DPAD_DOWN) if (mDirection != SOUTH)mNextDirection = NORTH;return (true);3.4、刷新只要继承Handler类就可以对消息进行控制,或者处理class RefreshHa ndler exte nds Han dler 键盘响应/响应消息public vo

19、id han dleMessage(Message msg) Sn akeView.this.update();重要页面Sn akeView.this.i nvalidate();刷新页面/向外提供人工的调用消息的接口,public void sleep(lo ng delayMillis) this.removeMessages(O);/注消消息/添加消息,sen dMessageDelayed(obta inM essage(0), delayMillis);3.4、实现页面的切换程序中从主菜单界面到游戏界面的切换以及从主菜单界面到游戏帮助界面都采用的是活动的切换方法;使用startAct

20、ivity(new Intent(MenuActivity.this,Snake.class);实现不同活动之间的切换,即从一个页面跳转到另一个上。另一种方案也能实现页面的切换就是,通过控制页面上的控件如按钮的显示,隐藏来达到切换的目的,但是这种方式较为复杂。3.5、加载游戏通过ininNewGame方法来初始化新游戏,通过Update方法更新游戏设置。3.6、游戏背景界面的改进为贪吃蛇游戏设计了背景,使其更具有观赏新,使玩家赏心悦目。3.8、 添加音效为游戏添加了音效,使游戏在听觉上给人以耳目一新的感觉;具体实现方法:通过调用android.media.MediaPlayer类函数,声明对象

21、:MediaPlayer mp=MediaPlayer.create(this.getC on text(),R.raw.backgro un d);通过mp.start();mp.pause();mp.stop();来控制游戏不同状态时的音乐状态。3.9、 游戏本身的完善10、为游戏设置关卡根据玩家的得分为游戏设置了关卡,难度逐渐加强,蛇的移动速度逐渐加快。每一关卡中的障碍物是固定不变的,为简单起见,只设置了五个关卡通过Obstacle函数来设置关卡的障碍物,其中函数中以当前处于的关卡数作为判断依据。public void Obstacle。switch(stage)case 5:case

22、4:case 3:case 2: 游戏中设置的有三种不同的苹果:普通,加分,和毒苹果吃掉普通的苹果加一分;吃掉加分的苹果加两分;吃掉毒苹果减三分并加速每一种苹果的实现方法都一样,使用ArrayList动态数组每种苹果都采用随机的方法实现,实现方式基本与蛇找到苹果相同,只是在细节上略有区别private void Pois on apple();private void Loveapple();设置退出快捷键在游戏进行中,设置了退出快捷键,可以直接退出游戏,更加方便玩家操作。具体实现还是依靠键盘响应函数:游戏中是数字“1”键作为退出快捷键public boolea n on KeyDow n(i

23、 nt keyCode,KeyEve nt event)if(keyCode = KeyEve nt.KEYCODE_1) showRightorNot.setNegativeButto n(取消, this);mUpdateFlag = false;mp.stop();Intent intent = new Intent(this.getContext(),MenuActivity.class);this.getC on text().startActivity(i nte nt);设置加速根据实际操作需要,当操控蛇的移动时,若按下方向键不放,则蛇在该方向上的运行速度就会加快;若松开方向键则

24、恢复原速度。通过设置整型变量mSpeed和mNSpeed,其中mNSpeed用来保存蛇在该关卡的 移动速度。通过键盘响应函数public boolean on KeyDow n(int keyCode,KeyEve nt event)和public boolean on KeyUp(i nt keyCode, KeyEve nt event)起来实现加速功能。提示对话框在游戏结束后弹出对话框询问玩家的下一步动作,按确定按钮继续开始新的游戏,按取 消退出游戏。这项功能需要android.content.Dialoglnteface类的支持,声明对象:private AlertDialog.Bui

25、lder showRightorNot;弹出对话框的界面:showRightorNot = new AlertDialog.Builder(this.getC on text();showRightorNot.setIco n(R.drawable.ic on);showRightorNot.setTitle(”贪吃蛇);showRightorNot.setPositiveButton(”确定, this);showRightorNot.setNegativeButto n(取消, this);3、类模块具体设计TitleView.javaTitleView.java 中的成员变量表变量类型意

26、义赋值mTileArray private Bitmap声明四种类型的小块,黄绿红黑mTileSizeprotected static finalint小块边长12mXTileCou ntprotected static intx 方向小块个数mYTileCount;protected static inty 方向小块个数mTileGridprivate int 每个小块的数值mXOffsetprotected int横向偏移量mYOffset ;protected int纵向偏移量pai ntprivate Paintnew Paint();showRightorNot.setMessage

27、(”按确定继续,按取消退出游戏”).show();TitleView.java 成员方法Sn akeView.javaSnakeView.java 中的成员变量表变量类型作用赋值TAGpublic static finalStri ngSn akeviewshowRightorPrivate游戏继续提示NotAlertDialog.BuildermDirectio nprivate int控制蛇的移动方向SOUTHmNextDirecti onprivate int控制蛇的下一个移动方向SOUTHNORTHprivate static final int控制蛇向上移动1SOUTHprivate

28、 static final int控制蛇向下移动2EASTprivate static final int控制蛇向右移动3WESTprivate static final int控制蛇向左移动4READYpublic static final int1RUNNINGpublic static final int控制游戏开始2PAUSEpublic static final int控制游戏暂停3LOSEpublic static final int控制游戏结束4textView1;private TextViewtextView2;private TextViewtextView3;privat

29、e TextViewmCen terPressedprivate boolea nfalsemUpdateFlagprivate boolea nfalsemModepublic intREADYstageprivate int记录通关等级1mScoreprivate int计分0mSpeedprivate int刷新界面时间变量600mNSpeedprivate int刷新界面时间变量mSpeedreprivateRefreshHa ndler刷新界面处理变量newRefreshHa ndler();ran domprivate static finalRandomnew Ran dom()

30、;mRecordprivate int =new int 10SnakeView.java 成员方法Menu Activit y.J avaMen uActivity.Java成员变量TAGpublic static final StringTAGshowRightorNotprivate AlertDialog.BuildershowRightorNotHelp.JavaHelp.Java成员变量on Createprotected void on Create4.程序结果保存原程序,启动模拟机,选择 java application ,运行结果如下:11:25曲bhblKtl晋KD扫11:

31、250 O 0 bhE4;t 11 11:26O O G O 0 5总结与展望贪吃蛇是一个简单的游戏, 却让我吃了很多的苦头,从搭建开发环境到对程序进行调试,出现了各种各样的问题,像JDK版本现错了啊,环境变量的设置出错啊,调试的时候那个R文件不能够读取我用了3天才发现只是大小写的问题等等,这些让我深刻地(绝对深刻) 认识到细节对一个想要成为一个优秀程序员是多么不可或缺的品质。这一次的实验很多代码是从网上找来的,我自己只是起到了一个整合处理的作用,还有一小部分自己还不是完全搞懂,我还将花一部分时间来弄明白他们,争取自己能够独立的编写出一个完整的完美的程序 来。*6附录package com.S

32、 nake.a ndroid;import java.util.ArrayList;import java.util.Ra ndom;import an droid.app.AlertDialog;import an droid.c onten t.C on text;import an droid.c onten t.Dialog In terface;import an droid.c onten t.I ntent;import an droid.c on te nt.res.Resources;import an droid.media.MediaPlayer;import an dr

33、oid.os.Ha ndler;import an droid.os.Message;import an droid.util.AttributeSet;import an droid.view.KeyEve nt;import an droid.view.View;import an droid.widget.TextView;* author Adm inistrator*/publicclassSn akeViewexte ndsan droid.c onten t.Dialog In terface. On ClickListe nerpublic static final Strin

34、g TAG = Sn akeview;private AlertDialog.Builder showRightorNot ;private int mDirectio n = SOUTH;private int mNextDirection = SOUTH;/设置方向private static final int NORTH = 1;private static final int SOUTH = 2;private static final int EAST = 3;private static final int WEST = 4;public static final int REA

35、DY = 1; public static final int RUNNING = 2;public static final int PAUSE = 3;public static final int LOSE = 4;private TextView textViewl;private TextView textView2;private TextView textView3;private boolea n mCe nterPressed = false;TileViewimplementsprivate boolea n mUpdateFlag =false;public int mM

36、ode = READY;private int mScore = 0;private int mSpeed = 600;private int stage = 1;private int mNSpeed = mSpeed;/刷新界面处理器private RefreshHa ndler re = new RefreshHa ndler();/为创建苹果坐标使用随机对象private static final Ran dom ran dom = new Ran dom();/用于存储贪吃蛇中,苹果和蛇的点阵的坐标的信息的集合private ArrayList mSnakeTrail = new A

37、rrayList();private ArrayList mAppleTrail = new ArrayList();private ArrayList mWallTrail = new ArrayList();private ArrayList mPois on Apple = new ArrayList ();是否更新的标志量private ArrayList mLoveApple = new ArrayList ();MediaPlayer mp=MediaPlayer.create(this.getC on text(),R.raw.backgro un d);/相当于数组大小可变/*

38、 param con text* param attrs*/class RefreshHa ndler exte nds Han dler *响应消息*/Overridepublic void han dleMessage(Message msg) update();in validate。;/消失重新调用on draw向外提供人工的调用消息的接口* param delayMillis */每600ms刷新一次/*public void sleep(lo ng delayMillis)II隔600ms重新调用这个函数this.removeMessages(O);sen dMessageDela

39、yed(obta inMessage(0),delayMillis);public Sn akeView(C on text con text, AttributeSet attrs) super(c on text, attrs);setFocusable(true);ininSn akeView();public void ininSn akeView()初始化界面Resourcesr = this.getC on text().getResources();resetTiles(6);loadTile(1, r.getDrawable(R.drawable.redstar);loadTi

40、le(2, r.getDrawable(R.drawable.yellowstar);loadTile(3, r.getDrawable(R.drawable.gree nstar);loadTile(4,r.getDrawable(R.drawable.purplewstar);loadTile(5,r.getDrawable(R.drawable.favourite);private class Positi on public int x;/存储每个点的坐标public int y;public Positi on (i nt xpositi on, int ypositi on) x

41、= xpositi on;y = ypositi on;public boolea n equals(i nt n ewx,i nt n ewy) if (x= n ewx & y = n ewy )return true;return false; public void ininN ewGame()mSn akeTrail.clear();mAppleTrail.clear();mScore=0;stage=1;mSpeed=600;/初始化蛇的位置mSnakeTrail.add(0,new Position(20,20);mSnakeTrail.add(1,new Positio

42、n(19,20);mSnakeTrail.add(2,new Position(18,20);/初始化苹果的位置Apple();Pois on apple();Loveapple();mDirectio n = NORTH;mNextDirection = NORTH;public boolea n on KeyDow n(i nt keyCode,KeyEve nt event)/键盘响应if(mDirection != NORTH)mSpeed = 200;if(keyCode = KeyEve nt.KEYCODE_DPAD_UP)if(mMode = READY | mMode = L

43、OSE) ininN ewGame(); setMode(RUNNING);update();mp.start();return (true); if(mMode = PAUSE) setMode(RUNNING);mp.start();return (true);mNextDirection = SOUTH;mNextDirection = WEST;return (true);if (keyCode = KeyEve nt.KEYCODE_DPAD_DOWN) if (mDirection != SOUTH) mNextDirection = NORTH;return (true);if

44、(keyCode = KeyEve nt.KEYCODE_DPAD_LEFT) if(mDirection != WEST) mNextDirection = EAST;return (true);if (keyCode = KeyEve nt.KEYCODE_DPAD_RIGHT) if (mDirection != EAST) return (true);if(keyCode = KeyEvent.KEYCODE_DPAD_CENTER) if(mCe nterPressed = false)setMode(PAUSE);mp.pause();elsesetMode(RUNNING);mp

45、.start();mCen terPressed = !mCe nterPressed;if(keyCode = KeyEve nt.KEYCODE_1)mUpdateFlag = false;mp.stop();Intent intent = newIntent(this.getContext(),MenuActivity.class);this.getC on text().startActivity(i nte nt);mNextDirection = NORTH;retur n super.。nKeyDow n( keyCode, even t);Overridepublic bool

46、ea n on KeyUp(i nt keyCode, KeyEve nt eve nt)mSpeed = mNSpeed;if(keyCode = KeyEve nt.KEYCODE_DPAD_UP)if(mDirection != NORTH)mNextDirectio n = SOUTH;return (true);if (keyCode = KeyEve nt.KEYCODE_DPAD_DOWN) if (mDirection != SOUTH) return (true);if (keyCode = KeyEve nt.KEYCODE_DPAD_LEFT) if(mDirection

47、 != WEST) mNextDirection = EAST;return (true);if (keyCode = KeyEve nt.KEYCODE_DPAD_RIGHT) if(mDirection != EAST) mNextDirection = WEST;return (true);/ TODO Auto-ge nerated method stubreturn super.o nKeyUp(keyCode, even t);public void setMode(i nt n ewMode)int oldMode = mMode;mMode = n ewMode;Stri ng

48、 str =;if(n ewMode = RUNNING & oldMode != RUNNING)in validate。;mUpdateFlag =true;textView1.setVisibility(ViewNVISIBLE);update();return;if(n ewMode = PAUSE)str =按暂停键继续开始;mUpdateFlag = false;if(n ewMode = LOSE)str =游戏结束,按上键重新开始;mUpdateFlag = false;showRightorNot = new AlertDialog.Builder(this.getC

49、o ntext();showRightorNot.setlc on (R.drawable.ic on);showRightorNot.setTitle(”贪吃蛇);showRightorNot.setPositiveButto n(确定, this);showRightorNot.setNegativeButton(”取消, this);showRightorNot.setMessage(”按确定继续,按取消退出游戏”).show();mp.stop();mp.prepareAs yn c();if(n ewMode = READY)mp.start();str =按上键开始游戏;textV

50、iew1.setText(str);textView1.setVisibility(View.VISIBLE);public void update()if(mUpdateFlag)clearTiles();updateWalls();updateS nake();updateApple();re.sleep(mSpeed);public void updateWalls()for (i nt x = 0; x mYTileCo unt; x+)setTile(3, x,0); 设置顶部界限setTile(3, x,mXTileCou nt-1);for (i nt y = 1; y mXTi

51、leCou nt - 1; y+)setTile(3, 0,y);setTile(3,mYTileCou nt-1,y); public void updates nake()boolea n Sn akegrow = false;/获取蛇的头部Positi on head = mSn akeTrail.get(O);/蛇的新头部设置底部界Positi on n ewHead = new Positi on( 2,2);/根据当前的为方向设置坐标的信息mDirectio n = mNextDirectio n;switch (mDirectio n) case EAST:newHead :=n

52、ew Position(head.x,head.y-1);break;case WEST:n ewHead = new Positi on( head.x,head.y+1);break;case NORTH:n ewHead = new Positi on( head.x+1,head.y);break;case SOUTH: n ewHead = new Positi on( head.x-1,head.y);break;/蛇碰壁检测if(newHead.x 1) | (newHead.y mYTileCount-2) |(n ewHead.y mXTileCou nt-2)setMode

53、(LOSE);return;/蛇自身冲撞检测int sn akele ngth = mSn akeTrail.size();for (int sn ake in dex = 0; sn ake in dex sn akele ngth; sn ake in dex+)Positi on c = mSn akeTrail.get(s nakei ndex);if (c.equals (n ewHead.x ,n ewHead.y)setMode(LOSE);return;/蛇与障碍物的冲撞检测int walle ngth = mWallTrail.size();for ( int walli n

54、dex = 0 ; walli ndex walle ngth; walli ndex+) Positi on c = mWallTrail.get(walli ndex);if (c.equals (n ewHead.x ,n ewHead.y)setMode(LOSE);return;/找苹果int appleco unt = mAppleTrail.size();String str1 =分数:” int apple in dex;for ( apple in dex = 0; apple in dex appleco unt; apple in dex+)Positi on c = m

55、AppleTrail.get(apple in dex);if (c.equals (n ewHead.x ,n ewHead.y) /mAppleTrail.remove(c);Apple();mScore+;if(mScore%3=0)找到苹果mSpeed *=0.95;mNSpeed = mSpeed;stage+;Apple();Pois on apple();Loveapple();Sn akegrow = true;textView2.setText(str1+ mScore+ 按数字键“1”退出游戏);String str2=第+ stage + 关;textView3.setT

56、ext(str2);/毒苹果处理方法int posi oncount = mPois on Apple.size();for (int in dex = 0; in dex posi oncount; in dex+)Positi on c = mPois on Apple.get(i ndex);if (c.equals (n ewHead.x ,n ewHead.y) /找至U苹果mPois on Apple.remove(c);mScore = mScore - 3;mSpeed *= 0.8; in t loveco unt = mLoveApple.size();for (int i

57、n dex = 0; in dex loveco unt; in dex+)Positi on c = mLoveApple.get(i ndex);if (c.equals (n ewHead.x ,n ewHead.y) /找至U苹果mLoveApple.remove(c);mScore = mScore + 5;mSpeed /= 0.8;Obstacle。;/将蛇头的位置信息放在第一个的对象中方取值mSn akeTrail.add(O, n ewHead);if(!S nakegrow)mSn akeTrail.remove(mS nakeTrail.size() - 1); for (Positi on c : mSn akeTrail)setTile(2, c.x, c.y); /随即产生苹果private void Apple()Positi on n ewapple = n ull;boolea n collisi on =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论