安卓贪吃蛇课程设计报告

滨江学院

智能手机程序设计

题 目 安卓智能手机贪吃蛇游戏设计

院 系 专 业 信息工程

学生姓名 周盈伟

学 号

指导教师 高超

二0 一四 年 六 月 一日

目录

第一章 绪论................................................................................................................ 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

第六章 结论 ............................................................................................................ 21

第一章 绪论

1.1开发背景

1.1.1安卓系统简介

安卓系统作为新兴的手机操作系统,在问世不久,变风靡全球,占领手机操作系统里很大的市场份额,与苹果,诺基亚三分天下,Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。 早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。

1.1.2游戏简介

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

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

Blockade 很受欢迎,类似的游戏先后出现在 Atari 2600、TRS-80、苹果 2 等早期游戏机、计算机上。但真正让这种游戏形式红遍全球的还是21年后随诺基亚手机走向世界的贪吃蛇游戏——Snake。

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

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

1.2开发目的及意义

通过本次课程设计,了解android软件的开发过程,熟悉并掌握JAVA语言,HTML. 程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇 目的 本程序实现主要技巧在于java语言的应用。目的在于提高编程的水平。

1.3开发环境及工具

采用eclipse开发工具,在windows xp下进行,基于安卓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.java SnakeView.java TileView.java。 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贪吃蛇功能流程图

第四章 详细设计与实现

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) 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 = new int[mXTileCount][mYTileCount]; clearTiles(); //这里做了一个 到 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;

//清空图形显示

public void clearTiles() { } Log.i(tag, "TileView.clearTiles"); for (int x = 0; x

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

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

} // onDraw @Override

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

} public void onDraw(Canvas canvas) { } Log.i(tag, "onDraw"); super.onDraw(canvas); Bitmap bmp; float left; float top; for (int x = 0; x 0) { } bmp = mTileArray[mTileGrid[x][y]]; left = x * mTileSize + mXOffset; top = y * mTileSize + mYOffset; canvas.drawBitmap(bmp, left, top, mPaint);

4.2 SnakeView类

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

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

class RefreshHandler extends Handler {

//获取消息并处理

public void handleMessage(Message msg) { } SnakeView.this.update(); SnakeView.this.invalidate();//刷新view为基类的界面 Log.i(tag, "handleMessage|Thread Name="+Thread.currentThread().getName());

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

}; public void sleep(long delayMillis) { } this.removeMessages(0); //清空消息队列,Handler进入对新消息的等待 Log.i(tag, "sleep|Thread Name="+Thread.currentThread().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 = this.getContext().getResources(); resetTiles(4); loadTile(RED_STAR, r.getDrawable(R.drawable.redstar)); loadTile(YELLOW_STAR, r.getDrawable(R.drawable.yellowstar));

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

4.3界面设计

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

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

android:layout_width="match_parent" android:layout_height="match_parent">

android:layout_height="match_parent"

tileSize="24"

/>

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

supplies a unique name for the application. When writing your

own application, the package name must be changed from "com.example.*" to come from a domain that you own or have control over. -->

android:theme="@android:style/Theme.NoTitleBar"

android:screenOrientation="portrait"

android:configChanges="keyboardHidden|orientation">

4.4项目演示

游戏前画面

游戏中界面

游戏结束时画面

第五章 测试

5.1游戏功能测试

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

5.2游戏控制测试

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

5.3游戏界面测试

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

5.4测试结果

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

第六章 结论

回顾这个设计过程,我学到了许多书本上没有学到的知识。通过这次自己制作的软件,丰富了自己的实践技能,扩展了本专业的知识面,使我受益非浅,同时 也体验到了搞软件开发的困难度。 在这次设计的同时,我又从中学到了许多东西。 但由于我对这样的软件开发还只是一个开始,了解的不多,这其中或许还有很多 的不足,有些模块做得不是很好,界面的设计及整体的布局还比较简单,没有突 出特色出来,这也可能是我这个系统的不足之处,在这里也恳请老师能够对 我的作品指明不足并加以改正。

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

但同时我也遇到了问题,比如在编写控制模块代码的时候,如何何时按键监听这一块让我很头疼,另外在设计界面整体布局的时候,如何编写XML文件,这也是很大的问题后来通过查阅资料,对这些问题都做到了很好的解决 总之,在这一次的课程设计过程中,我查阅了大量的资料,对 Java 有了一 点初步的认识,对于软件工程这些辅助性的教材也巩固了不少,为我这次的课设 提供了很大的帮助,锻炼了我的能力让我掌握了一门新的程序设计语言:java 语言,系统地学习了数据库方面的知识,并更进一步提高了我在程序设计、调试 方面的技巧。更重要的是,它还让我认识到了自己的不足,在编程方面,我仅仅 是刚刚入门而已,以后的道路任重道远,需要我不断的丰富自己、充实自己,这 样才能在程序设计方面有所收获。

