android开发《嵌入式软件实现技能》设计报告.docx
《android开发《嵌入式软件实现技能》设计报告.docx》由会员分享,可在线阅读,更多相关《android开发《嵌入式软件实现技能》设计报告.docx(60页珍藏版)》请在冰豆网上搜索。
android开发《嵌入式软件实现技能》设计报告
《嵌入式软件实践技能》
设计报告
(2011—2012学年第1学期)
题目:
基于Android的贪吃
蛇游戏的设计与开发
专业:
计算机科学与技术
班级:
姓名学号:
指导教师:
成绩:
计算机科学与技术系
2011
年
12
月
26
日
第1章开发环境的搭建
操作系统
WindowsXPSP3(32位)
需要的软件
1.SKDManager:
android-sdk_r10-windows.zip
下载地址:
2.JDK:
jdk-6u25-windows-i586.exe
下载地址:
3.Eclipse:
eclipse-jee-helios-SR2-win32.zip
下载地址:
http:
//www.eclipse.org/downloads/
4.ADT:
ADT-10.0.1.zip
下载地址:
这些软件都是国外网站上的资源,一般方法可能无法访问,自己想办法吧…
安装JDK
一步步往下点就行了,没什么可说的。
安装SDKManager
解压SDKManager,里面的文件如下:
这是已经下载了SDK的,最初的文件会有所不同。
启动SDKManager.exe,程序会自动联网搜寻最新的资源信息:
选择你需要安装的资源包,点击“Accept”->“Install”,程序会自动下载并安装:
安装好的资源包列表如下:
---------------------------------------------------------------------------------------------------------------------
创建AVD
打开SDKManager,点击左侧的“Virtualdevices”,右侧会列出当前所有的AVD:
点击“New”按钮,弹出新建AVD界面:
Name:
Virtualdevice的名称,自定义;
Target:
使用哪个版本的SDK进行开发,选择项;
SDCard:
SD卡的大小,自定义;
Skin:
模拟器皮肤,选项会根据SDK版本的不同而有所变化,如果使用的是大屏幕的显示器可以选择WVGA800,笔记本的话最好选择HVGA,否则模拟器可能会显示不全。
---------------------------------------------------------------------------------------------------------------------
启动AVD
选中要启动的AVD,点击“Start”按钮,弹出启动选项:
点击“Launch”按钮,进入启动界面:
AVD的启动过程要花费相当长的时间,而且超耗费电脑资源,我的本本CPU温度就飙到了90多度,不过启动之后就恢复正常了。
如果要频繁使用AVD调试程序的话,最好一直开着。
启动之后主界面如下:
----------------------------------------------------------------------------------------------------------------------
AVD语言设置
AVD默认是英文界面,调整语言方法如下
点击右侧操作界面上的“HOME”->“MENU”按钮,左侧底部出现菜单:
点击“Settings”按钮,进入设置选项:
点击“Language&keyboard”,进入语言设置界面:
选择“中文(简体)”就行了
安装Eclipse和ADT
解压Eclipse,里面的文件如下:
点击“eclipse.exe”,启动eclipse,启动速度也是够慢的
安装ADT
建议先断开网络连接
点击“Help”->“InstallNewSoftware”:
点击“Add”按钮,输入名称,选择ADT文件:
选择安装全部文件:
然后一步步点下一个就行了。
安装完成后需要重启Eclipse
----------------------------------------------------------------------------------------------------------------------
配置AndroidSDK
启动Eclipse,点击“Window”->“Preferences”
然后点击“Android”,选择SDKLocation:
然后点击“Apply”->“OK”,完成。
---------------------------------------------------------------------------------------------------------------------
建立Android项目
打开Eclipse,点击“File”->“New”->“AndroidProject”
输入必需的选项:
Packagename:
必需包含一个后缀;
MinSDKVersion:
要跟BuidTarget的APILevel对应。
点击“Finish”,完成。
程序界面如下:
编辑helloandroid.java,输出一些文字作测试。
----------------------------------------------------------------------------------------------------------------------
运行Android项目
建议先启动模拟器
选中项目->右键->RunAs->AndroidApplication
过一会就可以看到模拟器里面的结果了。
第2章贪吃蛇游戏开发
基于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中
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;
}
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(Canvascanvas)
{
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方法,用于存储蛇身和苹果的点集坐标
privateclassPosition{//存储每个点的坐标
publicintx;
publicinty;
publicPosition(intxposition,intyposition){
x=xposition;
y=yposition;
}
publicbooleanequals(intnewx,intnewy){
if(x==newx&&y==newy)
{returntrue;}
returnfalse;
}}
定义setMode方法,用于表示游戏所处的几种状态:
进行,暂停,
publicvoidsetMode(intnewMode)
{
intoldMode=mMode;
mMode=newMode;
if(newMode==RUNNING&&oldMode!
=RUNNING)
{}
if(newMode==PAUSE){}
if(newMode==LOSE){}
if(newMode==READY){}
}
苹果的实现
声明:
privateArrayListmAppleTrail=newArrayList();
用于存储苹果的坐标位置
根据游戏的需要,苹果的位置应该是随机产生的,使用java.util.Random类中提供的随机数实现苹果坐标的随机。
intnewapplex=2+random.nextInt((mYTileCount-2)-4);
intnewappley=2+random.nextInt((mXTileCount-2)-4);
newapple=newPosition(newapplex,newappley);
检测苹果坐标是否与蛇的坐标以及墙的左边冲突
设置冲突标志位:
booleanflag=false;
intsnakelength=mSnakeTrail.size();
for(intindex=0;index{
if(mSnakeTrail.get(index).equals(newapple.x,newapple.y))
{flag=true;}
}
墙的冲突检测方法与上同;当产生的新坐标没有问题时,则把新坐标加入到mAppleTrail中。
蛇的实现
声明:
privateArrayListmAppleTrail=newArrayList();
用于存储苹果的坐标位置
蛇的初始化
蛇身的初始化在ininNewGame中实现,直接把最初要呈现给玩家的蛇的情况定义出来,即添加一定数量的坐标点进入mSnakeTrail中,使得在最初开始游戏时,有蛇可以进行自由移动。
蛇的移动
游戏中是通过触发来改变坐标(+1,-1)的方式来改蛇头的方向,包括后面的蛇的碰撞检测都要用到蛇头。
获取蛇的头部:
Positionhead=mSnakeTrail.get(0);
蛇的新头部:
PositionnewHead=newPosition(2,2);
通过设置整型变量mDirection以及mNextDirection来判断蛇下一步移动方向,然后改变蛇头的坐标,使蛇移动
switch(mDirection){
caseEAST:
{
newHead=newPosition(head.x,head.y-1);
break;
}
…….
}
蛇的碰撞检测
蛇在移动时,若碰撞到墙壁或者自己身体,则游戏结束。
蛇的碰壁检测:
if((head.x<1)||(head.y<1)||(head.x>mYTileCount-2)
||(head.y>mXTileCount-2))
{
setMode(LOSE);
return;
}
蛇的自身碰撞的检测:
intwallength=mWallTrail.size();
for(intwallindex=0;wallindex{
Positionc=mWallTrail.get(wallindex);
if(c.equals(newHead.x,newHead.y))
{
setMode(LOSE);
return;
}}
蛇吃苹果的实现
蛇所经过的每一个坐标, 他们都要在苹果所在的ArrayList mAppleList = new ArrayList())坐标集里面集依次判断,若是坐标相同,那个这个苹果就被蛇吃了 。
找苹果的方法:
intapplecount=mAppleTrail.size();
intappleindex;
for(appleindex=0;appleindex{
Positionc=mAppleTrail.get(appleindex);
if(c.equals(newHead.x,newHead.y)){}
}
实现键盘响应事件:
键盘主要起操作作用, 可以控制蛇的行走方向:
publicbooleanonKeyDown(intkeyCode,KeyEventevent)//键盘响应
{
if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN){
if(mDirection!
=SOUTH)
{
mNextDirection=NORTH;
}
return(true);
}
……..
}
刷新
只要继承Handler类就可以对消息进行控制,或者处理
class RefreshHandler extends Handler{
//响应消息
public void handleMessage(Messagemsg){
SnakeView.this.update();// 重要页面
SnakeView.this.invalidate();刷新页面
}
// 向外提供人工的调用消息的接口,
public void sleep(long delayMillis){
this.removeMessages(0);//注消消息
// 添加消息,
sendMessageDelayed(obtainMessage(0),delayMillis);
}
实现页面的切换
程序中从主菜单界面到游戏界面的切换以及从主菜单界面到游戏帮助界面都采用的是活动的切换方法;
使用startActivity(newIntent(MenuActivity.this,Snake.class));
实现不同活动之间的切换,即从一个页面跳转到另一个上。
另一种方案也能实现页面的切换就是,通过控制页面上的控件如按钮的显示,隐藏来达到切换的目的,但是这种方式较为复杂。
加载游戏
通过ininNewGame方法来初始化新游戏,通过Update方法更新游戏设置。
游戏背景界面的改进
为贪吃蛇游戏设计了背景,使其更具有观赏新,使玩家赏心悦目。
添加音效
为游戏添加了音效,使游戏在听觉上给人以耳目一新的感觉;具体实现方法:
通过调用android.media.MediaPlayer类函数,声明对象:
MediaPlayermp=MediaPlayer.create(this.getContext(),R.raw.background);
通过mp.start();
mp.pause();
mp.stop();
来控制游戏不同状态时的音乐状态。
游戏本身的完善
为游戏设置关卡
根据玩家的得分为游戏设置了关卡,难度逐渐加强,蛇的移动速度逐渐加快。
每一关卡中的障碍物是固定不变的,为简单起见,只设置了五个关卡
通过Obstacle函数来设置关卡的障碍物,其中函数中以当前处于的关卡数作为判断依据。
publicvoidObstacle()
{
switch(stage){
case5:
case4:
case3:
case2:
}}
游戏中设置的有三种不同的苹果:
普通,加分,和毒苹果;
吃掉普通的苹果加一分;吃掉加分的苹果加两分;吃掉毒苹果减三分并加速
每一种苹果的实现方法都一样,使用ArrayList动态数组
每种苹果都采用随机的方法实现,实现方式基本与蛇找到苹果相同,只是在细节上略有区别
privatevoidPoisonapple();
privatevoidLoveapple();
设置退出快捷键
在游戏进行中,设置了退出快捷键,可以直接退出游戏,更加方便玩家操作。
具体实现还是依靠键盘响应函数:
游戏中是数字“1”键作为退出快捷键
publicbooleanonKeyDown(intkeyCode,KeyEventevent)
if(keyCode==KeyEvent.KEYCODE_1){
mUpdateFlag=false;
mp.stop();
Intentintent=newIntent(this.getContext(),MenuActivity.class);
this.getContext().startActivity(intent);
}
设置加速
根据实际操作需要,当操控蛇的移动时,若按下方向键不放,则蛇在该方向上的运行速度就会加快;若松开方向键则恢复原速度。
通