基于android的贪吃蛇游戏设计与开发Word文件下载.docx
《基于android的贪吃蛇游戏设计与开发Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于android的贪吃蛇游戏设计与开发Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。
![基于android的贪吃蛇游戏设计与开发Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/11/68f5ab2b-e60c-4fb5-993a-b3ab4e9b77b1/68f5ab2b-e60c-4fb5-993a-b3ab4e9b77b11.gif)
6.附录
1、程序构思
贪吃蛇游戏是一款非常经典的手机游戏,贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。
在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。
因此,在设计开发过程中,需要处理好各个类之间间的逻辑依赖关系和数据通信关系。
正是因为如此,本次设计的目的在于学习Java程序设计基本技术,学习用android开发Java程序的相关技术,熟悉游戏“贪吃蛇”的需求,熟悉项目开发的完整过程。
学会怎样进行一个项目的需求分析、概要设计、详细设计等软件开发过程,熟练地掌握Java程序设计的基本技术和方法,熟练地掌握android环境的使用方法,培养初步的项目分析能力和程序设计能力。
2、程序设计
游戏设计的处理流程图:
游戏功能
本系统主要完成以下几方面的功能:
游戏控制功能——包括游戏的开始、暂停、退出
界面布局
其他辅助功能(如游戏帮助,游戏积分,游戏过关等)
总设计模块的划分
游戏总设计模块划分为游戏主要界面模块、游戏控制模块和游戏菜单模块。
游戏主界面模块
游戏主界面模块主要是指游戏的框图,其包括一下内容:
1、游戏界面的边界,即游戏中的墙;
2、游戏中蛇的构成,以及苹果的构成;
3、游戏中障碍物的构成;
4、游戏中分数显示以及关卡显示。
游戏控制模块
(1)游戏开始控制:
我们的程序是使用上键开始游戏,启动游戏后会有一个初始菜单界面,我们点击“开始游戏”,弹出一句话“请按上键开始游戏”。
游戏开始后蛇向下移动,然后由控制上下左右键来控制蛇的移动。
在程序中我们重新建了一个activity来控制游戏的开始,使游戏的开始界面更美观。
(2)游戏暂停控制:
我们是使用center键来控制游戏的暂停的,这是一项人性化的设计,当玩家在游戏过程中突遇紧急情况时可以按center键暂停游戏,等玩家空闲后按center键可以继续游戏。
(3)游戏退出控制:
在游戏的退出上我们的程序使用了多种方式来应对不同的情况,当玩家正在游戏中时,如想退出可以按“1”键,程序会自动跳转到初始菜单界面,在初始菜单界面点击“退出游戏”即可退出游戏。
如果玩家在游戏中由于碰到墙或者咬到自己或者碰到障碍物而导致游戏结束的,游戏或自动弹出一个界面,里面有提示是继续游戏还是退出游戏,当点击“取消”时,游戏就会自动跳转到初始菜单,再点击“退出游戏”即可。
类模块设计
src源码目录:
为主界面类;
SnakeView为贪吃蛇类的视图主要逻辑控制和绘制类;
TitleView为界面的整体视图;
MenuActivity为菜单类,可以跳转到Help类和Snake类;
Help为游戏帮助类。
3、程序实现
、游戏界面的实现
1、先声明用来存放绘画图像的X,Y轴的位置的数组:
privateint[][]mTileGrid;
2、编写存放图片索引用图片的X,Y轴位置;
publicvoidsetTile(inttileindex,intx,inty)
{mTileGrid[x][y]=tileindex;
}
3.把图片素材加入到bitmap中
publicvoidloadTile(intkey,Drawabletile)
{
Bitmapbitmap=
Canvascanvas=newCanvas(bitmap);
(0,0,mTileSize,mTileSize);
(canvas);
mTileArray[key]=bitmap;
4、调用以上的方法以循环的方式位置数组赋值以及图片的索引,
privatevoidupdateWalls(){
for(intx=0;
x<
mXTileCount;
x++){
setTile(GREEN_STAR,x,0);
setTile(GREEN_STAR,x,mYTileCount-1);
}
for(inty=1;
y<
mYTileCount-1;
y++){
setTile(GREEN_STAR,0,y);
/设置左边的界线的位置
setTile(GREEN_STAR,mXTileCount-1,y);
/设置右边的界线的位置
}}
5、重写VIEW类里面的方法。
把界线画出。
publicvoidonDraw(Canvascanvas)
{
(canvas);
for(intx=0;
x+=1){
for(inty=0;
mYTileCount;
y+=1){
if(mTileGrid[x][y]>
0){
(mTileArray[mTileGrid[x][y]],
mXOffset+x*mTileSize,
mYOffset+y*mTileSize,mPaint);
同上可见:
整个界面其实就是由图片数组拼直面成的。
到此,则可以实现游戏背景墙。
、游戏整个框架的构建
1实现方案
游戏的整个框架的构建包括基本的蛇身,苹果的实现,有两种方案:
方案一:
使用常用的数组来存储蛇身和苹果的点集的信息。
此方案的优点是对数组的操作较为熟悉,实现简单,但是部分操作较为麻烦,有可能出现数组越界,或者浪费太多存储空间。
方案二:
使用动态数组ArrayList来存储蛇身和苹果点集的信息。
ArrayList可以用来定义为各种不同类型的数组,不仅仅局限于int整型;
而且ArrayList为用户编程提供了各种借口,比如插入,删除元素,统计元素个数等,实现较为简单,不会出现数组越界的问题。
结合各种因素的考虑,我们在设计中采用第二种方案。
定义Position方法,用于存储蛇身和苹果的点集坐标
privateclassPosition{quals,)
{flag=true;
墙的冲突检测方法与上同;
当产生的新坐标没有问题时,则把新坐标加入到mAppleTrail中。
蛇的实现
声明:
privateArrayList<
Position>
mAppleTrail=newArrayList<
();
用于存储苹果的坐标位置
蛇的初始化
蛇身的初始化在ininNewGame中实现,直接把最初要呈现给玩家的蛇的情况定义出来,即添加一定数量的坐标点进入mSnakeTrail中,使得在最初开始游戏时,有蛇可以进行自由移动。
蛇的移动
游戏中是通过触发来改变坐标(+1,-1)的方式来改蛇头的方向,包括后面的蛇的碰撞检测都要用到蛇头。
获取蛇的头部:
Positionhead=(0);
蛇的新头部:
PositionnewHead=newPosition(2,2);
通过设置整型变量mDirection以及mNextDirection来判断蛇下一步移动方向,然后改变蛇头的坐标,使蛇移动
switch(mDirection){
caseEAST:
{
newHead=newPosition,;
break;
…….
}
蛇的碰撞检测
蛇在移动时,若碰撞到墙壁或者自己身体,则游戏结束。
蛇的碰壁检测:
if(<
1)||<
1)||>
mYTileCount-2)
||>
mXTileCount-2))
setMode(LOSE);
return;
蛇的自身碰撞的检测:
intwallength=();
for(intwallindex=0;
wallindex<
wallength;
wallindex++)
{
Positionc=(wallindex);
if,)
setMode(LOSE);
return;
}}
蛇吃苹果的实现
蛇所经过的每一个坐标,他们都要在苹果所在的ArrayList<
mAppleList=newArrayList<
())坐标集里面集依次判断,若是坐标相同,那个这个苹果就被蛇吃了。
找苹果的方法:
intapplecount=();
intappleindex;
for(appleindex=0;
appleindex<
applecount;
appleindex++)
Positionc=(appleindex);
if,){}
、实现键盘响应事件
键盘主要起操作作用,可以控制蛇的行走方向:
publicbooleanonKeyDown(intkeyCode,KeyEventevent)
、刷新
只要继承Handler类就可以对消息进行控制,或者处理
classRefreshHandlerextendsHandler{
tartActivity(intent);
设置加速
根据实际操作需要,当操控蛇的移动时,若按下方向键不放,则蛇在该方向上的运行速度就会加快;
若松开方向键则恢复原速度。
通过设置整型变量mSpeed和mNSpeed,其中mNSpeed用来保存蛇在该关卡的移动速度。
通过键盘响应函数publicbooleanonKeyDown(intkeyCode,KeyEventevent)和publicbooleanonKeyUp(intkeyCode,KeyEventevent)一起来实现加速功能。
提示对话框
在游戏结束后弹出对话框询问玩家的下一步动作,按确定按钮继续开始新的游戏,按取消退出游戏。
声明对象:
privateshowRightorNot;
弹出对话框的界面:
showRightorNot=new());
("
贪吃蛇"
);
确定"
this);
取消"
("
按确定继续,按取消退出游戏"
).show();
3、类模块具体设计
中的成员变量表
变量
类型
意义
赋值
mTileArray[]
privateBitmap
声明四种类型的小块,黄绿红黑
mTileSize
protectedstaticfinalint
小块边长
12
mXTileCount
protectedstaticint
x方向小块个数
y方向小块个数
mTileGrid
privateint[][]
每个小块的数值
mXOffset
protectedint
横向偏移量
mYOffset;
纵向偏移量
paint
privatePaint
newPaint();
成员方法
作用
TAG
publicstaticfinalString
"
Snakeview"
showRightorNot
Private
游戏继续提示
mDirection
privateint
控制蛇的移动方向
SOUTH
mNextDirection
控制蛇的下一个移动方向
NORTH
privatestaticfinalint
控制蛇向上移动
1
控制蛇向下移动
2
EAST
控制蛇向右移动
3
WEST
控制蛇向左移动
4
READY
publicstaticfinalint
RUNNING
控制游戏开始
PAUSE
控制游戏暂停
LOSE
控制游戏结束
textView1;
privateTextView
textView2;
textView3;
mCenterPressed
privateboolean
false
mUpdateFlag
mMode
publicint
stage
记录通关等级
mScore
计分
mSpeed
刷新界面时间变量
600
mNSpeed
re
privateRefreshHandler
刷新界面处理变量
newRefreshHandler();
random
privatestaticfinalRandom
newRandom();
mRecord
privateint[]
=newint[10]
成员变量
publicstaticfinalStringTAG
privateshowRightorNot
onCreate
protectedvoidonCreate
4.程序结果
保存原程序,启动模拟机,选择javaapplication,运行结果如下:
5.总结与展望
贪吃蛇是一个简单的游戏,却让我吃了很多的苦头,从搭建开发环境到对程序进行调试,出现了各种各样的问题,像JDK版本现错了啊,环境变量的设置出错啊,调试的时候那个R文件不能够读取我用了3天才发现只是大小写的问题等等,这些让我深刻地(绝对深刻)认识到细节对一个想要成为一个优秀程序员是多么不可或缺的品质。
这一次的实验很多代码是从网上找来的,我自己只是起到了一个整合处理的作用,还有一小部分自己还不是完全搞懂,我还将花一部分时间来弄明白他们,争取自己能够独立的编写出一个完整的完美的程序来。
6.附录
/**
*@authorAdministrator
*
*/
publicstaticfinalStringTAG="
;
privateshowRightorNot;
privateintmDirection=SOUTH;
privateintmNextDirection=SOUTH;
etResources();
resetTiles(6);
}
privateclassPosition{tartActivity(intent);
return(keyCode,event);
@Override
publicbooleanonKeyUp(intkeyCode,KeyEventevent)
mSpeed=mNSpeed;
if(keyCode==
{
if(mDirection!
=NORTH)
{
mNextDirection=SOUTH;
}
return(true);
if(keyCode=={
if(mDirection!
=SOUTH){
mNextDirection=NORTH;
return(true);
if(keyCode=={
=WEST){
mNextDirection=EAST;
if(mDirection!
=EAST){
mNextDirection=WEST;
}
how();
();
();
}
if(newMode==READY)
();
str="
按上键开始游戏"
(str);
;
}
publicvoidupdate()
if(mUpdateFlag)
clearTiles();
updateWalls();
updateSnake();
updateApple();
(mSpeed);
publicvoidupdateWalls()
for(intx=0;
mYTileCount;
x++)
setTile(3,x,0);
1”quals,)
flag=true;
}}
for(intindex=0;
index<
index++)
if(index).equals,)
collision=!
flag;
quals,)
flags=true;
collision1=!
flags;
intwallength=();
flagw=true;
}}
collision2=!
flagw;
//把apple的坐标添加到appleTrail中
(newalove);
publicvoidupdateApple()
for(Positionc:
mAppleTrail)
{
setTile(1,,;
publicvoidObstacle()
switch(stage){
case5:
{
(0,newPosition(32,7));
(1,newPosition(31,7));
(2,newPosition(30,7));
(3,newPosition(29,7));
(4,newPosition(28,7));
(5,newPosition(27,7));
(6,newPosition(26,7));
(7,newPosition(25,7));
for(Positionc:
mWallTrail)
setTile(3,,;
mPoisonApple)
setTile(4,,;
mLoveApple)
setTile(5,,;
case4:
//();