admin 管理员组

文章数量: 887021


2023年12月18日发(作者:connection holder is null)

Android课程设计

专 业 计算机科学与技术

姓 名 李文成

学 号 2010

指导老师 李津

目录

第一章 绪论................................................................................................................ 3

1.1开发背景.......................................................................................................... 3

1.1.1安卓系统简介....................................................................................... 3

1.1.2游戏简介............................................................................................... 3

1.2开发目的及意义.............................................................................................. 4

1.3开发环境及工具.............................................................................................. 4

第二章 需求分析 ...................................................................................................... 5

2.1游戏界面分析.................................................................................................. 5

2.2游戏角色分析.................................................................................................. 5

2.3游戏控制分析.................................................................................................. 5

2.4 可行性分析..................................................................................................... 6

第三章 总体设计 ...................................................................................................... 7

3.1系统功能模块层次图...................................................................................... 7

3.2运行机制.......................................................................................................... 8

3.3贪吃蛇功能流程图........................................................................................ 10

第四章 详细设计与实现.......................................................................................... 12

4.1 TiltView类 ................................................................................................. 12

4.2 SnakeView类 ............................................................................................. 14

4.3 界面设计..................................................................................................... 16

第五章 测试................................................................................................................ 20

5.1游戏功能测试................................................................................................ 20

5.2游戏控制测试................................................................................................ 20

5.3游戏界面测试................................................................................................ 20

5.4测试结果........................................................................................................ 20

第六章 结论 1

第一章 绪论

1.1开发背景

1.1.1安卓系统简介

安卓系统作为新兴的手机操作系统,在问世不久,变风靡全球,占领手机操作系统里很大的市场份额,与苹果,诺基亚三分天下,Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。

早期由原名为"Android"的公司开发,谷歌在2005年收购""后,继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。

1.1.2游戏简介

1976年,Gremlin平台推出了一款经典街机游戏Blockade。游戏中,两名玩家分别控制一个角色在屏幕上移动,所经之处砌起围栏。角色只能向左、右方向90度转弯,游戏目标保证让对方先撞上屏幕或围栏。 听起来有点复杂?其实就是下面这个样子:

基本上就是两条每走一步都会长大的贪吃蛇比谁后完蛋,玩家要做的就是避免撞上障碍物和越来越长的身体。更多照片、视频可以看 Games DBase 的介绍。

Blockade 很受欢迎,类似的游戏先后出现在 Atari 2600、TRS-80、苹果 2

等早期游戏机、计算机上。但真正让这种游戏形式红遍全球的还是21年后随诺基亚手机走向世界的贪吃蛇游戏——Snake。

贪吃蛇游戏是一款老牌的手机游戏,同时也是一款比较需要耐心地游戏。贪吃蛇游戏就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的食物,越吃越长。只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命。玩

“贪吃蛇游戏”,难度最大的不是蛇长得很长的时候,而是开始的时候。那时蛇身很短,看上去难度不大,却最容易死掉,因为把玩一条小蛇让人容易走神,失去耐心。

1.2开发目的及意义

通过本次课程设计,了解android软件的开发过程,熟悉并掌握JAVA语言,HTML.

程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇

目的 本程序实现主要技巧在于java语言的应用。目的在于提高编程的水平。

1.3开发环境及工具

采用eclipse开发工具,在windowsxp下进行,基于安卓2.2操作系统。

环境搭建:

1. JDK安装

2. Eclipse安装

3. Android SDK安装

4. ADT安装创建AVD

第二章 需求分析

2.1游戏界面分析

首先应解决操作界面的问题,操作界面应该人性化设计,提示玩家当前游戏状态,何时开始,按什么按键开始游戏,开始游戏之后,在游戏界面中,以坐标的形式对整体界面进行划分,将界面划分为许多个小方格,还应设计蛇的样式,苹果的样式和墙的样式,在蛇吃到苹果后的样式,还有游戏结束或暂停时,界面的显示,游戏结束后,要显示所得的分数。

2.2游戏角色分析

