智能移动终端应用开发设计报告Android贪吃蛇.docx
《智能移动终端应用开发设计报告Android贪吃蛇.docx》由会员分享,可在线阅读,更多相关《智能移动终端应用开发设计报告Android贪吃蛇.docx(22页珍藏版)》请在冰豆网上搜索。
![智能移动终端应用开发设计报告Android贪吃蛇.docx](https://file1.bdocx.com/fileroot1/2023-1/31/a38d12bb-845a-4962-bbf5-9c620a1e9ce0/a38d12bb-845a-4962-bbf5-9c620a1e9ce01.gif)
智能移动终端应用开发设计报告Android贪吃蛇
XX学院
智能移动终端应用开发
设计报告
(20XX/20XX学年第XX学期)
题目:
基于Android系统的贪吃蛇游戏
专业:
小组成员:
设计成绩:
年月日
摘要
Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。
早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续对Android系统开发运营,它采用了软件堆层(softwarestack,又名软件叠层)的架构,主要分为三部分。
底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。
1项目背景说明
针对当今游戏开发的流行趋势,手机游戏的设计已成为主流,随着计算机技术及硬件技术的不断发展,用户的需求量也越来越多,并且用户追求的效果也越来越好,在此形势下好的设计方法尤为重要,基于android系统的手机游戏设计方法简单且效率较高。
贪吃蛇游戏也是很多人热衷的游戏,用户不仅要求其界面设计精美,更希望操作简单,程序执行速度快。
Android支持使用Java作为编程语言来开发应用程序,而Android的Java开发方面从接口到功能,都有层出不穷的变化。
考虑到Java虚拟机的效率和资源占用,谷歌重新设计了Android的Java,以便能提高效率和减少资源占用,因而与J2ME等不同。
操作系统与应用程序的沟通桥梁,应用分为两层:
函数层(Library)和虚拟机(VirtualMachine)。
Android的中间层多以Java实现,并且采用特殊的Dalvik虚拟机(DalvikVirtualMachine)。
Dalvik虚拟机是一种“暂存器型态”(RegisterBased)的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对减少。
贪吃蛇游戏是一款老牌的手机游戏,同时也是一款比较需要耐心地游戏。
贪吃蛇游戏就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的食物,越吃越长。
只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命。
“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。
本文基于Java技术和android开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。
整个游戏程序分为三个功能模块,五个类模块,实现了游戏的开始、暂停、结束。
通过本游戏的开发,达到学习android平台操作技术和熟悉软件开发流程的目的。
2项目概述
2.1设计的目的与意义
贪吃蛇游戏是一款非常经典的手机游戏,贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。
在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。
因此,在设计开发过程中,需要处理好各个类之间间的逻辑依赖关系和数据通信关系。
正是因为如此,本次设计的目的在于学习Java程序设计基本技术,学习用android开发Java程序的相关技术,熟悉游戏“贪吃蛇”的需求,熟悉项目开发的完整过程。
学会怎样进行一个项目的需求分析、概要设计、详细设计等软件开发过程,熟练地掌握Java程序设计的基本技术和方法,熟练地掌握android环境的使用方法,培养初步的项目分析能力和程序设计能力。
2.2设计的主要内容
贪吃蛇游戏设计与实现,主要分为以下三个模块:
游戏主界面模块、游戏控制模块和游戏菜单模块。
在此只实现游戏的游戏主界面模块、游戏控制模块和游戏菜单模块,并且只是实现开始、暂停、退出等最基本简单的功能。
本次设计要达到的目标分别从以下模块进行阐述:
(1)游戏菜单模块:
这个模块主要是为进入游戏做准备,是进入游戏的第一步,提供“开始游戏”“游戏帮助”“退出游戏”等按钮,通过帮助按钮简单介绍游戏规则。
(2)游戏主界面模块:
游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏分数以及关卡的显示更新界面、提示退出游戏的快捷方式,游戏开始按钮、暂停游戏按钮以及退出游戏按钮。
从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。
(3)游戏控制模块:
这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、退出,移动,加速等功能。
为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。
2.3设计实现的主要功能
本软件在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。
(1)游戏主界面模块:
主要包括游戏图形区域界面、游戏开始按钮、暂停游戏按钮、关闭按钮。
游戏的主界面应该力求美观,爽心悦目。
(2)游戏控制模块:
主要完成控制游戏的开始、暂停、退出等功能,这部分应该做到易懂、易操作而且准确率高,不易出错。
(3)游戏菜单模块:
是进入游戏主界面的第一步,提供“游戏帮助”等功能。
这部分使贪吃蛇游戏软件更加完善。
3游戏需求分析
3.1需求分析
3.1.1用户的特点
游戏开发成功后,最终用户为各个年龄段的人群,用户范围相当广泛。
本游戏友好的用户界面,简单易学的按钮操作以及简单通俗的游戏规则,使广大的用户不需要专门进行培训,就可以立即学会如何使用。
3.1.2功能需求
贪吃蛇是一款经典的手机游戏,一条蛇在封闭围墙里,通过按键盘上下左右四个键控制蛇向上下左右四个方向移动,如果蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记1分;若吃到奖励苹果,加两分;若吃到毒苹果,则减3分。
在游戏过程中,如果长按住方向键不放,则蛇的移动速度加快,松开方向键,恢复原速。
如果蛇在移动中撞到墙或障碍物或者蛇头撞倒自己身体,则游戏结束!
(1)游戏主界面模块需求
游戏界面主框架主要包括游戏图形区域界面、游戏开始按钮、游戏暂停按钮、关闭按钮。
(2)游戏图形区域界面的需求
游戏画布区主要应该包括游戏画布中贪吃蛇随机出现的位置,贪吃蛇重新出现的位置,事物随机出现的位置。
(3)游戏菜单模块的需求
游戏菜单模块主要是为进入游戏主界面做准备,提供“游戏帮助”介绍游戏规则。
同时提供进入游戏和退出游戏等功能。
3.1.3属性需求
在可使用性方面,要求各个功能实现简单,操作方便,系统处理正确;整个系统恢复性能好,连接速度快,以确保系统可使用性好。
另外,还要求系统的可扩展性、可维护性、可移植性良好。
3.2功能模块分析
软件开发过程中的功能模块设计,主要解决实现该游戏需求的程序模块设计问题。
包括如何把该游戏划分成若干个模块、决定各个模块之间的接口、模块之间传递的信息,以及模块结构的设计等。
3.2.1游戏功能
本系统主要完成以下几方面的功能:
游戏控制功能——包括游戏的开始、暂停、退出。
界面布局:
其他辅助功能(如游戏帮助,游戏积分,游戏过关等)
3.2.2总设计模块的划分
游戏总设计模块划分为游戏主要界面模块、游戏控制模块和游戏菜单模块。
3.2.3游戏主界面模块
游戏主界面模块主要是指游戏的框图,其包括一下内容:
1、游戏界面的边界,即游戏中的墙;
2、游戏中蛇的构成,以及苹果的构成;
3、游戏中障碍物的构成;
4、游戏中分数显示以及关卡显示。
3.2.4游戏控制模块
(1)游戏开始控制:
我们的程序是使用上键开始游戏,启动游戏后会有一个初始菜单界面,我们点击“开始游戏”,弹出一句话“请按上键开始游戏”。
游戏开始后蛇向下移动,然后由控制上下左右键来控制蛇的移动。
在程序中我们重新建了一个activity来控制游戏的开始,使游戏的开始界面更美观。
(2)游戏暂停控制:
我们是使用center键来控制游戏的暂停的,这是一项人性化的设计,当玩家在游戏过程中突遇紧急情况时可以按center键暂停游戏,等玩家空闲后按center键可以继续游戏。
(3)游戏退出控制:
在游戏的退出上我们的程序使用了多种方式来应对不同的情况,当玩家正在游戏中时,如想退出可以按“1”键,程序会自动跳转到初始菜单界面,在初始菜单界面点击“退出游戏”即可退出游戏。
如果玩家在游戏中由于碰到墙或者咬到自己或者碰到障碍物而导致游戏结束的,游戏或自动弹出一个界面,里面有提示是继续游戏还是退出游戏,当点击“取消”时,游戏就会自动跳转到初始菜单,再点击“退出游戏”即可。
4设计与实现
具体实现过程分为以下3步:
项目框架、游戏类图设计、界面设计。
(1)项目框架:
新建一个Eclipse工程并命名为Snake,工程如下图所示:
图1Snake工程
工程中包括4个Activity,分别为Snake(主界面)、Game(游戏界面)、Help(游戏说明界面)、AuthorView(作者信息界面),通过不同Activity之间的转换实现不同界面之间的切换。
游戏主界面如下图所示:
图2游戏主界面
(2)游戏类图设计
Game(Activity)继承了SnakeView类,SnakeView类继承了TileView类。
TileView类继承了View。
TiltView的基类是View,包含了贪吃蛇游戏画面的各个设定参数,主要负责绘制游戏画面。
TileView类定义如下:
publicclassTileViewextendsView{
privatestaticfinalStringtag="yao";
protectedstaticintmTileSize=20;//方格的边长
protectedstaticintmXTileCount;//X轴上方格的个数
protectedstaticintmYTileCount;//Y轴上方格的个数
privatestaticintmXOffset;//绘图时X轴上的起始坐标
privatestaticintmYOffset;//绘图时Y轴上的起始坐标
privateBitmap[]mTileArray;//位图数组
privateint[][]mTileGrid;//映射整个游戏画面的数组
privatefinalPaintmPaint=newPaint();//画笔
publicTileView(Contextcontext,AttributeSetattrs){
super(context,attrs);
Log.i(tag,"TileViewConstructor");
Log.i(tag,"mTileSize="+mTileSize);
}
//重置位图数组的长度
publicvoidresetTiles(inttilecount){
mTileArray=newBitmap[tilecount];
}
@Override
//适应各种分辨率的屏幕,当改变屏幕大小尺寸时,同时修改tile的相关计数指标
protectedvoidonSizeChanged(intw,inth,intoldw,intoldh){
Log.i(tag,"onSizeChanged,"+"w="+w+"h="+h+"oldw="+oldw+"oldh="+oldh);
mXTileCount=(int)Math.floor(w/mTileSize);
mYTileCount=(int)Math.floor(h/mTileSize);
Log.i(tag,"mXTileCount="+mXTileCount);
Log.i(tag,"mYTileCount="+mYTileCount);
mXOffset=((w-(mTileSize*mXTileCount))/2);
mYOffset=((h-(mTileSize*mYTileCount))/2);
Log.i(tag,"mXOffset="+mXOffset);
Log.i(tag,"mYOffset="+mYOffset);
mTileGrid=newint[mXTileCount][mYTileCount];
clearTiles();
}
//这里做了一个Drawable到bitmap的转换
publicvoidloadTile(intkey,Drawabletile){
Bitmapbitmap=Bitmap.createBitmap(mTileSize,mTileSize,Bitmap.Config.ARGB_8888);
Canvascanvas=newCanvas(bitmap);
tile.setBounds(0,0,mTileSize,mTileSize);
tile.draw(canvas);
mTileArray[key]=bitmap;
}
//清空图形显示
publicvoidclearTiles(){
Log.i(tag,"TileView.clearTiles");
for(intx=0;xfor(inty=0;ysetTile(0,x,y);
}
}
}
//在相应的坐标位置绘制相应的砖块
publicvoidsetTile(inttileindex,intx,inty){
mTileGrid[x][y]=tileindex;
}
//onDraw
@Override
//将直接操作的画布绘制到手机界面上
publicvoidonDraw(Canvascanvas){
Log.i(tag,"onDraw");
super.onDraw(canvas);
Bitmapbmp;
floatleft;
floattop;
for(intx=0;xfor(inty=0;yif(mTileGrid[x][y]>0){
bmp=mTileArray[mTileGrid[x][y]];
left=x*mTileSize+mXOffset;
top=y*mTileSize+mYOffset;
canvas.drawBitmap(bmp,left,top,mPaint);
}
}
}
}
}
SnakeView类定义了游戏运行时的画面改变及蛇体和果子的更新方法。
首先用Handler机制实现定时刷新,代码如下:
classRefreshHandlerextendsHandler{
//获取消息并处理
@Override
publicvoidhandleMessage(Messagemsg){
SnakeView.this.update();
SnakeView.this.invalidate();//刷新view为基类的界面
Log.i(tag,"handleMessage|ThreadName="+Thread.currentThread().getName());
}
//定时发送消息给UI线程,以此达到更新效果
publicvoidsleep(longdelayMillis){
this.removeMessages(0);//清空消息队列,Handler进入对新消息的等待
Log.i(tag,"sleep|ThreadName="+Thread.currentThread().getName());
//定时发送新消息,激活handler
sendMessageDelayed(obtainMessage(0),delayMillis);
}
};
定义SnakeView()函数初始化游戏,代码如下:
publicSnakeView(Contextcontext,AttributeSetattrs){
super(context,attrs);
Log.i(tag,"SnakeViewConstructor");
initSnakeView();//构造函数中,初始化游戏
}
定义initSnakeView()初始化SnakeView类,代码如下:
privatevoidinitSnakeView(){
Log.e(tag,"initSnakeView");
//设置焦点,由于存在文字界面和游戏界面的跳转。
这个focus是不可或缺的。
setFocusable(true);
//取得资源中的图片,加载到砖块字典中。
Resourcesr=this.getContext().getResources();
resetTiles(4);
loadTile(RED_STAR,r.getDrawable(R.drawable.redstar));
loadTile(YELLOW_STAR,r.getDrawable(R.drawable.yellowstar));
loadTile(GREEN_STAR,r.getDrawable(R.drawable.greenstar));
}
此外还定义了updateWalls()、updateApples()、updateSnake()绘制墙、果子、蛇,以及更新画面函数、保存位置坐标函数等,具体代码请详见目录。
(3)界面设计
界面设计包括游戏主界面(Snake)、作者信息界面、游戏说明界面、游戏界面的设计。
界面的设计采用的是xml文档形式,在xml文档中规划好界面布局布局后,分别在java文件中声明。
主界面设计:
主界面包括一个TextView、一个imagebutton、三个button,其main.xml文档如下:
xmlversion="1.0"encoding="utf-8"?
>
android="
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"android:
background="@drawable/icon">
android:
orientation="vertical"
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"android:
gravity="center">
textColor="#ff3456ff"android:
textSize="40sp"android:
layout_height="wrap_content"android:
visibility="visible"android:
text="Snake"android:
layout_width="wrap_content"android:
id="@+id/text"android:
gravity="center_horizontal">
android:
visibility="visible"
android:
layout_width="wrap_content"
android:
layout_height="wrap_content"
android:
id="@+id/ImageButton1">
其对应的Snake.java文件如下:
publicclassSnakeextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initialstart();//初始化
}
publicvoidinitialstart(){
ImageButtonimageButton=(ImageButton)this.findViewById(R.id.ImageButton1);
Buttonbutton1=(Button)this.findViewById(R.id.Button1);
Buttonbutton3=(Button)this.findViewById(R.id.Button3);
Buttonbutton5=(Button)this.findViewById(R.id.Button5);
button1.setText("作者信息");
button3.setText("退出");
button5.setText("游戏说明");
imageButton.setImageResource(R.drawable.icon1);
//按钮注册到各自的监听器
image