嵌入式软件开发课程设计-俄罗斯方块游戏_第1页
嵌入式软件开发课程设计-俄罗斯方块游戏_第2页
嵌入式软件开发课程设计-俄罗斯方块游戏_第3页
嵌入式软件开发课程设计-俄罗斯方块游戏_第4页
嵌入式软件开发课程设计-俄罗斯方块游戏_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、班级 学号: 姓名: 日期: 淮 海 工 学 院 计算机工程学院课程设计报告设计名称: 嵌入式软件课程设计 姓 名: 学 号: 专业班级: 系 (院): 计算机工程学院 设计时间: 设计地点: 硬件综合室 成绩:«成绩»指导教师评语:«评语» 签名: 2015年1 月 日课 程 设 计 说 明 书1课程设计题目:基于Android环境的俄罗斯方块游戏设计2课程设计内容:俄罗斯方块是家喻户晓的益智小游戏,它由俄罗斯人阿列克谢帕基特诺夫(Alexey Pazhitnov)在1984年6月利用空暇时间编写的游戏程序,故此得名。俄罗斯方块的基本规则是移动、旋转和

2、摆放游戏随机产生的各种方块,使之排列成完整的一行或多行并且消除得分。它看似简单却变化无穷,俄罗斯方块上手极其简单,且游戏过程变化无穷,作为游戏本身很有魅力,但是要熟练掌握其中的操作和摆放技巧,难度却不低。此软件给用户提供了一个展现自己高超技艺的场所,在这里,它不仅放松自己,还能感受到游戏中的乐趣。游戏区域会从顶部不断落下8种下坠物的一种,游戏区域右上角有一个区域可以显示下一个下坠物的形状,玩家可以控制下坠物移动、旋转和一键到底,通过玩家的操作,下坠物在游戏区域以“摆积木”的形式出现。下坠物在一行或多行堆满后就可以自动消除,消行后会得到相应的分数,如果当前下坠物堆积至窗口顶端,则游戏结束。 3课

3、程设计目的:嵌入式系统的教学可以分为课堂理论教学、实验教学和课程设计三个层面。这三个层面的目标有所不同。理论学习的主要目标是掌握嵌入式系统的一般原理,例如实时调度策略、自动控制算法等;实验教学的主要目的是掌握嵌入式系统的主要开发流程和基本方法,例如开发工具链的使用、小型应用开发等;课程设计的主要目的是通过实际的嵌入式应用系统开发实例掌握嵌入式系统设计和开发的技能和专门知识,积累实践和工程经验。 课 程 设 计 说 明 书4课程设计要求:开发一个简单的俄罗斯方块游戏,并达到以下要求:1、开始游戏随机产生方块并自动下落。右上角2*2预示框显示即将出现的图形;2、按“|”键可以暂停游戏,按”GO”键

4、开始游戏;3、点击屏幕变换方块角度,触屏向左(右)实现左(右)移,向下点击加速下移;4、系统能够正确判断是否满行,并对已满的行实现消行并加分。5设计详细说明(1) 总体设计思路及算法描述(1)方块类:每个方块都有自己的ID、形状、颜色。每个方块都限定在4*4的矩形区域内变幻形状。以此矩形区域的左上方端点为坐标移动。在方块类中定义多个私有数组,将每种ID的方块的形状数据存储好,这样产生一个方块时只需要提供其ID即可。移动:在指定的游戏区域中移动,包括向左、右、下移动。以一个单元为单位。触屏向左(右)轻微移动实现左(右)移一格,触屏向左(右)长移实现左(右)移到最左(右)端,触屏向下轻微移动加速下