设置游戏贪吃蛇初始时由固定个小矩形块组成,并且,游戏中,要随机出现由单个矩形块构成的苹果,并且在设置苹果的时候,还要设置,不能使将要出现的苹果出现在蛇的身体之下,在蛇吃到苹果的时候,要将蛇的身体加长,随着游戏的进行,蛇移动的速度也要加快。此外,要判定游戏成功与失败的条件,当蛇的头和尾相撞或者蛇的头部撞到了墙上,则游戏失败,此时游戏结束,界面显示所得分数,当累积分数达到一定标准则游戏成功。另外蛇的移动原理,由外部按键设置监听控制蛇头的移动方向,在方向的指引下进行移动,蛇及苹果的位置都是由坐标数组确定的,苹果的位置也是随机产生的蛇的移动原理是后一矩形块覆盖前一个矩形块。当一个苹果被吃掉的时候,要自动生成并显示下一个苹果的位置。这些都是在设计过程中需要实现的。

2.3游戏控制分析

游戏中需要通过按键对蛇的移动方位进行控制,共需要设置四个方位,分别是“东”“西”“南”“北”,在按键上用“上”“下”“左”“右”,按键与执行部分便涉及到监听,通过监听指示蛇的运动,此外,要设置蛇移动是的默认方向为

“上”

游戏开始时也是由“上”键启动,暂停后根据玩家的操作自动控制蛇的移动方向,设计过程中还应注意,蛇的移动只能是90度偏转,不能进行180度偏转。此外还要设置游戏的四种状态,准备,运行,暂停,结束,蛇体变长的时候要用累加器进行加分。游戏暂停时,要对当前游戏的参数和状态进行保存。

2.4 可行性分析

贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。

贪吃蛇的核心算法时如何实现移动和吃掉食物,没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。而在吃到食物的时候,则只需把食物入队即可。实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始。

本次设计我将主要运用java语言来完成。Java语言是一种跨平台,适合于分布式计算环境的面向对象编程语言,用Java写的应用程序不用修改就可在不同的软硬件平台上运行。

由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。如果没有安全保证,用户从网络下载程序执行就非常危险。Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。

第三章 总体设计

3.1系统功能模块层次图

工程中包括4个Activity,分别为Snake(主界面)、Game(游戏界面)、Help(游戏说明界面)、AuthorView(作者信息界面),通过不同Activity之间的转换实现不同界面之间的切换。Snake(Activity)继承了SnakeView类,SnakeView类继承了TileView类。TileView类继承了View其实 Snake的工程蛮简单的,源文件就三个: 。 Snake类是这个游戏的入口点, TitleView类进行游戏的绘画, SnakeView类则是对游戏控制操作的处理。 Coordinate, RefreshHandler是 2个辅助类,也是 SnakeView类中的内部类。其中, Coordinate是一个点的坐标( x, y), RefreshHandler将 RefreshHandler对象绑定某个线程并给它发送消息。如下图:

类图

3.2运行机制

任何游戏都需要有个引擎来推动游戏的运行,最简化的游戏引擎就是:在一个线程中 While循环,检测用户操作,对用户的操作作出反应,更新游戏的界面,直到用户退出游戏。

在 Snake这个游戏中,辅助类 RefreshHandler继承自 Handler,用来把

RefreshHandler与当前线程进行绑定,从而可以直接给线程发送消息并处理消息。注意一点: Handle对消息的处理都是异步。 RefreshHandler在 Handler的基础上增加 sleep()接口,用来每隔一个时间段后给当前线程发送一个消息。

handleMessage()方法在接受消息后,根据当前的游戏状态重绘界面,运行机制

下:

活动图

运行机制

这比较类似定时器的概念,在特定的时刻发送消息,根据消息处理相应的事件。

update()与 sleep()间接的相互调用就构成了一个循环。这里要注意:

mRedrawHandle绑定的是 Avtivity所在的线程,也就是程序的主线程;另外由于 sleep()是个异步函数,所以 update()与 sleep()之间的相互调用才没有构成死循环。

最后分析下游戏数据的保存机制,如下:

活动图

这里考虑了 Activity的生命周期:如果用户在游戏期间离开游戏界面,游戏暂停;或者由于内存比较紧张, Android关闭游戏释放内存,那么当用户返回游戏界面的时候恢复到上次离开时的界面。

3.3贪吃蛇功能流程图

开始

始初化蛇和苹果

屏幕显示蛇和苹果位置

蛇开始移动,后坐标覆盖前坐标

是否有按键

根据上次方向更新坐标

根据按键不同在原坐标基础上改变蛇的坐标位置

更新方向

是否越界或撞到蛇身

是否吃到苹果

蛇身加1

游戏结束

第四章 详细设计与实现

4.1 TiltView类

TiltView的基类是View,包含了贪吃蛇游戏画面的各个设定参数,主要负责绘制游戏画面。TileView类定义如下:

public class TileView extends View {

private static final String

tag = "yao";

protected static int

mTileSize = 20;//方格的边长

protected static int

mXTileCount;//X轴上方格的个数

protected static into

mYTileCount;//Y轴上方格的个数

private static int

mXOffset;//绘图时X轴上的起始坐标

private static int

mYOffset;//绘图时Y轴上的起始坐标

private Bitmap[] mTileArray;//位图数组

private int[][] mTileGrid;//映射整个游戏画面的数组

private final Paint mPaint = new Paint();//画笔

public TileView(Context context, AttributeSet attrs) {

}

//重置位图数组的长度

public void resetTiles(int tilecount) {

}

@Override

//适应各种分辨率的屏幕,当改变屏幕大小尺寸时,同时修改tile的相关计数指标

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

Log.i(tag, "onSizeChanged," + "w=" + w + " h=" + h + " oldw=" + oldw + " oldh=" + oldh);mTileArray = new Bitmap[tilecount];

super(context, attrs);

Log.i(tag, "TileView Constructor");

Log.i(tag, "mTileSize=" +

mTileSize);

}

mXTileCount = (int) (w /

mTileSize);

mYTileCount = (int) (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 = new int[mXTileCount][mYTileCount];

clearTiles();

//这里做了一个 Drawable 到 bitmap 的转换

public void loadTile(int key, Drawable tile) {

}

Bitmap bitmap = Bitmap(mTileSize,

mTileSize, _8888);

Canvas canvas = new Canvas(bitmap);

nds(0, 0,

mTileSize,

mTileSize);

(canvas);

mTileArray[key] = bitmap;

//清空图形显示

public void clearTiles() {

}Log.i(tag, "iles");

for (int x = 0; x <

mXTileCount; x++) {

}

for (int y = 0; y <

mYTileCount; y++) {

}

setTile(0, x, y);

//在相应的坐标位置绘制相应的砖块

public void setTile(int tileindex, int x, int y) {

}

// onDraw

@Override

mTileGrid[x][y] = tileindex;

//将直接操作的画布绘制到手机界面上

}

public void onDraw(Canvas canvas) {

}

Log.i(tag, "onDraw");

(canvas);

Bitmap bmp;

float left;

float top;

for (int x = 0; x <

mXTileCount; x++) {

}

for (int y = 0; y <

mYTileCount; y++) {

}

if (mTileGrid[x][y] > 0) {

}

bmp = mTileArray[mTileGrid[x][y]];

left = x *

mTileSize +

mXOffset;

top = y *

mTileSize +

mYOffset;

tmap(bmp, left, top, mPaint);

4.2 SnakeView类

SnakeView类定义了游戏运行时的画面改变及蛇体和果子的更新方法。

首先用Handler机制实现定时刷新,代码如下:

class RefreshHandler extends Handler {

//获取消息并处理

@Override

public void handleMessage(Message msg) {

}

();

date();//刷新view为基类的界面

Log.i(tag, "handleMessage|Thread Name="+tThread().getName());

//定时发送消息给UI线程,以此达到更新效果

};

public void sleep(long delayMillis) {

}

Messages(0); //清空消息队列,Handler进入对新消息的等待

Log.i(tag, "sleep|Thread Name="+tThread().getName());

//定时发送新消息,激活handler

sendMessageDelayed(obtainMessage(0), delayMillis);

定义SnakeView()函数初始化游戏,代码如下:

public SnakeView(Context context, AttributeSet attrs) {

}

super(context, attrs);

Log.i(tag, "SnakeView Constructor");

initSnakeView();//构造函数中,初始化游戏

定义initSnakeView()初始化SnakeView类,代码如下:

private void initSnakeView() {

Log.e(tag, "initSnakeView");

//设置焦点,由于存在 文字界面 和 游戏界面的跳转。这个focus是不可或缺的。

setFocusable(true);

//取得资源中的图片,加载到 砖块字典 中。

Resources r = text().getResources();

resetTiles(4);

}

loadTile(RED_STAR, wable(r));

loadTile(YELLOW_STAR, wable(star));

loadTile(GREEN_STAR, wable(tar));

此外还定义了updateWalls()、updateApples()、updateSnake()绘制墙、果子、蛇,以及更新画面函数、保存位置坐标函数等,具体代码请详见目录。

4.3界面设计

