安卓软件开发--基于android系统的贪食蛇游戏设计内容摘要:

概要设计 程序流程设计本游戏的流程如下图所示:触摸屏幕游戏开始,蛇开始移动键盘操作: 向上左移右移向下没有吃到食物且蛇碰到边界游戏结束游戏中途欲中断,稍后继续游戏触摸屏幕暂停游戏游戏暂停进入游戏画面再次触摸屏幕游戏恢复 游戏处理流程图 模块划分从面向对象程序设计的角度,本项目总体地可以分为游戏界面模块、数据存储模块和控制模块。 如下图所示:游戏数据存储模块贪吃蛇游戏游戏主界面模块游戏控制模块 游戏总设计模块 游戏主界面模块游戏界面主框架主要包括游戏图形区域界面、游戏的开始按钮、暂停按钮、游戏的退出按钮。 游戏的主界面架游戏图形区域界面(即游戏画布)游戏控制按钮界面 游戏主界面 游戏控制模块 游戏控制模块主要通过手机键盘上的按钮来控制游戏的开始、游戏的暂停、游戏的退出这三个功能以及控制游戏分数变化。 在这个模块中,需要给各个按钮添加响应事件代码,来对上述的功能加以进一步的实现。 游戏控制模块游戏的移动速度功能能游戏的暂停功能游戏的重新开始 游戏控制模块框架 模块实现原理 游戏界面模块实现本游戏采用Activity作为游戏背景的载体,在Android中一个Activity就相当于windows中的一个窗口,Activity上可以放置许多类型的控件。 一个activity主要有三个状态:当在屏幕前台时(位于当前任务堆栈的顶部),它是活跃或运行的状态。 它就是相应用户操作的activity。 当它失去焦点但仍然对用户可见时,它处于暂停状态。 即是:在它之上有另外一个activity。 这个activity也许是透明的,或者未能完全遮蔽全屏,所以被暂停的activity仍对用户可见。 暂停的activity仍然是存活状态(它保留着所有的状态和成员信息并连接至窗口管理器),但当系统处于极低内存的情况下,仍然可以杀死这个activity。 如果它完全被另一个activity覆盖是,它处于停止状态。 它仍然保留所有的状态和成员信息。 然而它不在为用户可见,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个activity。 如果一个activity处于暂停或停止状态,系统可以通过要求它结束(调用它的 finish() 方法)或直接杀死它的进程来将它驱出内存。 当它再次为用户可见的时候,它只能完全重新启动并恢复至以前的状态。 当一个activity从这个状态转变到另一个状态时,它被以下列protected方法所通知:void onCreate(Bundle savedInstanceState) 、void onStart() 、void onRestart() 、void onResume() 、void onPause() 、void onStop() 、void onDestroy()2. 实现蛇的身体蛇可以看做是一个个节点组成的,因此可以用一个链表来存储蛇身的元素,在画蛇时遍历这个链表讲里面的元素一一画出,这样就实现了一条蛇.3. 实现蛇的移动用一个timer(定时器)来不断地刷新游戏画面,每刷新一次就再蛇头的前面(链表的尾部)增加一个新元素,同时把蛇尾的一个元素删掉,这样从视觉上看起来就实现了蛇的移动.4. 实现蛇吃食物 蛇移动的过程中如果蛇头的坐标与食物出现的坐标重合了,那么就在蛇头的位置增加一个元素同时不删除蛇尾的最后一个元素,这样蛇每迟到一个食物 身体就会变长一截. 游戏控制模块实现1. 实现操作蛇的移动方向在Android系统中,手机上的每个按钮都会有一个对应的键值跟它对应,所在可以给对应的按钮设置监听器OnClickListener,监听器是一个接口,该接口中有一个方法onClick(View v)。 当按钮被点击的时候系统会自动调用该监听器的onClick(View v)方法。 所以实现游戏控制的具体代码将被写到该方法中。 因为本游戏中不允许蛇向与蛇头相反的方向移动,所以当用户操作时需要判断用户操作的方向是不是跟规则冲突,若冲突则无视该操作,若不冲突则响应该操作,所以需要用一个变量来记录蛇头的当前方向。 2. 实现游戏暂停 在Activity的生命周期中,有一个onPause() ,如果有来电或是其它事件中断, 这时应该把当前状态保存。 以便返回时,还可以继续玩游戏。 这就使用 onSaveInstanceState实现保存当前状态。 3. 实现游戏恢复Activity生命周期的onResume().4. 实现游戏退出当一个Activity退出或者被调用finish()方法后,系统会调用其生命周期方法onDestroy().当用户退出游戏时,可以在这个方法中对资源进行释放. 数据存储模块实现 在Android系统中数据的存储是使用SQLite数据库来实现的,SQLite是一款轻型的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。 它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。 在SQLite中创建一张表,表的结构如下表所示:字段名类型意义playervarchar玩家名字scoreint玩家分数该表用来存放玩家数据。 第五章 详细设计 游戏类图本游戏的类图如下: 游戏类图 游戏界面具体实现 蛇身、食物和墙的实现前面已经提过,蛇身的数据用一个链表来存储,具体我使用ArrayList来实现。 蛇身的每个元素、食物和墙都是一个坐标对象,画这些东西的时候只需要把它们的坐标传给画的方法就行了。 这里需要引进一个坐标类Coordinate,这是一个包括两个参数,用于记录X轴和Y轴简单类,其中包括一个比较方法,:class Coordinate { public int x。 public int y。 public Coordinate(int newX, int newY) { x = newX。 y = newY。 } public boolean equals(Coordinate other) { if (x == amp。 amp。 y == ) { return true。 } return false。 } @Override public String toString() { return Coordinate: [ + x + , + y + ]。 } }蛇身的初始长度我设置为5,new 5个Coordinate的对象放入ArrayList中。 整个屏幕可以看做是有很多个网格组成的,而蛇就在这些网格中移动。 用一个二维数组int[][] mTileGrid来存储网格的坐标,将蛇身、食物或者墙的坐标传到该数组中,onDraw方法按照该数组中的坐标将屏幕相应位置的网格填充成位图。 画蛇身、食物、墙的方法为: @Override public void onDraw(Canvas canvas) { (canvas)。 for (int x = 0。 x mXTileCount。 x ++) { for (int y = 0。 y mYTileCount。 y ++) { if (mTileGrid[x][y] 0) { (mTileArray[mTileGrid[x][y]], mXOffset + x * mTileSize, mYOffset + y * mTileSize, mPaint)。 } } } } 蛇移动的实现使用View类的onKeyDown方法,该方法由系统监听调用。 根据按键的值处理响应事件,该方法中解决了反向移动的问题。 mDirection 为当前蛇头的方向,mNextDirection 为按键对应的方向,按键按下后会先判断当前方向是否跟下一方向相反,若相反则不响应事件。 具体代码如下: @Override public boolean onKeyDown(int keyCode, KeyEvent msg) { if (keyCode == ) { if (mMode == READY | mMode == LOSE) { /* * At the beginning of the game, or the end of a previous one, * we should start a new game. */ initNewGame()。 setMode(RUNNING)。 update()。 return (true)。 } if (mMode == PAUSE) { /* * If the game is merely paused, we should just continue where * we left off. */ setMode(RUNNING)。 update()。 return (true)。 } if (mDirection != SOUTH) { mNextDirection = NORTH。 } return (true)。 } if (keyCode == ) { if (mDirection != NORTH) { mNextDirection = SOUTH。 } return (true)。 } if (keyCode == ) { if (mDirection != EAST) { mNextDirection = WEST。 } return (true)。 } if (keyCode == ) { if (mDirection != WEST) { mNextDirection = EAST。 } return (true)。 } return (keyCode, msg)。 }if ((direction != currentDirection) amp。 amp。 !needUpdate){// 取出列表中的最后一个元素(蛇的头部)WormLink sl = (WormLink)()。 int x = ()。 int y = ()。 // 不同的运动方向坐标的改变也不一样switch (direction) {case UP: // 当这段向上运动的时候if (currentDirection != DOWN) {y。 needUpdate = true。 }break。 case DOWN: // 当这段向下运动的时候if (currentDirection != UP) {y++。 needUpdate = true。 }break。 case LEFT: // 当这段向左运动的时候if (currentDirection != RIGHT) {x。 needUpdate = true。 }break。 case RIGHT: // 当这段向右运动的时候if (currentDirection != LEFT) {x++。 needUpdate。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。