5、移一格,触屏向下长移加速下移至底端。如果可以移动,则修改参考点的位置,并在指定的游戏区域中重新填充自己,返回是否移动成功的信息。旋转:为了处理方块的旋转,我们不能只记录提供的8中方块形状,而应该把它们旋转后产生的每种形状都认为是一种不同的方块。这时候我们只处理一个方向的旋转,即顺时针旋转方式。然后在指定的区域中重新填充自己。(2)游戏区域类:可以用一个二维数组方便的实现。状态:游戏未开始;游戏已开始;游戏结束。方块落地:先执行清行操作,获得活动方块占用了哪些行的信息,然后逐行进行扫描:对每一行,检查其10列单元格是否都已经被填充,如果没有,则继续检查下一行,如果是,则将该行以上的游戏区域整体下

6、移一行,并在最上面一行填充一行空格。执行完清行操作后,要产生下一个方块,方块类似于“开始”命令中的步骤,此时要把活动方块指定为新产生的方块,而且还有检查新产生的方块是否能成功填充,如果填充失败,则游戏结束。课 程 设 计 说 明 书 5设计详细说明 续1(2) 硬件原理图及相关说明Android 有丰富的功能,因此很容易与桌面操作系统混淆。Android 是一个分层的环境,构建在 Linux 内核的基础上,它包括丰富的功能。UI 子系统包括:窗口,视图。用于显示一些常见组件(例如编辑框、列表和下拉列表)的小部件。Android 包括一个构建在 WebKit 基础上的可嵌入浏览器,iPhone

7、的 Mobile Safari 浏览器同样也是以 WebKit 为基础。Android 提供多种连接选项,包括 WiFi、蓝牙和通过蜂窝(cellular)连接的无线数据传输(例如 GPRS、EDGE 和 3G)。Android 应用程序中一项流行的技术是链接到 Google 地图,以便在应用程序中显示地址。Android 软件栈还提供对基于位置的服务(例如 GPS)和加速计的支持,不过并不是所有的 Android 设备都配备了必需的硬件。另外还有摄像支持。过去,移动应用程序努力向桌面应用程序看齐的两个领域分别是图形/媒体和数据存储方法。Android 通过提供对 2D 和 3D 图形的内置支

8、持,包括 OpenGL 库,解决了图形方面的挑战。由于 Android 平台包括流行的开源 SQLite 数据库,因此缓解了数据存储的负担。应用程序架构。如前所述,Android 运行在 Linux 内核上。Android 应用程序是用 Java 编程语言编写的,它们在一个虚拟机(VM)中运行。需要注意的是,这个 VM 并非您想象中的 JVM,而是 Dalvik Virtual Machine,这是一种开源技术。每个 Android 应用程序都在 Dalvik VM 的一个实例中运行,这个实例驻留在一个由 Linux 内核管理的进程中。(图1)课 程 设 计 说 明 书5设计详细说明 续2(3

9、) 软件流程图及其说明 (图2) 1游戏方块控制功能 2游戏显示更新功能 3游戏速度更新功能 4游戏积分等级功能 5游戏规则 (图3) (图4)课 程 设 计 说 明 书5设计详细说明 续3(4) 功能模块设计说明 我主要负责游戏的形状视图以及各种方块的形状定义a.俄罗斯方块中的“山”型:在这个4*4的方块中,定义一个 (图4.1)二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data02,data11,data12,data13从而得到如上图形,并设置成绿色。其具体的实现代码如下:data02.setSolid(true);data02.setColor(COLOR);da

10、ta11.setSolid(true);data11.setColor(COLOR);data12.setSolid(true);data12.setColor(COLOR);data13.setSolid(true);data13.setColor(COLOR);同理可以得出“山”型的另外三种形状b. 俄罗斯方块中的“直线”型在这个4*4的方块中,定义一个 (图4.2)二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data00,data01,data02,data33从而得到如上图形,并设置成蓝色。其具体的实现代码如下 :data00.setSolid(true); dat

