基于Android的贪吃蛇游戏的设计与开发1. 程序构思贪吃蛇游戏是一款非常经典的手机游戏,贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。
在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。
因此,在设计开发过程中,需要处理好各个类之间间的逻辑依赖关系和数据通信关系。
正是因为如此,本次设计的目的在于学习Java程序设计基本技术,学习用android开发Java 程序的相关技术,熟悉游戏“贪吃蛇”的需求,熟悉项目开发的完整过程。
学会怎样进行一个项目的需求分析、概要设计、详细设计等软件开发过程,熟练地掌握Java程序设计的基本技术和方法,熟练地掌握android环境的使用方法,培养初步的项目分析能力和程序设计能力。
2.程序设计游戏设计的处理流程图2.1 游戏功能本系统主要完成以下几方面的功能:游戏控制功能——包括游戏的开始、暂停、退出界面布局其他辅助功能(如游戏帮助,游戏积分,游戏过关等)2.2 总设计模块的划分游戏总设计模块划分为游戏主要界面模块、游戏控制模块和游戏菜单模块。
2.3 游戏主界面模块游戏主界面模块主要是指游戏的框图,其包括一下内容:1、游戏界面的边界,即游戏中的墙;2、游戏中蛇的构成,以及苹果的构成;3、游戏中障碍物的构成;4、游戏中分数显示以及关卡显示。
2.4 游戏控制模块(1)游戏开始控制:我们的程序是使用上键开始游戏,启动游戏后会有一个初始菜单界面,我们点击“开始游戏”,弹出一句话“请按上键开始游戏”。
游戏开始后蛇向下移动,然后由控制上下左右键来控制蛇的移动。
在程序中我们重新建了一个activity来控制游戏的开始,使游戏的开始界面更美观。
(2)游戏暂停控制:我们是使用center键来控制游戏的暂停的,这是一项人性化的设计,当玩家在游戏过程中突遇紧急情况时可以按center键暂停游戏,等玩家空闲后按center键可以继续游戏。
(3)游戏退出控制:在游戏的退出上我们的程序使用了多种方式来应对不同的情况,当玩家正在游戏中时,如想退出可以按“1”键,程序会自动跳转到初始菜单界面,在初始菜单界面点击“退出游戏”即可退出游戏。
如果玩家在游戏中由于碰到墙或者咬到自己或者碰到障碍物而导致游戏结束的,游戏或自动弹出一个界面,里面有提示是继续游戏还是退出游戏,当点击“取消”时,游戏就会自动跳转到初始菜单,再点击“退出游戏”即可。
2.5类模块设计src源码目录:Snake.java为主界面类;SnakeView 为贪吃蛇类的视图主要逻辑控制和绘制类;TitleView 为界面的整体视图;MenuActivity为菜单类,可以跳转到Help类和Snake类;Help为游戏帮助类。
3.程序实现1、游戏界面的实现1、先声明用来存放绘画图像的X,Y轴的位置的数组:private int[][] mTileGrid;2、编写存放图片索引用图片的X,Y轴位置;public void setTile(int tileindex, int x, int y){ mTileGrid[x][y] = tileindex; }3. 把图片素材加入到bitmap中public void loadTile(int key, Drawable tile){Bitmap bitmap =Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);tile.setBounds(0, 0, mTileSize, mTileSize);tile.draw(canvas);mTileArray[key] = bitmap;}4、调用以上的方法以循环的方式位置数组赋值以及图片的索引,private void updateWalls() {for (int x = 0; x < mXTileCount; x++) {setTile(GREEN_STAR, x, 0);setTile(GREEN_STAR, x, mYTileCount - 1); }for (int y = 1; y < mYTileCount - 1; y++) {setTile(GREEN_STAR, 0, y);/设置左边的界线的位置setTile(GREEN_STAR, mXTileCount - 1, y);/设置右边的界线的位置}}5、重写VIEW 类里面的方法。
把界线画出。
public void onDraw(Canvas canvas){super.onDraw(canvas);for (int x = 0; x < mXTileCount; x += 1) {for (int y = 0; y < mYTileCount; y += 1) {if (mTileGrid[x][y] > 0) {canvas.drawBitmap(mTileArray[mTileGrid[x][y]],mXOffset + x * mTileSize,mYOffset + y * mTileSize, mPaint);}同上可见:整个界面其实就是由图片数组拼直面成的。
到此,则可以实现游戏背景墙。
2、游戏整个框架的构建1 实现方案游戏的整个框架的构建包括基本的蛇身,苹果的实现,有两种方案:方案一:使用常用的数组来存储蛇身和苹果的点集的信息。
此方案的优点是对数组的操作较为熟悉,实现简单,但是部分操作较为麻烦,有可能出现数组越界,或者浪费太多存储空间。
方案二:使用动态数组ArrayList来存储蛇身和苹果点集的信息。
ArrayList可以用来定义为各种不同类型的数组,不仅仅局限于int整型;而且ArrayList为用户编程提供了各种借口,比如插入,删除元素,统计元素个数等,实现较为简单,不会出现数组越界的问题。
结合各种因素的考虑,我们在设计中采用第二种方案。
定义Position方法,用于存储蛇身和苹果的点集坐标private class Position { //存储每个点的坐标public int x;public int y;public Position(int xposition, int yposition) {x = xposition;y = yposition;}public boolean equals(int newx,int newy) {if (x == newx && y == newy ){ return true; }return false;} }定义setMode方法,用于表示游戏所处的几种状态:进行,暂停,public void setMode(int newMode){int oldMode = mMode;mMode = newMode;if(newMode == RUNNING && oldMode != RUNNING){}if(newMode == PAUSE){}if(newMode == LOSE) {}if(newMode == READY) {}}苹果的实现声明:private ArrayList<Position> mAppleTrail = new ArrayList<Position>();用于存储苹果的坐标位置根据游戏的需要,苹果的位置应该是随机产生的,使用java.util.Random类中提供的随机数实现苹果坐标的随机。
int newapplex = 2+random.nextInt((mYTileCount-2)-4);int newappley = 2+random.nextInt((mXTileCount-2)-4);newapple = new Position(newapplex,newappley);检测苹果坐标是否与蛇的坐标以及墙的左边冲突设置冲突标志位:boolean flag = false;int snakelength = mSnakeTrail.size();for (int index = 0; index < snakelength; index++){if (mSnakeTrail.get(index).equals(newapple.x,newapple.y)){ flag = true; }}墙的冲突检测方法与上同;当产生的新坐标没有问题时,则把新坐标加入到mAppleTrail中。
蛇的实现声明:private ArrayList<Position> mAppleTrail = new ArrayList<Position>();用于存储苹果的坐标位置蛇的初始化蛇身的初始化在ininNewGame中实现,直接把最初要呈现给玩家的蛇的情况定义出来,即添加一定数量的坐标点进入mSnakeTrail中,使得在最初开始游戏时,有蛇可以进行自由移动。
蛇的移动游戏中是通过触发来改变坐标(+1,-1)的方式来改蛇头的方向,包括后面的蛇的碰撞检测都要用到蛇头。
获取蛇的头部:Position head = mSnakeTrail.get(0);蛇的新头部:Position newHead = new Position(2,2);通过设置整型变量mDirection以及mNextDirection来判断蛇下一步移动方向,然后改变蛇头的坐标,使蛇移动switch (mDirection) {case EAST:{newHead = new Position(head.x,head.y-1);break;}…….}蛇的碰撞检测蛇在移动时,若碰撞到墙壁或者自己身体,则游戏结束。
蛇的碰壁检测:if((head.x < 1) || (head.y < 1) || (head.x > mYTileCount-2)|| (head.y > mXTileCount-2)){setMode(LOSE);return;}蛇的自身碰撞的检测:int wallength = mWallTrail.size();for ( int wallindex = 0 ; wallindex < wallength; wallindex++){Position c = mWallTrail.get(wallindex);if (c.equals(newHead.x,newHead.y)){setMode(LOSE);return;} }蛇吃苹果的实现蛇所经过的每一个坐标,他们都要在苹果所在的ArrayList<Position> mAppleList = new ArrayList<Position>())坐标集里面集依次判断,若是坐标相同,那个这个苹果就被蛇吃了。