




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档东北石油大学应用训练任务书课程 _题目 专业 姓名 学号 主要内容、基本要求、主要参考资料等主要内容:本无线开发应用训练利用ADT eclipse开发Android软件,主要完成贪吃蛇游戏的软件开发。其中有三大模块,分别是项目框架、游戏类图设计、界面设计。侧重于Java类的编写和视图layout的的xml编写。基本要求:(一)掌握Eclipse集成开发环境中Android开发的完整开发流程;(二)掌握课题的工作原理,完成系统分析及相应的程序设计工作,包括:(1)贪吃蛇游戏主界面程序设计;(2)贪吃蛇游戏类图的设计;(3)贪吃蛇Android项目框架的搭建。(三)撰写无线开发应用训练报告。主要参考资料:1 陈炜,张晓蕾,侯燕萍等.Java软件开发技术M北京:人民邮电出版社,2005. 2 林城. Android 2.3 应用开发实战J.机械工业出版社,2011:17-321.完成期限 2016年2月29日2016年3月11日 指导教师 2016年2 月 29日 目录一、开发背景和需求分析1二、开发环境与准备工作2三、系统功能与原型设计3四、详细设计与编程实现44.1 项目框架44.2 游戏类图设计54.3 界面设计6五、系统调试和运行11总结11参考文献12附录(源程序代码)124欢迎下载4欢迎下载。精品文档一、开发背景和需求分析Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。 早期由原名为Android的公司开发,谷歌在2005年收购Android.Inc后,继续对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构1,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。针对当今游戏开发的流行趋势,手机游戏的设计已成为主流,随着计算机技术及硬件技术的不断发展,用户的需求量也越来越多,并且用户追求的效果也越来越好,在此形势下好的设计方法尤为重要,基于android系统的手机游戏设计方法简单且效率较高2。贪吃蛇游戏也是很多人热衷的游戏,用户不仅要求其界面设计精美,更希望操作简单,程序执行速度快。Android支持使用Java作为编程语言来开发应用程序,而Android的Java开发方面从接口到功能,都有层出不穷的变化。考虑到Java虚拟机的效率和资源占用,谷歌重新设计了Android的Java,以便能提高效率和减少资源占用,因而与J2ME等不同3。 操作系统与应用程序的沟通桥梁,应用分为两层:函数层(Library)和虚拟机(Virtual Machine)。Android的中间层多以Java 实现,并且采用特殊的Dalvik 虚拟机(Dalvik Virtual Machine)。Dalvik虚拟机是一种“暂存器型态”(Register Based)的Java虚拟机,变量皆存放于暂存器中,虚拟机的指令相对减少。贪吃蛇游戏是一款老牌的手机游戏,同时也是一款比较需要耐心地游戏。贪吃蛇游戏就是一条小蛇,不停地在屏幕上游走,吃各个方向出现的食物,越吃越长。只要蛇头碰到屏幕四周,或者碰到自己的身子,小蛇就立即毙命。玩“贪吃蛇游戏”,难度最大的不是蛇长得很长的时候,而是开始的时候。那时蛇身很短,看上去难度不大,却最容易死掉,因为把玩一条小蛇让人容易走神,失去耐心。二、开发环境与准备工作JDK由一个标准类库和一组建立,测试及建立文档的Java实用程序组成。其核心Java WTK是Sun公司提供的无线开发工具包, 分四种模拟器Defaultcolorphone 用于具有彩色显示屏幕的手机模拟器Defaultgrayphone 用于具有单色灰度屏幕的手机模拟器Mediacontrolskin 用于具有音频和视频控制功能的手机模拟器Qwertydevice 用于具有标准打字键盘的手机模拟器 Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成Eclipse Platform、JDT、CDT和PDE。ADT是一个用来开发Android应用程序的Eclipse插件4,本次开发也将应用的Eclipse ADT插件来完成贪吃蛇游戏的编程。Android应用越来越广泛,开发Android游戏也渐渐成为市场的必须,本游戏的开发是基于Android4.0系统,采用eclipse编程实现5。具体实现过程分为以下3步:项目框架、游戏类图设计、界面设计。1、新建一个eclipse工程。图1 新建eclipse工程2、导入文件导入相关的程序包3、编写程序图2 工程中的相关文件4、运行与调试,运行结果如下图。图3 程序调试三、系统功能与原型设计1、功能概述:功能简述功能描述主界面包含“开始游戏”,“作者信息”,“游戏说明”,“退出”“贪吃蛇”游戏首先是用户的贪吃蛇在每个格子中只有一个方向,然后,若“吃”到系统随机给出的小点,则相应的蛇身增加一格,最后,控制蛇头不能触到蛇身任何位置,若触到则游戏结束。作者信息主要是贴出个人信息。游戏说明对游戏的玩法做出介绍。2、原型设计操作系统:Android 4.0及以上版本屏幕分辨率:320480手机型号:适用于装有Android4.0及以上版本 并且屏幕分辨率320480 的手机3、系统流程Snake ActivityGame ActivityHelp ActivityAuthorView Activity交互界面切换图4 系统流程四、详细设计与编程实现4.1 项目框架新建一个Eclipse工程并命名为Snake,工程如下图所示:图5 Snake工程工程中包括4个Activity,分别为Snake(主界面)、Game(游戏界面)、Help(游戏说明界面)、AuthorView(作者信息界面),通过不同Activity之间的转换实现不同界面之间的切换。4.2 游戏类图设计Game(Activity)继承了SnakeView类,SnakeView类继承了TileView类。TileView类继承了View,如下图所示:SnakeViewTileViewGame(Activity)View图8 类图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 int 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) super(context, attrs);Log.i(tag, TileView Constructor);Log.i(tag, mTileSize= + mTileSize);SnakeView类定义了游戏运行时的画面改变及蛇体和果子的更新方法。定义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);loadTile(GREEN_STAR, r.getDrawable(R.drawable.greenstar);此外还定义了updateWalls()、updateApples()、updateSnake()绘制墙、果子、蛇,以及更新画面函数、保存位置坐标函数等,具体代码请详见目录。4.3 界面设计界面设计包括游戏主界面(Snake)、作者信息界面、游戏说明界面、游戏界面的设计。界面的设计采用的是xml文档形式,在xml文档中规划好界面布局布局后,分别在java文件中声明。主界面设计:主界面包括一个 TextView、一个imagebutton、三个button,其main.xml文档如下: 游戏主界面如下图所示:图6 游戏主界面游戏界面设计:游戏界面包括一个 button,一个game.snake.SnakeView,其game.xml文档相对应的为Game.java文件。运行界面图如下所示:图7 游戏开始界面图8 游戏运行界面图9 游戏结束界面作者信息界面设计:此界面包括一个 TextView、一个button,其author.xml文档相对应的为AuthorView.java文件,设计界面如图10所示。 图10 作者信息界面游戏说明界面设计:此界面包括一个TextView、一个button,其help.xml文档相对应的为Help.java文件。游戏说明如图11所示。图11 游戏说明界面至此,全部界面设计完成,但还有最重要的一步,就是将所有的Activity注册到AndroidManifest.xml中。AndroidManifest.xml文档如下: 另外strings.xml中定义了常量字符,至此,贪吃蛇游戏设计完毕。五、系统调试和运行1要切换空间,重新设置Eclipse。2在自定的视图中添加一个Button按钮,通过此按钮实现返回主界面的功能,但是此时的Button按钮是显示不出来的,上网查资料很多人说自定的视图也是View,Button也是View,View和View是不能嵌套的,解决的办法是有的,可以在自定义的视图上画一个Button或者绘制某一个区域,并将此区域注册到监听器上去,如果鼠标在此区域点击则返回主界面,否则不执行。程序调试运行效果图如下:3. Invalid start tag LinearLayout main.xml放错文件夹,应在reslayout下。4. Activity not started, its current task has been brought to the front 解决方法:在Eclipse中,“project”-“clean”。总结我所做的设计功能并不算强大,但是这些结合了本学期所学习的内容,主要是界面的设计,并改写了两个类。通过自己写代码,我更进一步清楚了android工程的框架及设计的步骤,以及每个文件的作用,稍微掌握了一些View类的方法,同时也学到了更多的界面设计的方法,比如如何实现一个TextView里显示多行数据,如何自定义视图等。通过本次的设计,我学到了很多,我会再接再厉,了解更多,充实自己。参考文献1 陈炜,张晓蕾,侯燕萍等Java软件开发技术M北京:人民邮电出版社,2005. 2 林城. Android 2.3 应用开发实战J . 机械工业出版社,2011:17-321.3 张建源.Android开发技术的学习及应用J.太原:现代工业经济及现代化,2014(12):23-26.4 Ed Burnette.Hello, Android:Introducing Googles Mobile Develpment PlatformM. NewYork: Pragmatic Bookshelf,2013.5 韩超.Android经典应用程序开发J . 人力资源出版社,2011:5-18.附录(源程序代码)TileView.javapackage my.game.snake;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.util.Log;import android.view.View;public class TileView extends View private static final String tag = yao;protected static int mTileSize = 20;/方格的边长protected static int mXTileCount;/X轴上方格的个数protected static int 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) 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 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= + 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 intmXTileCountmYTileCount;clearTiles();/这里做了一个 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() 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) Log.i(tag, onDraw);super.onDraw(canvas);Bitmap bmp;float left;float top;for (int x = 0; x mXTileCount; x+) for (int y = 0; y 0) bmp = mTileArraymTileGridxy;left = x * mTileSize + mXOffset;top = y * mTileSize + mYOffset;canvas.drawBitmap(bmp, left, top, mPaint);SnakeView.javapackage my.game.snake;import java.util.ArrayList;import java.util.Random;import android.content.Context;import android.content.res.Resources;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.util.Log;import android.view.KeyEvent;import android.view.View;import android.widget.TextView;public class SnakeView extends TileView private static final String tag = yao;private int mMode = READY;/游戏的四种状态public static final int PAUSE = 0;public static final int READY = 1;public static final int RUNNING = 2;public static final int LOSE = 3; /蛇体运动的方向识别private int mDirection = NORTH;private int mNextDirection = NORTH;private static final int NORTH = 1;private static final int SOUTH = 2;private static final int EAST = 3;private static final int WEST = 4;/游戏中仅有的三种砖块对应的数值private static final int RED_STAR = 1;private static final int YELLOW_STAR = 2;private static final int GREEN_STAR = 3;private long mScore = 0;/记录获得的分数private long mMoveDelay = 600;/每移动一步的延时。初始时设置为600msprivate long mLastMoveTime;private TextView mStatusTextView;/用来显示游戏状态的TextView/两个链表,分别用来存储蛇体和果子的坐标private ArrayList mSnakeTrail = new ArrayList();private ArrayList mAppleList = new ArrayList(); /随机数生成器private static final Random RNG = new Random();/用Handler机制实现定时刷新private RefreshHandler mRedrawHandler = new RefreshHandler();class RefreshHandler extends Handler /获取消息并处理Overridepublic 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);public SnakeView(Context context, AttributeSet attrs) super(context, attrs);Log.i(tag, SnakeView Constructor);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);loadTile(GREEN_STAR, r.getDrawable(R.drawable.greenstar);/更新游戏状态public void setMode(int newMode) int oldMode = mMode;mMode = newMode;Resources res = getContext().getResources();CharSequence str = ;if (newMode = RUNNING & oldMode != RUNNING) mStatusTextView.setVisibility(View.INVISIBLE);update();return;if (newMode = PAUSE) str = res.getText(R.string.mode_pause);if (newMode = READY) str = res.getText(R.string.mode_ready);if (newMode = LOSE) str = res.getString(R.string.mode_lose_prefix) + mScore+ res.getString(R.string.mode_lose_suffix);mStatusTextView.setText(str);mStatusTextView.setVisibility(View.VISIBLE); /绑定到相应的textviewpublic void setStatusTextView(TextView newView) mStatusTextView = newView; /按键的监听public boolean onKeyDown(int keyCode, KeyEvent msg) if (keyCode = KeyEvent.KEYCODE_DPAD_UP) if (mMode = READY | mMode = LOSE) initNewGame();setMode(RUNNING);update();return (true);if (mMode = PAUSE) setMode(RUNNING);update();return (true);if (mDirection != SOUTH) mNextDirection = NORTH;return (true);if (keyCode = KeyEvent.KEYCODE_DPAD_DOWN) if (mDirection != NORTH) mNextDirection = SOUTH;return (true);if (keyCode = KeyEvent.KEYCODE_DPAD_LEFT) if (mDirection != EAST) mNextDirection = WEST;return (true);if (keyCode = KeyEvent.KEYCODE_DPAD_RIGHT) if (mDirection != WEST) mNextDirection = EAST;return (true);return super.onKeyDown(keyCode, msg); /刷新游戏状态。每次游戏画面的更新、游戏数据的更新,都是依靠这个update()来完成的public void update() if (mMode = RUNNING) long now = System.currentTimeMillis();if (now - mLastMoveTime mMoveDelay) /clearTiles();updateWalls();updateSnake();updateApples();mLastMoveTime = now;mRedrawHandler.sleep(mMoveDelay); /用setTile绘制墙壁private void updateWalls() Log.i(tag, 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); /绘制果子 private void updateApples() Log.i(tag, updateApples);for (Coordinate c : mAppleList) setTile(YELLOW_STAR, c.x, c.y); /更新蛇体private void updateSnake() /吃过果子的蛇会长长。这个变量即为它的标记。boolean growSnake = false;/头部很重要,只有头部可能碰到果子。Coordinate head = mSnakeTrail.get(0); /蛇下一步一定会前移,也就试newHead。长长只会从尾部增加。Coordinate newHead = new Coordinate(1, 1);mDirection = mNextDirection;switch (mDirection) case EAST: newHead = new Coordinate(head.x + 1, head.y);break;case WEST: newHead = new Coordinate(head.x - 1, head.y);break;case NORTH: newHead = new Coordinate(head.x, head.y - 1);break;case SOUTH: newHead = new Coordinate(head.x, head.y + 1);break;if (newHead.x 1) | (newHead.y mXTileCount - 2)| (newHead.y mYTileCount - 2) setMode(LOSE);return;int snakelength = mSnakeTrail.size();for (int snakeindex = 0; snakeindex snakelength; snakeindex+) Coordinate c = mSnakeTrail.get(snakeindex);if (c.equals(newHead) setMode(LOSE);return;int applecount = mAppleList.size();for (int appleindex = 0; appleindex applecount; appleindex+) Coordinate c = mAppleList.get(appleindex);if (c.equals(newHead) mAppleList.remove(c);addRandomApple();mScore+;mMoveDelay *= 0.9;growSnake = true;mSnakeTrail.add(0,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深入分析2025年废弃矿井资源再利用政策环境与发展机遇
- 2025年私募股权投资基金行业投资热点与退出策略行业竞争格局前瞻报告
- 2025年合租租房合同范本:租房合同标准版
- 工程维修年底考核方案(3篇)
- 工程团队结构分析方案(3篇)
- 工程审计方案编制要求(3篇)
- 2025年新能源行业反垄断风险预警与技术储备策略报告
- 工程停电计划方案模板(3篇)
- 城市地下综合管廊2025年社会稳定风险评估与风险防范策略报告
- 食品行业2025年食品安全追溯体系与食品安全教育普及报告
- 轴对称及其性质第1课时课件2025-2026学年人教版数学+八年级上册
- 第一 单元 富强与创新 单元检测题(含答案)-2025-2026学年 九年级上册道德与法治
- 2025-2026秋中小学升旗仪式演讲稿:(第3周)积跬步养习惯向未来
- 2025秋苏教版(2024)小学科学二年级上册(全册)课时练习及答案(附目录)
- 2024长沙电力职业技术学院单招考试文化素质物理考试历年机考真题集附完整答案详解【易错题】
- 2025至2030年中国银川房地产行业市场调查研究及发展战略规划报告
- 装修代购协议书
- 土建质量培训的课件
- (高清版)DB13∕T 2823-2018 公路高模量沥青路面施工技术指南
- 培训消防培训课件
- 中国避孕药行业发展趋势及发展前景研究报告2025-2028版
评论
0/150
提交评论