11、a00.setColor(COLOR); data01.setSolid(true); data01.setColor(COLOR); data02.setSolid(true); data02.setColor(COLOR); data03.setSolid(true); data03.setColor(COLOR);同理可以得出“直线”型的另外一种形状c. 俄罗斯方块中的“N”型在这个4*4的方块中,定义一个 (图4.3)二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data02,data11,data12,data21从而得到如上图形,并设置成粉红色。课 程 设 计 说

12、 明 书5设计详细说明 续4其具体的实现代码如下 :data = getEmptyShape(); data02.setSolid(true); data02.setColor(COLOR); data11.setSolid(true); data11.setColor(COLOR); data12.setSolid(true); data12.setColor(COLOR); data21.setSolid(true);data21.setColor(COLOR);同理可以得出“N”型的另外一种形状d. 俄罗斯方块中的“反N”型在这个4*4的方块中,定义一个 (图4.4)二维数组,通过设置里

13、面的小正方形的颜色来得到对应的图形,通过设置data01,data11,data12,data22从而得到如上图形,并设置成浅绿色。其具体的实现代码如下 :data01.setSolid(true); data01.setColor(COLOR); data11.setSolid(true); data11.setColor(COLOR); data12.setSolid(true); data12.setColor(COLOR); data22.setSolid(true); data22.setColor(COLOR);同理可以得出“反N”型的另外一种形状e. 俄罗斯方块中的“左拐杖”型在

14、这个4*4的方块中,定义一个 (图4.5)二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data11,data12,data22,data32从而得到如上图形,并设置成灰色。其具体的实现代码如下 : data11.setSolid(true); data11.setColor(COLOR); data12.setSolid(true); data12.setColor(COLOR); data22.setSolid(true); data22.setColor(COLOR); data32.setSolid(true); data32.setColor(COLOR); 同理可

15、以得出“左拐杖”型的另外三种形状课 程 设 计 说 明 书5设计详细说明 续5f. 俄罗斯方块中的“右拐杖”型在这个4*4的方块中,定义一个 (图4.6)二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data11,data12,data21,data31从而得到如上图形,并设置成红色。其具体的实现代码如下 : data = getEmptyShape(); data11.setSolid(true); data11.setColor(COLOR); data12.setSolid(true); data12.setColor(COLOR); data21.setSolid(t

16、rue); data21.setColor(COLOR); data31.setSolid(true); data31.setColor(COLOR); 同理可以得出“右拐杖”型的另外三种形状g. 俄罗斯方块中的“田”型在这个4*4的方块中,定义一个 (图4.7)二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data01,data02,data11,data12从而得到如上图形,并设置成黄色。其具体的实现代码如下 : data01.setSolid(true); data01.setColor(COLOR); data02.setSolid(true); data02.set

17、Color(COLOR); data11.setSolid(true); data11.setColor(COLOR); data12.setSolid(true); data12.setColor(COLOR); h. 俄罗斯方块中的“点”型在这个4*4的方块中,定义一个 (图4.8)二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data02,从而得到如上图形,并设置成灰色。其具体的实现代码如下 : data02.setSolid(true); data02.setColor(COLOR); 课 程 设 计 说 明 书5设计详细说明 续6(5) 调试说明由于我主要负责游戏的

18、形状视图,对界面设计和编程,在编程过程中,如何实现对界面的设计,遇到了很多问题,例如,怎么把屏幕分成20*10的小方格,开始尝试了很多方法,最终通过设置若干条间隙来实现此布局,正如开始时的界面:(图5.1)然后关于如何实现8种方块的形状也遇到了一些问题,怎样把8种形状表示出来,主要通过定义小方块的颜色来实现,用不同的颜色来表示小方块,定义一个二维的数组,然后把小方块定义出来,并且附上不同的颜色,这样就能够区分开来了,而且这样还能够很容易的实现小方块的变形以及下降,从而为后面的功能实现提供了可行的措施,下图是其代码的声明: (图5.2)课 程 设 计 说 明 书5设计详细说明 续7根据调试后,能

