收藏 分销(赏)

嵌入式软件开发课程设计-俄罗斯方块游戏.doc

上传人:w****g 文档编号:2076439 上传时间:2024-05-15 格式:DOC 页数:26 大小:2.40MB 下载积分:10 金币
下载 相关 举报
嵌入式软件开发课程设计-俄罗斯方块游戏.doc_第1页
第1页 / 共26页
嵌入式软件开发课程设计-俄罗斯方块游戏.doc_第2页
第2页 / 共26页


点击查看更多>>
资源描述
______________________________________________________________________________________________________________ 淮 海 工 学 院 计算机工程学院 课程设计报告 设计名称: 嵌入式软件课程设计 姓 名: 学 号: 专业班级: 系 (院): 计算机工程学院 设计时间: 设计地点: 硬件综合室 成绩:«成绩» 指导教师评语: «评语» 签名: 2015年1 月 日 课 程 设 计 说 明 书 1.课程设计题目: 基于Android环境的俄罗斯方块游戏设计 2.课程设计内容: 俄罗斯方块是家喻户晓的益智小游戏,它由俄罗斯人阿列克谢∙帕基特诺夫(Alexey Pazhitnov)在1984年6月利用空暇时间编写的游戏程序,故此得名。俄罗斯方块的基本规则是移动、旋转和摆放游戏随机产生的各种方块,使之排列成完整的一行或多行并且消除得分。它看似简单却变化无穷,俄罗斯方块上手极其简单,且游戏过程变化无穷,作为游戏本身很有魅力,但是要熟练掌握其中的操作和摆放技巧,难度却不低。此软件给用户提供了一个展现自己高超技艺的场所,在这里,它不仅放松自己,还能感受到游戏中的乐趣。 游戏区域会从顶部不断落下8种下坠物的一种,游戏区域右上角有一个区域可以显示下一个下坠物的形状,玩家可以控制下坠物移动、旋转和一键到底,通过玩家的操作,下坠物在游戏区域以“摆积木”的形式出现。下坠物在一行或多行堆满后就可以自动消除,消行后会得到相应的分数,如果当前下坠物堆积至窗口顶端,则游戏结束。 3.课程设计目的: 嵌入式系统的教学可以分为课堂理论教学、实验教学和课程设计三个层面。这三个层面的目标有所不同。理论学习的主要目标是掌握嵌入式系统的一般原理,例如实时调度策略、自动控制算法等;实验教学的主要目的是掌握嵌入式系统的主要开发流程和基本方法,例如开发工具链的使用、小型应用开发等;课程设计的主要目的是通过实际的嵌入式应用系统开发实例掌握嵌入式系统设计和开发的技能和专门知识,积累实践和工程经验。 课 程 设 计 说 明 书 4.课程设计要求: 开发一个简单的俄罗斯方块游戏,并达到以下要求: 1、开始游戏随机产生方块并自动下落。右上角2*2预示框显示即将出现的图形; 2、按“||”键可以暂停游戏,按”GO”键开始游戏; 3、点击屏幕变换方块角度,触屏向左(右)实现左(右)移,向下点击加速下移; 4、系统能够正确判断是否满行,并对已满的行实现消行并加分。 5.设计详细说明 (1) 总体设计思路及算法描述 (1)方块类:每个方块都有自己的ID、形状、颜色。每个方块都限定在4*4的矩形区域内变幻形状。以此矩形区域的左上方端点为坐标移动。在方块类中定义多个私有数组,将每种ID的方块的形状数据存储好,这样产生一个方块时只需要提供其ID即可。 移动:在指定的游戏区域中移动,包括向左、右、下移动。以一个单元为单位。触屏向左(右)轻微移动实现左(右)移一格,触屏向左(右)长移实现左(右)移到最左(右)端,触屏向下轻微移动加速下移一格,触屏向下长移加速下移至底端。如果可以移动,则修改参考点的位置,并在指定的游戏区域中重新填充自己,返回是否移动成功的信息。 旋转:为了处理方块的旋转,我们不能只记录提供的8中方块形状,而应该把它们旋转后产生的每种形状都认为是一种不同的方块。这时候我们只处理一个方向的旋转,即顺时针旋转方式。然后在指定的区域中重新填充自己。 (2)游戏区域类:可以用一个二维数组方便的实现。 状态:游戏未开始;游戏已开始;游戏结束。 方块落地:先执行清行操作,获得活动方块占用了哪些行的信息,然后逐行进行扫描:对每一行,检查其10列单元格是否都已经被填充,如果没有,则继续检查下一行,如果是,则将该行以上的游戏区域整体下移一行,并在最上面一行填充一行空格。 执行完清行操作后,要产生下一个方块,方块类似于“开始”命令中的步骤,此时要把活动方块指定为新产生的方块,而且还有检查新产生的方块是否能成功填充,如果填充失败,则游戏结束。 课 程 设 计 说 明 书 5.设计详细说明 续1 (2) 硬件原理图及相关说明 Android 有丰富的功能,因此很容易与桌面操作系统混淆。Android 是一个分层的环境,构建在 Linux 内核的基础上,它包括丰富的功能。UI 子系统包括:窗口,视图。 用于显示一些常见组件(例如编辑框、列表和下拉列表)的小部件。 Android 包括一个构建在 WebKit 基础上的可嵌入浏览器,iPhone 的 Mobile Safari 浏览器同样也是以 WebKit 为基础。Android 提供多种连接选项,包括 WiFi、蓝牙和通过蜂窝(cellular)连接的无线数据传输(例如 GPRS、EDGE 和 3G)。Android 应用程序中一项流行的技术是链接到 Google 地图,以便在应用程序中显示地址。Android 软件栈还提供对基于位置的服务(例如 GPS)和加速计的支持,不过并不是所有的 Android 设备都配备了必需的硬件。另外还有摄像支持。过去,移动应用程序努力向桌面应用程序看齐的两个领域分别是图形/媒体和数据存储方法。Android 通过提供对 2D 和 3D 图形的内置支持,包括 OpenGL 库,解决了图形方面的挑战。由于 Android 平台包括流行的开源 SQLite 数据库,因此缓解了数据存储的负担。 应用程序架构。如前所述,Android 运行在 Linux 内核上。Android 应用程序是用 Java 编程语言编写的,它们在一个虚拟机(VM)中运行。需要注意的是,这个 VM 并非您想象中的 JVM,而是 Dalvik Virtual Machine,这是一种开源技术。每个 Android 应用程序都在 Dalvik VM 的一个实例中运行,这个实例驻留在一个由 Linux 内核管理的进程中。 (图1) 课 程 设 计 说 明 书 5.设计详细说明 续2 (3) 软件流程图及其说明 (图2) 1游戏方块控制功能 2游戏显示更新功能 3游戏速度更新功能 4游戏积分等级功能 5游戏规则 (图3) (图4) 课 程 设 计 说 明 书 5.设计详细说明 续3 (4) 功能模块设计说明 我主要负责游戏的形状视图以及各种方块的形状定义 a.俄罗斯方块中的“山”型: 在这个4*4的方块中,定义一个 (图4.1) 二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data[0][2], data[1][1],data[1][2],data[1][3]从而得到如上图形,并设置成绿色。 其具体的实现代码如下: data[0][2].setSolid(true); data[0][2].setColor(COLOR); data[1][1].setSolid(true); data[1][1].setColor(COLOR); data[1][2].setSolid(true); data[1][2].setColor(COLOR); data[1][3].setSolid(true); data[1][3].setColor(COLOR); 同理可以得出“山”型的另外三种形状 b. 俄罗斯方块中的“直线”型 在这个4*4的方块中,定义一个 (图4.2) 二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data[0][0], data[0][1],data[0][2],data[3][3]从而得到如上图形,并设置成蓝色。 其具体的实现代码如下 : data[0][0].setSolid(true); data[0][0].setColor(COLOR); data[0][1].setSolid(true); data[0][1].setColor(COLOR); data[0][2].setSolid(true); data[0][2].setColor(COLOR); data[0][3].setSolid(true); data[0][3].setColor(COLOR); 同理可以得出“直线”型的另外一种形状 c. 俄罗斯方块中的“N”型 在这个4*4的方块中,定义一个 (图4.3) 二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data[0][2], data[1][1],data[1][2],data[2][1]从而得到如上图形,并设置成粉红色。 课 程 设 计 说 明 书 5.设计详细说明 续4 其具体的实现代码如下 : data = getEmptyShape(); data[0][2].setSolid(true); data[0][2].setColor(COLOR); data[1][1].setSolid(true); data[1][1].setColor(COLOR); data[1][2].setSolid(true); data[1][2].setColor(COLOR); data[2][1].setSolid(true); data[2][1].setColor(COLOR); 同理可以得出“N”型的另外一种形状 d. 俄罗斯方块中的“反N”型 在这个4*4的方块中,定义一个 (图4.4) 二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data[0][1], data[1][1],data[1][2],data[2][2]从而得到如上图形,并设置成浅绿色。 其具体的实现代码如下 : data[0][1].setSolid(true); data[0][1].setColor(COLOR); data[1][1].setSolid(true); data[1][1].setColor(COLOR); data[1][2].setSolid(true); data[1][2].setColor(COLOR); data[2][2].setSolid(true); data[2][2].setColor(COLOR); 同理可以得出“反N”型的另外一种形状 e. 俄罗斯方块中的“左拐杖”型 在这个4*4的方块中,定义一个 (图4.5) 二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data[1][1], data[1][2],data[2][2],data[3][2]从而得到如上图形,并设置成灰色。 其具体的实现代码如下 : data[1][1].setSolid(true); data[1][1].setColor(COLOR); data[1][2].setSolid(true); data[1][2].setColor(COLOR); data[2][2].setSolid(true); data[2][2].setColor(COLOR); data[3][2].setSolid(true); data[3][2].setColor(COLOR); 同理可以得出“左拐杖”型的另外三种形状 课 程 设 计 说 明 书 5.设计详细说明 续5 f. 俄罗斯方块中的“右拐杖”型 在这个4*4的方块中,定义一个 (图4.6) 二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data[1][1], data[1][2],data[2][1],data[3][1]从而得到如上图形,并设置成红色。 其具体的实现代码如下 : data = getEmptyShape(); data[1][1].setSolid(true); data[1][1].setColor(COLOR); data[1][2].setSolid(true); data[1][2].setColor(COLOR); data[2][1].setSolid(true); data[2][1].setColor(COLOR); data[3][1].setSolid(true); data[3][1].setColor(COLOR); 同理可以得出“右拐杖”型的另外三种形状 g. 俄罗斯方块中的“田”型 在这个4*4的方块中,定义一个 (图4.7) 二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data[0][1], data[0][2],data[1][1],data[1][2]从而得到如上图形,并设置成黄色。 其具体的实现代码如下 : data[0][1].setSolid(true); data[0][1].setColor(COLOR); data[0][2].setSolid(true); data[0][2].setColor(COLOR); data[1][1].setSolid(true); data[1][1].setColor(COLOR); data[1][2].setSolid(true); data[1][2].setColor(COLOR); h. 俄罗斯方块中的“点”型 在这个4*4的方块中,定义一个 (图4.8) 二维数组,通过设置里面的小正方形的颜色来得到对应的图形,通过设置data[0][2], 从而得到如上图形,并设置成灰色。 其具体的实现代码如下 : data[0][2].setSolid(true); data[0][2].setColor(COLOR); 课 程 设 计 说 明 书 5.设计详细说明 续6 (5) 调试说明 由于我主要负责游戏的形状视图,对界面设计和编程,在编程过程中,如何实现对界面的设计,遇到了很多问题,例如,怎么把屏幕分成20*10的小方格,开始尝试了很多方法,最终通过设置若干条间隙来实现此布局,正如开始时的界面: (图5.1) 然后关于如何实现8种方块的形状也遇到了一些问题,怎样把8种形状表示出来,主要通过定义小方块的颜色来实现,用不同的颜色来表示小方块,定义一个二维的数组,然后把小方块定义出来,并且附上不同的颜色,这样就能够区分开来了,而且这样还能够很容易的实现小方块的变形以及下降,从而为后面的功能实现提供了可行的措施,下图是其代码的声明: (图5.2) 课 程 设 计 说 明 书 5.设计详细说明 续7 根据调试后,能够正确的运行,如下图所示: (图5.3) 最后关于菜单的设计,一个好的嵌入式软件,要有其好的说明,我主要设计了四个菜单,分别是排行榜,游戏操作,关于作者,以及退出。其界面如图所示: (图5.4) 课 程 设 计 说 明 书 5.设计详细说明 续8 其中排行榜里有分数.日期,时间,玩家姓名等信息,如下图所示: (图5.5) 游戏操作里面有俄罗斯方块的游戏说明,如下图所示: (图5.6) 课 程 设 计 说 明 书 5.设计详细说明 续9 最后是关于作者的显示内容,如下图所示: (图5.7) (6) 用户说明 (1)开始游戏随机产生方块并自动下落。右上角2*2预示框显示即将出现的图形;  (2)按“||”键可以暂停游戏,按”GO”键开始游戏;  (3)点击屏幕变换方块角度,触屏向左(右)轻微移动实现左(右)移一格,触屏向左(右)长移实现左(右)移到最左(右)端,触屏向下轻微移动加速下移一格,触屏向下长移加速下移至底端; (4)系统能够正确判断是否满行,并对已满的行实现消行并加分。 同时消除一行时得一分,同时消除二行时得三分, 同时消除三行时得六分,同时消除四行时得十分。 (5)游戏升级:每得50分,游戏升一级,方块下降速度增加。 (6)选择菜单 a游戏操作b退出 c作者 d 排行榜:游戏结束时分数,玩家姓名,IP号和日期将记录进排行榜 课 程 设 计 说 明 书 6.程序代码 Bar.java //直线型的源代码 package 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(); data[0][0].setSolid(true); data[0][0].setColor(COLOR); data[0][1].setSolid(true); data[0][1].setColor(COLOR); data[0][2].setSolid(true); data[0][2].setColor(COLOR); data[0][3].setSolid(true); data[0][3].setColor(COLOR); m_shapes.add(data); //设置直线竖条 data = getEmptyShape(); data[0][1].setSolid(true); data[0][1].setColor(COLOR); data[1][1].setSolid(true); data[1][1].setColor(COLOR); data[2][1].setSolid(true); data[2][1].setColor(COLOR); data[3][1].setSolid(true); data[3][1].setColor(COLOR); m_shapes.add(data); } public String toString() { return "Bar"; } } 课 程 设 计 说 明 书 6.程序代码 续1 Hill.java //”山“型源代码 package com.ding.shape; import android.graphics.Color; public class Hill extends ShapeAbstract { private static final long serialVersionUID = 1005482779396338610L;唯一的序列号 private final static int COLOR = Color.GREEN;设置颜色为绿色 { Rectangle[][] data = null; data = getEmptyShape(); data[0][2].setSolid(true); data[0][2].setColor(COLOR); data[1][1].setSolid(true); data[1][1].setColor(COLOR); data[1][2].setSolid(true); data[1][2].setColor(COLOR); data[1][3].setSolid(true); data[1][3].setColor(COLOR); m_shapes.add(data); data = getEmptyShape(); data[0][2].setSolid(true); data[0][2].setColor(COLOR); data[1][2].setSolid(true); data[1][2].setColor(COLOR); data[2][2].setSolid(true); data[2][2].setColor(COLOR); data[1][3].setSolid(true); data[1][3].setColor(COLOR); m_shapes.add(data); data = getEmptyShape(); data[1][1].setSolid(true); data[1][1].setColor(COLOR); data[1][2].setSolid(true); data[1][2].setColor(COLOR); data[1][3].setSolid(true); data[1][3].setColor(COLOR); data[2][2].setSolid(true); data[2][2].setColor(COLOR); 课 程 设 计 说 明 书 6.程序代码 续2 m_shapes.add(data); data = getEmptyShape(); data[0][2].setSolid(true); data[0][2].setColor(COLOR); data[1][2].setSolid(true); data[1][2].setColor(COLOR); data[2][2].setSolid(true); data[2][2].setColor(COLOR); data[1][1].setSolid(true); data[1][1].setColor(COLOR); m_shapes.add(data); } public String toString() { return "Hill"; }} Square.java //田字型源代码 package com.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(); data[0][1].setSolid(true); data[0][1].setColor(COLOR); data[0][2].setSolid(true); data[0][2].setColor(COLOR); data[1][1].setSolid(true); data[1][1].setColor(COLOR); data[1][2].setSolid(true); data[1][2].setColor(COLOR); m_shapes.add(data); } public String toString() { return "Square"; } } 课 程 设 计 说 明 书 6.程序代码 续3 ShapeView.java package com.ding.tetris; import com.ding.shape.Rectangle; import 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; //矩形的宽 private 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 setRectWidth(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 != null) { int w = m_data[0][0].getWidth(); int h = m_data[0][0].getHeight(); if (w == 0 || h == 0) { int totalW = getWidth(); int totalH = getHeight(); w = totalW / m_data[0].length; h = totalH / m_data.length; if (w > h) { w = h; } else { h = w; } totalW = w * m_data[0].length; totalH = h * m_data.length; setMeasuredDimension(totalW, totalH);//设置当前view大小 } 课 程 设 计 说 明 书 6.程序代码 续5 for (int i = 0; i < m_data.length; i++) { Rectangle[] row = m_data[i]; for (int j = 0; j < row.length; j++) { Rectangle tempRect = row[j]; int left = w * j; int top = h * i; int right = left + w - m_gap; int bottom = top + h - m_gap; Rect tempR = new Rect(left, top, right, bottom); Paint p = new Paint(); p.setColor(tempRect.getColor());
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服