admin 管理员组

文章数量: 887018


2024年3月1日发(作者:如何调用webservice)

淮 海 工 学 院 计算机工程学院

课程设计报告

设计名称: 嵌入式软件课程设计

姓 名: 学 号:

专业班级:

系 (院): 计算机工程学院

设计时间:

设计地点: 硬件综合室

指导教师评语:

成绩:«成绩»

«评语»

签名:

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.程序代码

//直线型的源代码

package ;

import ;

//长棒形状的设置

public class Bar extends ShapeAbstract {

private static final long

serialVersionUID = -79742149L;//序列号的时候,被序列化的类要有一个唯一标记。

private final static int

COLOR = ;设置颜色为蓝色

{

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_(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_(data);

}

public String toString() {

return "Bar";

}

}

课 程 设 计 说 明 书

6.程序代码 续1

//”山“型源代码

package ;

import ;

public class Hill extends ShapeAbstract {

private static final long

serialVersionUID = 16338610L;唯一的序列号

private final static int

COLOR = ;设置颜色为绿色

{

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_(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_(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_(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_(data);

}

public String toString() {

return "Hill"; }}

//田字型源代码

package ;

import ;

public class Square extends ShapeAbstract {

private static final long

serialVersionUID = 38700871L;//唯一的序列号

private final static int

COLOR = ;设置颜色为黄色

{

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_(data);

}

public String toString() {

return "Square";

}

}

课 程 设 计 说 明 书

6.程序代码 续3

package ;

import gle;

import ;

import t;

import ;

import ;

import ;

import ;

import uteSet;

import ;

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

if (w > h) {

w = h;

} else {

h = w; }

totalW = w * m_data[0].length;

totalH = h * m_;

setMeasuredDimension(totalW, totalH);//设置当前view大小

}

课 程 设 计 说 明 书

6.程序代码 续5

for (int i = 0; i < m_; i++) {

Rectangle[] row = m_data[i];

for (int j = 0; j < ; 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();

or(or());

le();

ct(tempR, p);

}

}

Paint p = new Paint();

or();

le();

Rect r = new Rect(0, 0, h * m_data[0].length -1, w * m_ - 1);

ct(r, p);

}

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

{

if (m_data != null) {

int w = m_data[0][0].getWidth();

int h = m_data[0][0].getHeight();

if (w != 0 && h != 0) {

int width = h * m_data[0].length;

int height = w * m_;

setMeasuredDimension(width, height);

课 程 设 计 说 明 书

6.程序代码 续6

} else {

int totalW = getWidth();

int totalH = getHeight();

w = totalW / m_data[0].length;

h = totalH / m_;

if (w > h) {

w = h;

} else {

h = w;

}

totalW = w * m_data[0].length;

totalH = h * m_;

setMeasuredDimension(totalW, totalH);

}

} else {

ure(widthMeasureSpec, heightMeasureSpec);

}

}

public void clear() {

if (m_data != null) {

for (int i = 0; i < m_; i++) {

Rectangle[] row = m_data[i];

for (int j = 0; j < ; j++) {

Rectangle rect = row[j];

id(false);

or(T_COLOR);

}

}

}

}

}

课 程 设 计 说 明 书

7.主要参考文献:

[1]杨丰盛. Android应用开发揭秘[M]. 北京: 机械工业出版社, 2010.1

[2]刘新. Java开发技术大全[M]. 北京: 清华大学出版社, 2009.2

[3]李华明. Android游戏编程之从零开始[M]. 北京: 清华大学出版社, 2011.10

[4]吴亚峰, 苏亚光. Android游戏开发大全[M]. 北京: 人民邮电出版社, 2012.1

[5]王世江, 佘志龙, 陈昱勋, 郑名杰. Google Android SDK开发范例大全[M]. 北京: 人民邮电出版社, 2011.11

[6]靳岩, 姚尚朗. Android开发入门和实践[M]. 北京: 人民邮电出版社, 2009.7

[7]李刚. 疯狂Android讲义[M]. 北京: 电子工业出版社, 2009

[8]盖索林. Google Android开发入门指导[M]. 北京: 人民邮电出版社, 2007

[9]康德尔. Android移动应用开发从入门到精通[M]. 北京: 人民邮电出版社,

2007

[10]傅曦. 手机游戏开发精粹[M]. 北京: 人民邮电出版社, 2008

[11]吴起. 手机产业与产品[M]. 北京: 邮电大学出版社, 2003

8、设计体会

为期三周的嵌入式软件开发课程设计终于结束了,通过这次课程设计,使我熟悉了嵌入式软件开发的流程和eclipse集成开发环境,并且对Java语言有了更深的理解,例如对构造方法,抽象类更加的熟悉了,为了顺利完成这次课程设计,我复习了Java的一些基本语法,并且对这学期所学的嵌入式软件开发即安卓程序的开发理解的更加透彻了,特别是对一个安卓工程的结构更加清楚,知道了每个文件夹里对应着什么类型和功能的文件。这次课程设计是分小组进行的,我主要是负责游戏的形状视图以及各种方块的形状定义,所以对页面布局这一块的内容有了更深的理解,还是学到的很多的安卓知识,尤其注意到了安卓和Java直接的语法还是有很大的区别的,开始我以为是一样的,但是通过这次课程设计,发现它们之间还是有很大的不同,通过上网查找资料,也学到了很多,遇到问题,要善于利用互联网,当今是网络的时代,网上有海量的信息,我们在学习中遇到困难要及时上网查阅资料,这样我们才能学到更多的课本之外的知识。

这次课程设计也让我知道了,我们学习不能只专注于教科书,因为上面所讲的面太窄,应该多去图书馆或是网上查资料,这样我们才能学得更全面,才能够更加专研进去。

课 程 设 计 说 明 书

8、设计体会

课程设计是一个重要的教学环节,通过课程设计使我们了解到一些实际与理论之间的差异。通过课程设计不仅可以巩固专业知识,为以后的工作打下了坚实的基础,而其还可以培养和熟练使用资料,运用工具书的能力,把我们所学的课本知识与实践结合起来,起到温故而知新的作用。而且因为是分组来做,同时也锻炼了我们的团队协作能力,有利于以后的工作和发展。

//对应的源代码也可以进我的主页下载


本文标签: 方块 游戏 设置 开发 课程设计