19、够正确的运行,如下图所示:(图5.3)最后关于菜单的设计,一个好的嵌入式软件,要有其好的说明,我主要设计了四个菜单,分别是排行榜,游戏操作,关于作者,以及退出。其界面如图所示: (图5.4)课 程 设 计 说 明 书5设计详细说明 续8其中排行榜里有分数.日期,时间,玩家姓名等信息,如下图所示:(图5.5)游戏操作里面有俄罗斯方块的游戏说明,如下图所示:(图5.6)课 程 设 计 说 明 书5设计详细说明 续9最后是关于作者的显示内容,如下图所示:(图5.7)(6) 用户说明(1)开始游戏随机产生方块并自动下落。右上角2*2预示框显示即将出现的图形; (2)按“|”键可以暂停游戏,按

20、”GO”键开始游戏; (3)点击屏幕变换方块角度,触屏向左(右)轻微移动实现左(右)移一格,触屏向左(右)长移实现左(右)移到最左(右)端,触屏向下轻微移动加速下移一格,触屏向下长移加速下移至底端;(4)系统能够正确判断是否满行,并对已满的行实现消行并加分。同时消除一行时得一分,同时消除二行时得三分,同时消除三行时得六分,同时消除四行时得十分。(5)游戏升级:每得50分,游戏升一级,方块下降速度增加。(6)选择菜单 a游戏操作b退出 c作者 d 排行榜:游戏结束时分数,玩家姓名,IP号和日期将记录进排行榜课 程 设 计 说 明 书6程序代码 Bar.java /直线型的源代码pack

21、age com.ding.shape;import android.graphics.Color;/长棒形状的设置public class Bar extends ShapeAbstract private static final long serialVersionUID = -7974219679616324149L;/序列号的时候,被序列化的类要有一个唯一标记。 private final static int COLOR = Color.BLUE;设置颜色为蓝色 Rectangle data = null; /矩形数组/设置直线横条 data = getEmptyShape(); d

22、ata00.setSolid(true); data00.setColor(COLOR); data01.setSolid(true); data01.setColor(COLOR); data02.setSolid(true); data02.setColor(COLOR); data03.setSolid(true); data03.setColor(COLOR); m_shapes.add(data);/设置直线竖条 data = getEmptyShape(); data01.setSolid(true); data01.setColor(COLOR); data11.setSolid

23、(true); data11.setColor(COLOR); data21.setSolid(true); data21.setColor(COLOR); data31.setSolid(true); data31.setColor(COLOR); m_shapes.add(data); public String toString() return "Bar" 课 程 设 计 说 明 书6程序代码 续1Hill.java /”山“型源代码package com.ding.shape;import android.graphics.Color;public class H

24、ill extends ShapeAbstract private static final long serialVersionUID = 1005482779396338610L;唯一的序列号 private final static int COLOR = Color.GREEN;设置颜色为绿色 Rectangle data = null; data = getEmptyShape(); data02.setSolid(true); data02.setColor(COLOR); data11.setSolid(true); data11.setColor(COLOR); data12.

25、setSolid(true); data12.setColor(COLOR); data13.setSolid(true); data13.setColor(COLOR); m_shapes.add(data); data = getEmptyShape(); data02.setSolid(true); data02.setColor(COLOR); data12.setSolid(true); data12.setColor(COLOR); data22.setSolid(true); data22.setColor(COLOR); data13.setSolid(true);data13

26、.setColor(COLOR);m_shapes.add(data); data = getEmptyShape(); data11.setSolid(true); data11.setColor(COLOR); data12.setSolid(true); data12.setColor(COLOR); data13.setSolid(true); data13.setColor(COLOR); data22.setSolid(true);data22.setColor(COLOR); 课 程 设 计 说 明 书6程序代码 续2m_shapes.add(data); data = getE