滨江学院

智能手机程序设计

题 目 安卓智能手机贪吃蛇游戏设计

院 系 专 业 信息工程

学生姓名 周盈伟

学 号

指导教师 高超

二0 一四 年 六 月 一日

目录

第一章 绪论................................................................................................................ 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

第六章 结论 ............................................................................................................ 21

第一章 绪论

1.1开发背景

1.1.1安卓系统简介

安卓系统作为新兴的手机操作系统,在问世不久,变风靡全球,占领手机操作系统里很大的市场份额,与苹果,诺基亚三分天下,Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。 早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。

1.1.2游戏简介

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

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

Blockade 很受欢迎,类似的游戏先后出现在 Atari 2600、TRS-80、苹果 2 等早期游戏机、计算机上。但真正让这种游戏形式红遍全球的还是21年后随诺基亚手机走向世界的贪吃蛇游戏——Snake。

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

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

1.2开发目的及意义

通过本次课程设计,了解android软件的开发过程,熟悉并掌握JAVA语言,HTML. 程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇 目的 本程序实现主要技巧在于java语言的应用。目的在于提高编程的水平。

1.3开发环境及工具

采用eclipse开发工具,在windows xp下进行,基于安卓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.java SnakeView.java TileView.java。 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贪吃蛇功能流程图

第四章 详细设计与实现

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) 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 = new int[mXTileCount][mYTileCount]; clearTiles(); //这里做了一个 到 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;

//清空图形显示

public void clearTiles() { } Log.i(tag, "TileView.clearTiles"); for (int x = 0; x

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

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

} // onDraw @Override

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

} public void onDraw(Canvas canvas) { } Log.i(tag, "onDraw"); super.onDraw(canvas); Bitmap bmp; float left; float top; for (int x = 0; x 0) { } bmp = mTileArray[mTileGrid[x][y]]; left = x * mTileSize + mXOffset; top = y * mTileSize + mYOffset; canvas.drawBitmap(bmp, left, top, mPaint);

4.2 SnakeView类

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

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

class RefreshHandler extends Handler {

//获取消息并处理

public void handleMessage(Message msg) { } SnakeView.this.update(); SnakeView.this.invalidate();//刷新view为基类的界面 Log.i(tag, "handleMessage|Thread Name="+Thread.currentThread().getName());

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

}; public void sleep(long delayMillis) { } this.removeMessages(0); //清空消息队列,Handler进入对新消息的等待 Log.i(tag, "sleep|Thread Name="+Thread.currentThread().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 = this.getContext().getResources(); resetTiles(4); loadTile(RED_STAR, r.getDrawable(R.drawable.redstar)); loadTile(YELLOW_STAR, r.getDrawable(R.drawable.yellowstar));

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

4.3界面设计

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

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

android:layout_width="match_parent" android:layout_height="match_parent">

android:layout_height="match_parent"

tileSize="24"

/>

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

supplies a unique name for the application. When writing your

own application, the package name must be changed from "com.example.*" to come from a domain that you own or have control over. -->

android:theme="@android:style/Theme.NoTitleBar"

android:screenOrientation="portrait"

android:configChanges="keyboardHidden|orientation">

4.4项目演示

游戏前画面

游戏中界面

游戏结束时画面

第五章 测试

5.1游戏功能测试

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

5.2游戏控制测试

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

5.3游戏界面测试

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

5.4测试结果

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

第六章 结论

回顾这个设计过程,我学到了许多书本上没有学到的知识。通过这次自己制作的软件,丰富了自己的实践技能,扩展了本专业的知识面,使我受益非浅,同时 也体验到了搞软件开发的困难度。 在这次设计的同时,我又从中学到了许多东西。 但由于我对这样的软件开发还只是一个开始,了解的不多,这其中或许还有很多 的不足,有些模块做得不是很好,界面的设计及整体的布局还比较简单,没有突 出特色出来,这也可能是我这个系统的不足之处,在这里也恳请老师能够对 我的作品指明不足并加以改正。

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