界面设计包括游戏主界面(Snake)、游戏说明界面、游戏界面的设计。界面的设计采用的是xml文档形式,在xml文档中规划好界面布局布局后,分别在java文件中声明。

主界面设计:主界面包括一个 TextView及布局设定,其文档如下

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/snake"

android:layout_width="match_parent"

android:layout_height="match_parent"

tileSize="24"

/>

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/text"

android:text="@string/snake_layout_text_text"

android:visibility="visible"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:gravity="center_horizontal"

android:textColor="#ff8888ff"

android:textSize="24sp"/>

至此,全部界面设计完成,但还有最重要的一步,就是将所有的Activity注册到中。文档如下:

package="">

android:theme="@android:style/eBar"

android:screenOrientation="portrait"

android:configChanges="keyboardHidden|orientation">

4.4项目演示

游戏前画面

游戏中界面

游戏结束时画面

第五章 测试

5.1游戏功能测试

经过在模拟器上的测试,本软件能书案例实现其功能,达到了小蛇在屏幕上的移动,小蛇吃苹果,苹果随机出现的功能,当小蛇头尾相撞或与墙相撞时,游戏结束.这些均在测试中得到验证。

5.2游戏控制测试

在测试过程中,也着重对游戏的控制功能进行了测试,游戏是通过方向键的控制来实现的,在游戏刚开始的阶段,上下左右四个方位的控制都很成功,但随着蛇移动的速度越来越快,按键的控制反应会出现滞后,通过分析,可能是由于蛇的运动速度超过了键盘的反应速度造成的,与软件无关,所以得出结论,游戏的控制设计也是成功的。

5.3游戏界面测试

游戏运行之后,就是在画面中出现蛇和两个苹果的初始位置,并且是静止的,并且在画面上还会出现操作提示“按上键开始游戏”,游戏运行过程中,除了蛇的运动之外,界面大题没有变化,分别由绿色矩形块的围墙,黄色矩形块的苹果和红色矩形块的蛇身(蛇头为黄色)组成。游戏结束后,界面处于暂停状态,提示游戏结束并显示分数。

5.4测试结果

通过对游戏软件的功能测试,控制测试和界面测试。详细说是对游戏的开始新游戏、 退出、 查看最高成绩、 计时、 统计分数等功能进行测试, 并测试程序的鼠标点击事件、菜单的响应及按键响应等事件,结论是该游戏软件能正确实现

功能要求。要求输出的效果与预期的输出效果完全 一致。

第六章 结论

回顾这个设计过程,我学到了许多书本上没有学到的知识。通过这次自己制作的软件,丰富了自己的实践技能,扩展了本专业的知识面,使我受益非浅,同时

也体验到了搞软件开发的困难度。 在这次设计的同时,我又从中学到了许多东西。 但由于我对这样的软件开发还只是一个开始,了解的不多,这其中或许还有很多 的不足,有些模块做得不是很好,界面的设计及整体的布局还比较简单,没有突 出特色出来,这也可能是我这个系统的不足之处,在这里也恳请老师能够对 我的作品指明不足并加以改正。

我所做的设计功能并不算强大,但是这些结合了本学期所学习的内容,主要是界面的设计,并改写了两个类。通过自己写代码,我更进一步清楚了android工程的框架及设计的步骤,以及每个文件的作用,稍微掌握了一些View类的方法,同时也学到了更多的界面设计的方法,比如如何实现一个TextView里显示多行数据,如何自定义视图等。

但同时我也遇到了问题,比如在编写控制模块代码的时候,如何何时按键监听这一块让我很头疼,另外在设计界面整体布局的时候,如何编写XML文件,这也是很大的问题后来通过查阅资料,对这些问题都做到了很好的解决

总之,在这一次的课程设计过程中,我查阅了大量的资料,对 Java 有了一

点初步的认识,对于软件工程这些辅助性的教材也巩固了不少,为我这次的课设

提供了很大的帮助,锻炼了我的能力让我掌握了一门新的程序设计语言:java 语言,系统地学习了数据库方面的知识,并更进一步提高了我在程序设计、调试 方面的技巧。更重要的是,它还让我认识到了自己的不足,在编程方面,我仅仅 是刚刚入门而已,以后的道路任重道远,需要我不断的丰富自己、充实自己,这 样才能在程序设计方面有所收获。

参考文献

[1] 李伟、王国辉 androd开发宝典 机械工业出版社

. .


本文标签: 游戏 界面 移动 控制 设计