27、mptyShape(); data02.setSolid(true); data02.setColor(COLOR); data12.setSolid(true); data12.setColor(COLOR); data22.setSolid(true); data22.setColor(COLOR); data11.setSolid(true); data11.setColor(COLOR); m_shapes.add(data); public String toString() return "Hill" Square.java /田字型源代码package com

28、.ding.shape;import android.graphics.Color;public class Square extends ShapeAbstract private static final long serialVersionUID = 3870772549631600871L;/唯一的序列号 private final static int COLOR = Color.YELLOW;设置颜色为黄色 Rectangle data = getEmptyShape(); data01.setSolid(true); data01.setColor(COLOR); data02.

29、setSolid(true); data02.setColor(COLOR); data11.setSolid(true); data11.setColor(COLOR); data12.setSolid(true); data12.setColor(COLOR); m_shapes.add(data); public String toString() return "Square" 课 程 设 计 说 明 书6程序代码 续3ShapeView.javapackage com.ding.tetris;import com.ding.shape.Rectangle;impo

30、rt com.ding.shape.Shape;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.util.AttributeSet;import android.view.View;public class ShapeView extends View private int m_rectW; /矩形的宽 priv

31、ate int m_rectH; /矩形的高 private int m_gap = 1; /间隙 protected Rectangle m_data; /构造方法 public ShapeView(Context context) super(context); /构造方法 public ShapeView(Context context, AttributeSet as) super(context, as); /设置形状 public void setShape(Rectangle data) m_data = data; /设置矩形宽度 public void setRectWidt

32、h(int w) m_rectW = w; 课 程 设 计 说 明 书6程序代码 续4 /读取矩形宽度 public int getRectWidth() return m_rectW; /设置矩形高度 public void setRectHeight(int h) m_rectH = h; /读取矩形高度 public int getRectHeight() return m_rectH; /设置间隙 public void setGap(int gap) m_gap = gap; protected void onDraw(Canvas c) /设置整个背景形状 if (m_data !

33、= null) int w = m_data00.getWidth(); int h = m_data00.getHeight(); if (w = 0 | h = 0) int totalW = getWidth(); int totalH = getHeight(); w = totalW / m_data0.length; h = totalH / m_data.length; if (w > h) w = h; else h = w; totalW = w * m_data0.length; totalH = h * m_data.length; setMeasuredDimen

34、sion(totalW, totalH);/设置当前view大小 课 程 设 计 说 明 书6程序代码 续5 for (int i = 0; i < m_data.length; i+) Rectangle row = m_datai; for (int j = 0; j < row.length; j+) Rectangle tempRect = rowj; int left = w * j; int top = h * i; int right = left + w - m_gap; int bottom = top + h - m_gap; Rect tempR = new

35、Rect(left, top, right, bottom); Paint p = new Paint(); p.setColor(tempRect.getColor(); p.setStyle(Paint.Style.FILL); c.drawRect(tempR, p); Paint p = new Paint(); p.setColor(Color.DKGRAY); p.setStyle(Paint.Style.STROKE); Rect r = new Rect(0, 0, h * m_data0.length -1, w * m_data.length - 1); c.drawRec

36、t(r, p); Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) if (m_data != null) int w = m_data00.getWidth(); int h = m_data00.getHeight(); if (w != 0 && h != 0) int width = h * m_data0.length; int height = w * m_data.length; setMeasuredDimension(width, height);课 程

37、 设 计 说 明 书6程序代码 续6 else int totalW = getWidth(); int totalH = getHeight(); w = totalW / m_data0.length; h = totalH / m_data.length; if (w > h) w = h; else h = w; totalW = w * m_data0.length; totalH = h * m_data.length; setMeasuredDimension(totalW, totalH); else super.onMeasure(widthMeasureSpec, heightMeasureSpec); public void clear() if (m_data != null) for (int i = 0; i < m_data.length; i+) Rectangle row = m_datai; for (int j = 0; j < row.length; j+) Rectangle rect = rowj; rect.setSolid(false); rec

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论