版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、辽 宁 科 技 大 学新技术专题报告 设计题目: 安卓手机游戏-贪吃蛇 学院、系: 电信学院、计算机科学与技术专业班级: 计算机09.1 学生姓名: 指导教师: 成 绩: 2012 年 7月1日目录第一章 绪论31.1开发背景31.1.1安卓系统简介31.1.2游戏简介31.2开发目的及意义41.3开发环境及工具4第二章需求分析52.1游戏界面分析52.2游戏角色分析52.3游戏控制分析52.4 可行性分析6第三章总体设计73.1系统功能模块层次图73.2运行机制83.3贪吃蛇功能流程图10第四章 详细设计与实现124.1 TiltView类124.2 SnakeView类144.3 界面设计
2、16第五章 测试205.1游戏功能测试205.2游戏控制测试205.3游戏界面测试205.4测试结果20第六章结论21第一章 绪论1.1开发背景1.1.1安卓系统简介安卓系统作为新兴的手机操作系统,在问世不久,变风靡全球,占领手机操作系统里很大的市场份额,与苹果,诺基亚三分天下,Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。 早期由原名为"Android"的公司开发,谷歌在2005年收购"Android.Inc"后,继续对Android系统开发运营,它采用了软件堆层(software st
3、ack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。1.1.2游戏简介1976年,Gremlin平台推出了一款经典街机游戏Blockade。游戏中,两名玩家分别控制一个角色在屏幕上移动,所经之处砌起围栏。角色只能向左、右方向90度转弯,游戏目标保证让对方先撞上屏幕或围栏。听起来有点复杂?其实就是下面这个样子: 基本上就是两条每走一步都会长大的贪吃蛇比谁后完蛋,玩家要做的就是避免撞上障碍物和越来越长的身体。更多照片、视频可以看 Games DBase 的介绍。 Blockade 很受欢迎,类似的游戏先后出现在
4、Atari 2600、TRS-80、苹果 2 等早期游戏机、计算机上。但真正让这种游戏形式红遍全球的还是21年后随诺基亚手机走向世界的贪吃蛇游戏Snake。贪吃蛇游戏是一款老牌的手机游戏,同时也是一款比较需要耐心地游戏。贪吃蛇游戏就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的食物,越吃越长。只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命。玩“贪吃蛇游戏”,难度最大的不是蛇长得很长的时候,而是开始的时候。那时蛇身很短,看上去难度不大,却最容易死掉,因为把玩一条小蛇让人容易走神,失去耐心。1.2开发目的及意义通过本次课程设计,了解android软件的开发过程,熟悉并掌握JAVA语言,
5、HTML. 程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇 目的 本程序实现主要技巧在
6、于java语言的应用。目的在于提高编程的水平。1.3开发环境及工具采用eclipse开发工具,在windowsxp下进行,基于安卓2.2操作系统。环境搭建:1. JDK安装2. Eclipse安装3. Android SDK安装4. ADT安装创建AVD第二章 需求分析2.1游戏界面分析首先应解决操作界面的问题,操作界面应该人性化设计,提示玩家当前游戏状态,何时开始,按什么按键开始游戏,开始游戏之后,在游戏界面中,以坐标的形式对整体界面进行划分,将界面划分为许多个小方格,还应设计蛇的样式,苹果的样式和墙的样式,在蛇吃到苹果后的样式,还有游戏结束或暂停时,界面的显示,游戏结束后,要显示所得的分数
7、。2.2游戏角色分析设置游戏贪吃蛇初始时由固定个小矩形块组成,并且,游戏中,要随机出现由单个矩形块构成的苹果,并且在设置苹果的时候,还要设置,不能使将要出现的苹果出现在蛇的身体之下,在蛇吃到苹果的时候,要将蛇的身体加长,随着游戏的进行,蛇移动的速度也要加快。此外,要判定游戏成功与失败的条件,当蛇的头和尾相撞或者蛇的头部撞到了墙上,则游戏失败,此时游戏结束,界面显示所得分数,当累积分数达到一定标准则游戏成功。另外蛇的移动原理,由外部按键设置监听控制蛇头的移动方向,在方向的指引下进行移动,蛇及苹果的位置都是由坐标数组确定的,苹果的位置也是随机产生的蛇的移动原理是后一矩形块覆盖前一个矩形块。当一个苹
8、果被吃掉的时候,要自动生成并显示下一个苹果的位置。这些都是在设计过程中需要实现的。2.3游戏控制分析游戏中需要通过按键对蛇的移动方位进行控制,共需要设置四个方位,分别是“东”“西”“南”“北”,在按键上用“上”“下”“左”“右”,按键与执行部分便涉及到监听,通过监听指示蛇的运动,此外,要设置蛇移动是的默认方向为“上”游戏开始时也是由“上”键启动,暂停后根据玩家的操作自动控制蛇的移动方向,设计过程中还应注意,蛇的移动只能是90度偏转,不能进行180度偏转。此外还要设置游戏的四种状态,准备,运行,暂停,结束,蛇体变长的时候要用累加器进行加分。游戏暂停时,要对当前游戏的参数和状态进行保存。2.4 可
9、行性分析 贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。 贪吃蛇的核心算法时如何实现移动和吃掉食物,没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色绘制这个节点,然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果。而在吃到食物的时候,则只需把食物入队即可。实现贪吃蛇的基本的蛇身移动、吃到食物身体增长、和碰到墙壁或自身死亡,能够暂停和开始。 本次设计我将主要运用java语言来完成。Java语言是一种跨平台,适合于分布式计算环境的面向对象编程语言,用Java写的应用程序不用修改就可
10、在不同的软硬件平台上运行。由于Java主要用于网络应用程序开发,因此对安全性有较高的要求。如果没有安全保证,用户从网络下载程序执行就非常危险。Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。第三章 总体设计3.1系统功能模块层次图工程中包括4个Activity,分别为Snake(主界面)、Game(游戏界面)、Help(游戏说明界面)、AuthorView(作者信息界面),通过不同Activity之间的转换实现不同界面之间的切换。Snake(Activity)继承了SnakeView类,SnakeView类继承了TileView类。TileView类继承了View
11、其实 Snake的工程蛮简单的,源文件就三个: Snake.java SnakeView.java TileView.java。 Snake类是这个游戏的入口点, TitleView类进行游戏的绘画, SnakeView类则是对游戏控制操作的处理。 Coordinate, RefreshHandler是 2个辅助类,也是 SnakeView类中的内部类。其中, Coordinate是一个点的坐标( x, y), RefreshHandler将 RefreshHandler对象绑定某个线程并给它发送消息。如下图:类图3.2运行机制任何游戏都需要有个引擎来推动游戏的运行,最简化的游戏引擎就是:在一
12、个线程中 While循环,检测用户操作,对用户的操作作出反应,更新游戏的界面,直到用户退出游戏。在 Snake这个游戏中,辅助类 RefreshHandler继承自 Handler,用来把 RefreshHandler与当前线程进行绑定,从而可以直接给线程发送消息并处理消息。注意一点: Handle对消息的处理都是异步。 RefreshHandler在 Handler的基础上增加 sleep()接口,用来每隔一个时间段后给当前线程发送一个消息。 handleMessage()方法在接受消息后,根据当前的游戏状态重绘界面,运行机制如下: 活动图运行机制这比较类似定时器的概念,在特定的时刻发送消息
13、,根据消息处理相应的事件。 update()与 sleep()间接的相互调用就构成了一个循环。这里要注意: mRedrawHandle绑定的是 Avtivity所在的线程,也就是程序的主线程;另外由于 sleep()是个异步函数,所以 update()与 sleep()之间的相互调用才没有构成死循环。最后分析下游戏数据的保存机制,如下: 活动图这里考虑了 Activity的生命周期:如果用户在游戏期间离开游戏界面,游戏暂停;或者由于内存比较紧张, Android关闭游戏释放内存,那么当用户返回游戏界面的时候恢复到上次离开时的界面。3.3贪吃蛇功能流程图 开始始初化蛇和苹果屏幕显示蛇和苹果位置蛇
14、开始移动,后坐标覆盖前坐标是否有按键否根据上次方向更新坐标是根据按键不同在原坐标基础上改变蛇的坐标位置更新方向是否吃到苹果是蛇身加1否是否越界或撞到蛇身是游戏结束否第四章 详细设计与实现4.1 TiltView类TiltView的基类是View,包含了贪吃蛇游戏画面的各个设定参数,主要负责绘制游戏画面。TileView类定义如下:public class TileView extends View private static final String tag = "yao"protected static int mTileSize = 20;/方格的边长protecte
15、d 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, A
16、ttributeSet attrs) super(context, attrs);Log.i(tag, "TileView Constructor");Log.i(tag, "mTileSize=" + mTileSize);/重置位图数组的长度public void resetTiles(int tilecount) mTileArray = new Bitmaptilecount;Override/适应各种分辨率的屏幕,当改变屏幕大小尺寸时,同时修改tile的相关计数指标protected void onSizeChanged(int w, int
17、h, int oldw, int oldh) 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=" + mXTileCou
18、nt);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 intmXTileCountmYTileCount;clearTiles();/这里做了一
19、个 Drawable 到 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);mTileArraykey = bitmap;/清空图形显示public void clearTiles(
20、) Log.i(tag, "TileView.clearTiles");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) mTileGridxy = tileindex;/ onDrawOverride/将直接操作的画布绘制到手机界面上public void onDraw(Canvas canvas) L
21、og.i(tag, "onDraw");super.onDraw(canvas);Bitmap bmp;float left;float top;for (int x = 0; x < mXTileCount; x+) for (int y = 0; y < mYTileCount; y+) if (mTileGridxy > 0) bmp = mTileArraymTileGridxy;left = x * mTileSize + mXOffset;top = y * mTileSize + mYOffset;canvas.drawBitmap(bmp,
22、 left, top, mPaint);4.2 SnakeView类SnakeView类定义了游戏运行时的画面改变及蛇体和果子的更新方法。首先用Handler机制实现定时刷新,代码如下:class RefreshHandler extends Handler /获取消息并处理Overridepublic void handleMessage(Message msg) SnakeView.this.update();SnakeView.this.invalidate();/刷新view为基类的界面Log.i(tag, "handleMessage|Thread Name="+
23、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()函数初
24、始化游戏,代码如下: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是不可或
25、缺的。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);loadTile(GREEN_STAR, r.getDrawable(R.drawable.greenstar);此外还定义了updateWalls()、update
26、Apples()、updateSnake()绘制墙、果子、蛇,以及更新画面函数、保存位置坐标函数等,具体代码请详见目录。4.3界面设计界面设计包括游戏主界面(Snake)、游戏说明界面、游戏界面的设计。界面的设计采用的是xml文档形式,在xml文档中规划好界面布局布局后,分别在java文件中声明。主界面设计:主界面包括一个 TextView及布局设定,其main.xml文档如下<?xml version="1.0" encoding="utf-8"?><!- Copyright (C) 2007 The Android Open Sou
27、rce Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at /licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software
28、 distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.-><FrameLayout xmlns:android="android:lay
29、out_width="match_parent"android:layout_height="match_parent"><com.example.android.snake.SnakeView android:id="+id/snake"android:layout_width="match_parent" android:layout_height="match_parent" tileSize="24" /><RelativeLayoutandr
30、oid:layout_width="match_parent"android:layout_height="match_parent" ><TextView android:id="+id/text"android:text="string/snake_layout_text_text"android:visibility="visible"android:layout_width="wrap_content"android:layout_height="
31、;wrap_content"android:layout_centerInParent="true"android:gravity="center_horizontal"android:textColor="#ff8888ff"android:textSize="24sp"/></RelativeLayout></FrameLayout>至此,全部界面设计完成,但还有最重要的一步,就是将所有的Activity注册到AndroidManifest.xml中。AndroidMan
32、ifest.xml文档如下:<?xml version="1.0" encoding="utf-8"?><!- Copyright (C) 2007 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of
33、the License at /licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the sp
34、ecific language governing permissions and limitations under the License.-><!- Declare the contents of this Android application. The namespace attribute brings in the Android platform namespace, and the package supplies a unique name for the application. When writing your own application, the p
35、ackage name must be changed from "com.example.*" to come from a domain that you own or have control over. -><manifest xmlns:android=" package="com.example.android.snake"> <application android:label="Snake on a Phone"> <activity android:name="
36、Snake" android:theme="android:style/Theme.NoTitleBar" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation"> <intent-filter> <action android:name="ent.action.MAIN" /> <category android:name=&q
37、uot;ent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>4.4项目演示 游戏前画面游戏中界面游戏结束时画面第五章 测试5.1游戏功能测试经过在模拟器上的测试,本软件能书案例实现其功能,达到了小蛇在屏幕上的移动,小蛇吃苹果,苹果随机出现的功能,当小蛇头尾相撞或与墙相撞时,游戏结束.这些均在测试中得到验证。5.2游戏控制测试在测试过程中,也着重对游戏的控制功能进行了测试,游戏是通过方向键的控制来实现的,在游戏刚开始的阶段,上下左右四个方位的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年天津海运职业学院单招职业适应性考试题库带答案详解(b卷)
- 2026年宁波财经学院单招职业适应性测试题库附参考答案详解(完整版)
- 2026年天府新区信息职业学院单招职业适应性考试题库带答案详解(培优b卷)
- 2026年大理护理职业学院单招职业倾向性测试题库附参考答案详解(a卷)
- 2026年安庆医药高等专科学校单招综合素质考试题库带答案详解(综合卷)
- 2026年宁波工程学院单招职业倾向性考试题库附参考答案详解(完整版)
- 游戏设计与游戏策划的实战技巧手册
- 太阳能发电技术承诺函8篇
- 班级纪律的议论文14篇
- 急诊护理中的患者安全管理
- 《油气储运安全技术》课件第六章 油气集输站场安全技术与管理
- 储存物品火灾危险性分类
- 监控员岗位安全生产责任制范本
- 痛经的中医疗法课件
- 2024届高考英语一轮复习2023全国乙卷词汇短语积累 长难句分析 课件
- 手术室利用PDCA循环降低手术室病理标本管理缺陷发生率品管圈QCC成果汇报
- 人音版音乐四年级上册中华人民共和国国歌 4课件
- 第四章-古印度与古代美洲的城市教材课件
- 第三章-形式美-(《美学原理》课件)
- 用药护理PPT(高职护理专业)完整全套教学课件
- 新生儿锁骨骨折的原因分析及对策
评论
0/150
提交评论