但同时我也遇到了问题,比如在编写控制模块代码的时候,如何何时按键监听这一块让我很头疼,另外在设计界面整体布局的时候,如何编写XML文件,这也是很大的问题后来通过查阅资料,对这些问题都做到了很好的解决 总之,在这一次的课程设计过程中,我查阅了大量的资料,对 Java 有了一 点初步的认识,对于软件工程这些辅助性的教材也巩固了不少,为我这次的课设 提供了很大的帮助,锻炼了我的能力让我掌握了一门新的程序设计语言:java 语言,系统地学习了数据库方面的知识,并更进一步提高了我在程序设计、调试 方面的技巧。更重要的是,它还让我认识到了自己的不足,在编程方面,我仅仅 是刚刚入门而已,以后的道路任重道远,需要我不断的丰富自己、充实自己,这 样才能在程序设计方面有所收获。


相关内容

  • 贪吃蛇实验报告论文
  • 程序设计实践 题 目 贪吃蛇 学生姓名 教学院系 专业年级 学 号 计算机科学学院 软件工程2015级 完成日期 2016 年 6 月 摘 要 智能设备诞生以来,各种APP 游戏层出不穷伴随着科学技术的发展,人们都渴望在不工作的时候有一些娱乐活动,而贪吃蛇这一款游戏正好符合大众的心理.所以,为了迎合 ...

  • 数据结构课程实习大纲-2015
  • <数据结构与算法>课程设计大纲 (一)课程设计教学目的及基本要求 1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力: 2.初步掌握软件开发过程的问题分析.系统设计.程序编码.测试等基本方法和技能: 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力: 4.训 ...

  • 安卓实习报告
  • 太原科技大学 TAIYUANUniversityofScienceandTechnology 毕业实习报告 学生姓名:郭锦涛 学号:[1**********]6 指导教师:刘静 所属系部:计算机科学与技术 专业班级:计算机112001班 实习单位:西安软件服务外包学员 2014年9月19日 目录 一 ...

  • 安卓开发课程设计报告
  • 武汉理工大学华夏学院 课 程 报 告 课程名称:智能手机软件开发 题 目: 基于Android 的手机通讯录的设计与实现 专 业 信息工程系 班 级 学 号 姓 名 成 绩 指导教师 2015年3月23日至2015年6月12日 智能手机软件开发大作业 根据所学的Android 手机开发的知识,采用E ...

  • 开题报告模板1
  • 一.开题报告 二.文献综述 基于Android手机平台旅游记忆系统的研究 1.课题的背景 国际旅游界人士认为,旅游业甚至已经超过了石油和汽车行业,成为了世界的第一大产业.随着人们生活水平的提高以及对于生活质量要求的提高,旅游已然成为越来越多人假期休闲时的首选.同时,旅游业是信息密集型和信息依托型产业 ...

  • 北大青鸟有哪些专业
  • 北大青鸟有哪些专业课程 北大青鸟都有哪些专业课程?很多选择到北大青鸟学校学习IT 技术的同学很关心北大青鸟的专业情况.北大青鸟分校区很多,有很多校区都只有1个或者2个专业,作为北大青鸟体系的旗舰校区,北大青鸟旗舰总校所开设的专业就非常的全面,包含了网络营销.学士后java .软件开发专业.网络工程专 ...

  • 以后学习产品设计就业前景的工资如何
  • 以后学习产品设计就业前景的工资如何 以后学习产品设计就业前景的工资如何?从相关数据了解到近年来全国人均薪水3900左右,看看我们自己是否达到标准,我们身边又有多少人拿着一两千的工资度日如年. 兰州北大青鸟,十余年专注计算机教育,是你可以仔细考虑的学校! Android 是主流智能手机的操作系统,Ja ...

  • 国际市场营销课程论文
  • 国际市场营销课程论文 摘 要 一个公司的成功与否,很大程度上取决于其产品和市场策略的好坏.现代企业希望设计出能在目标市场成功实现其目标的市场营销组合,并将它付诸实施.这包括四种营销管理职能:分析.企划.实施及控制.企业通过SWOT分析即分析市场和市场营销环境,找到有吸引力的机会和避开环境中的威胁因素 ...

  • 创新项目结题报告
  • 大学生创新创业训练项目 结题报告 项目名称: 远程无线信息发布系统 项目级别:[ ]国家级 [ ]省级 [√]院级 项目负责人: xxx 所在系部: 计算机工程系 专业班级: 计算机科学与技术xxx 联系电话: xxx E - mail:项目组成员: xxx 指导教师: xxx 职称 讲师 填表日期 ...