手机操作系统游戏软件开发创新实验报告

来源:执业药师 发布时间:2021-05-03 点击:

 项目编号

 创新实验陈诉

 实验项目名称

  基于 Android 手机操纵系统的游戏软件开发 学 生 姓 名

 石皓程 樊峰辰

  学 生 学 号

 021112218/021112230

 所 在 学 院

 电子电气工程学院

  指 导 西 席

  施一萍

  目录

 一、 实验目的 二、 实验方案 2.1 总体设计思想

  2.2 实验流程(步调)

  2.3 实验情况

  2.4 实验分工 三、 实验历程 3.1Andriod 软件开发情况搭建 3.2 模块分别 3.3 游戏主界面模块 3.4 游戏控制模块 3.5 模块实现原理 3.51 游戏界面模块实现 3.52 游戏控制模块实现 3.6 游戏界面具体实现

  3.61 蛇身、食物和墙的实现

  3.62 处理惩罚键盘事件

  3.63 TileView 类的设计

  3.64 SnakeView 类的设计

  3.65 RefreshHandler 类的设计 3.7 步伐调试与运行 四、 实验结果和阐发 五、 参考文献 六、 附录一 代码清单 七、 附录二 情况搭建和运行

 一.

 实验目的 贪吃蛇游戏一款非常经典的手机游戏,因为它比力简单有趣,无论老少都比力适合。贪吃蛇的设计对每一个 Java 语言设计者进行语言提高和进阶都是一个很好的熬炼时机。

 贪吃蛇游戏的设计比力庞大,它涉及面广、牵涉方面多,如果欠好好考虑和设计,将难以乐成开发出这个游戏。在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。因此,如何设计和开发好这个贪吃蛇游戏,对付提高 Java 开发水平和系统的设计能力有极大的资助。在设计开发历程中,需要处理惩罚好各个类之间的继承干系,还要处理惩罚各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖干系和数据通信干系。

 本项目在 Android 平台下,使用 Java 语言,Android 开发技能开发一款界面友好,成果齐全的贪吃蛇游戏。

 二.

 实验方案 2.1 总体设计思想

 本软件是针对贪吃蛇小游戏的 JAVA 步伐,利用上、下、左、右偏向键来改变蛇的运动偏向,长按某个偏向键后,蛇的运动速度会加快,在随机的地方产生食物,吃到食物就酿成新的蛇体,碰到壁或自身则游戏结束,不然正常运行游戏,在到达牢固的分数后,游戏速度会加快。

 2.2 实验流程 Java 编程语言 Android 软件的开发情况搭建(Eclipse 开发软件、Android SDK 开发框架、Android Development Tool 开发情况)

 Android 步伐的框架结构 游戏软件的开发 2.3 实验情况

  实验所在在实训楼 1 号楼盘算中心。盘算中心具有较好的实验设备,拥有较高配置的 PC 机 300 台(Intel 酷睿 2 Q8300 四核处理惩罚器、2G 内存),都可以接入校园网和 Inter 网,完全能满足该创新实验项目的需要。

 2.4 实验分工

  李

 琦:情况的搭建和游戏的编译

  邵彧韬:截图和后期的制作

 三.

 实验历程 3.1Andriod 软件开发情况搭建

  采取 eclipse 开发东西 在 windows7 下进行,基于安卓 2.2 操纵系统。

 情况搭建: 1.

 JDK 安装

 2.

 Eclipse 安装

 3.

 Android SDK 安装

 4.

 ADT 安装创建 AVD 软件总体设计

 工程中包罗 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.1 3.2 模块分别 从面向东西步伐设计的角度,本项目总体地可以分为游戏界面模块、数据存储模块和控制模块。

 如下图所示:

  3.3 游戏主界面模块 游戏界面主框架主要包罗游戏图形区域界面、游戏的开始按钮、暂停按钮、游戏的退出按钮。

 游戏界面主框架的主要结构图如图 3.3 所示。

 3.4 游戏控制模块

  游戏控制模块主要通过手机键盘上的按钮来控制游戏的开始、游戏的暂停、游戏的退出这三个成果以及控制游戏分数变革。在这个模块中,需要给各个按钮添加响应事件代码,来对上述的成果加以进一步的实现。

 游戏控制模块的主要框架如图 3.4 所示。

 游戏的主界面架 游戏图形区域界面 (即游戏画布)

 游戏控制按钮图 3.3 游戏主界面 贪吃蛇游戏 游戏主界面 游戏控制模图 3.2 游戏总体模块 游戏数据存储模块

  3.5 模块实现原理

 游戏界面模块实现 1.实现游戏配景 本游戏采取 Activity 作为游戏配景的载体,在 Android 中一个 Activity 就相当于 windows 中的一个窗口,Activity 上可以安排许多类型的控件。一个 activity主要有三个状态:

 当在屏幕前台时(位于当前任务堆栈的顶部),它是活泼或运行的状态。它就是相应用户操纵的 activity。

 当它失去核心但仍然对用户可见时,它处于暂停状态。便是:在它之上有另外一个 activity。这个 activity 也许是透明的,大概未能完全遮蔽全屏,所以被暂停的 activity 仍对用户可见。暂停的 activity 仍然是存活状态(它保存着所有的状态和成员信息并连接至窗口治理器),但当系统处于极低内存的情况下,仍然可以杀死这个 activity。

 如果它完全被另一个 activity 笼罩是,它处于停止状态。它仍然保存所有的状态和成员信息。然而它不在为用户可见,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个 activity。

 如果一个 activity 处于暂停或停止状态,系统可以通过要求它结束(调用它的 finish() 要领)或直接杀死它的进程来将它驱出内存。当它再次为用户可见的时候,它只能完全重新启动并规复至以前的状态。

 当一个 activity 从这个状态转变到另一个状态时,它被以下列 protected 要领游戏控制模块 游戏的移动速度游戏的暂停功能 游戏的重新开始 图 3.4 游戏控制模块框架

 所通知:

 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()要领.该要领在 Activity 变得不可见的时候被系统自动调用.在玩游戏历程中,如果有来电或是其它事件中断, 这时应该把当前状态生存。以便返回时,还可以继承玩游戏。这就使用onSaveInstanceState 实现生存当前状态。

 3.实现游戏规复 Activity 生命周期的 onResume()要领.该要领在 Activity 从不可见的状态下变得可见时被系统自动调用.在用户接完电话大概在暂停状态下触摸屏幕后可以在该生命周期要领中对游戏进行规复. 4.实现游戏退出

 当一个 Activity 退出大概被调用 finish()要领后,系统会调用其生命周期要领onDestroy().当用户退出游戏时,可以在这个要领中对资源进行释放. 3.6 游戏界面具体实现

 前面已经提过,蛇身的数据用一个链表来存储,具体我使用 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 == other.x && y == other.y) {

  return true;

  }

  return false;

  }

  public String toString() {

  return "Coordinate: [" + x + "," + y + "]";

  }

  }

 蛇身的初始长度我设置为5,new 5个Coordinate的东西放入ArrayList中。整个屏幕可以看做是有许多个网格组成的,而蛇就在这些网格中移动。用一个二维数组int[][] mTileGrid来存储网格的坐标,将蛇身、食物大概墙的坐标传到该数组中,onDraw要领凭据该数组中的坐标将屏幕相应位置的网格填充成位图。画蛇身、食物、墙的要领为:

  public void onDraw(Canvas canvas) {

  super.onDraw(canvas);

  for (int x = 0; x < mXTileCount; x ++) {

  for (int y = 0; y < mYTileCount; y ++) {

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

  canvas.drawBitmap(mTileArray[mTileGrid[x][y]],

 mXOffset + x * mTileSize,

  mYOffset + y * mTileSize,

  mPaint);

  }

  }

  }

 }

 使用 View 类的 onKeyDown 要领,该要领由系统监听调用。凭据按键的值处理惩罚响应事件,该要领中解决了反向移动的问题。mDirection 为当前蛇头的偏向,mNextDirection 为按键对应的偏向,按键按下后会先判断当前偏向是否跟下一偏向相反,若相反则不响应事件。具体代码如下:

  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);

  } if

 ((direction != currentDirection) && !needUpdate) { // 取出列表中的最后一个元素(蛇的头部) WormLink sl = (WormLink)worm.lastElement(); int x = sl.getEndX(); int y = sl.getEndY(); // 差别的运动偏向坐标的改变也不一样 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 = true; }

 break; } // 当变动偏向后需要更新 if (needUpdate == true) { worm.addElement (new WormLink (x, y, 0, direction)); currentDirection = direction; } } 3.6.3 TileVi...

推荐访问:游戏软件 操作系统 实验
上一篇:物业管理标准作业规范
下一篇:提高居家学习有效性思考建议

Copyright @ 2013 - 2018 优秀啊教育网 All Rights Reserved

优秀啊教育网 版权所有