俄罗斯方块C++课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
题目:基于C++俄罗斯方块
学院:
专业:
学号:
姓名:
二○一三年十二月
经典小游戏设计-俄罗斯方块
一、需求分析。
1.1、游戏需求
随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T 字型)下落填充给定的区域,若填满一条便消掉,若在游戏中各形状填满了给定区域,为输者,弹出相应提示。
1.2、游戏界面需求
良好的用户界面,有关信息显示(如操作方法、等级等)。让方块在一定的区域内运动和变形,该区域用一种颜色表明,即用一种颜色作为背景,本游戏的背景设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。而不同的方块用不同的着色表示,使游戏界面更加清晰、有条理。消层时采用一定的时间延迟,增加视觉消行的感官效果。
1.3、游戏方块需求
良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、L字形、反L形、T字型)以及另外本程序另外加入的点形方块,各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。为体现游戏的趣味性和扩展性,本游戏象征性的增加了点形方块,其他更多形状的方块可用类似方法增加。
1.4、游戏控制的需求
游戏控分为多个方面,包括画面绘制,控制命令的获取,控制命令的分配、控制命令的处理,方块的绘制,方块的移动,方块的旋转,方块下落和消层以及计分等。对各个命令的合理处理和综合控制十分重要,一旦出错可能导致整个程序的崩溃,因此需要小心设计。
二、系统设计。
2.1、程序流程图:
2.2、游戏设计概述
从整体上而言,在该游戏可设计一个方块类,其中包括对方块的信息描述(如:ID)、方块的操作(如:旋转、下沉)。再设计一个控制类,实现各种控制(如:获取控制信号,分发控制信号)。另定义一个游戏区类,用以处理游戏区绘制等内容。框图如下:
方块类(GAME_BLOCK)游戏区类(Window)
BLOCKINFO g_CurBlock; Private: 无
Private:
在主函数中(按照2.1中框图),先通过控制类初始化游戏,再通过随机时间函数获得一个随机数,该随机数确定一个方块,即用该随机数产生一个ID从而确定产生的为方块。然后从键盘取得各种操作信号,通过控类函数对操作信号进行分发、处理,进而控制方块的行为改变。与此同时,监控游戏区中已有方块的状态,一旦满足消行即进行消行控制,同时进行计分和等级划分,而如果游戏区已满则游戏结束,弹出提示。而对界面和方块的展现主要通过第三方软件EasyX实现,通过其画图位置的改变与时间的结合达到方块视觉移动的效果。
2.3、定义方块的数据结构
方块是本游戏的基本要素,对于方块的设计,本游戏用4*4的矩阵画出来,在相
应的位置置为‘1’和‘0’以实现各种方块的形状,以“立L形”为例如下:
而在程序设计中则赋予各种基本方块一个不同的十六进制ID即可表示该方块,如“立7形”其ID为[0x4460],再与其其他变形组合和着色分配即可得到各种L形ID的集合{0x4460, 0x02E0, 0x0622, 0x0740,MAGENTA};其他各种方块类似设计。具体清单如下:
{ {0x0F00, 0x4444, 0x0F00, 0x4444, RED}, // I
{0x0660, 0x0660, 0x0660, 0x0660, BLUE}, // 口
{0x4460, 0x02E0, 0x0622, 0x0740, CYAN}, // L 蓝绿色
{0x2260, 0x0E20, 0x0644, 0x0470, GREEN}, // 反L
{0x0C60, 0x2640, 0x0C60, 0x2640, BROWN}, // Z
{0x0360, 0x4620, 0x0360, 0x4620, YELLOW}, // 反Z
{0x4E00, 0x4C40, 0x0E40, 0x4640, MAGENTA}}; // T 品红
2.4、方块的变形
方块要实现变形,其实就是通过EasyX画出不同的图形来实现的,当然乱画是不行的,而为了控制其变形的情况,必须设定相应的图形描述,本程序使用的是不同图形的不同ID码表示的方法来实在方块的描述的。能过键盘接收变形指令(即向上键),将所得信号传递给信号接收函数,再通过信号处理函数改变当前方块的ID值,最后根据新的ID值画出新的图形,此时即实在了方块的变形。
2.5、定时处理机制
为了提高游戏的易控性和自动性,定时机制是很有必要的。经过定时器的设置后,这里通过利用控制程序跳到定时器的时间的处理函数去实现,当固定时间片间隔到达后,先检测当前下坠物是否已经到达了底部,不是则进行下坠物向下移动一个单位的
操作,是则到底后产生一个新的“下一个下坠物”,并代替旧的,将原先旧的“下一个下坠物”用作当前激活状态下正在使用的下坠物,并对使用后的一些状态进行检测:是否马上到达底部,使则进行销行操作;是否在到达底部的同时到达游戏区域的顶部,从而判定游戏是否因违规而结束,弹出相应对话框供用户选择是否继续重新开始。
图 3.2.2装载方块
视图类通过不同十六进制ID来记录下坠物的类型,共有七种形状,并从7种方块中随机抽取图形。而ID除了记录下坠物的类型外,还需记录其当前的变形状态。
在产生新的下一个下坠物前,需要先将当前状态物的记录和旧的下一个下坠物保存下来,然后用随机函数Random()产生一个最大值不大于指定值的随机正整数,将这个新生成的正整数用作新的“下一个下坠物”的形状值。
三、关键代码描述。
#include
#include
#include
/////////////////////////////////////////////
// 定义常量、枚举量、结构体、全局变量
/////////////////////////////////////////////
#define WIDTH 10 // 游戏区宽度
#define HEIGHT 22 // 游戏区高度
#define UNIT 20 // 每个游戏区单位的实际像素
// 定义操作类型
enum CMD
{
CMD_ROTATE, // 方块旋转
CMD_LEFT, CMD_RIGHT, CMD_DOWN, // 方块左、右、下移动
CMD_SINK, // 方块沉底
CMD_QUIT // 退出游戏
};
// 定义绘制方块的方法
enum DRAW
{
SHOW, // 显示方块
CLEAR, // 擦除方块
FIX // 固定方块
};
// 定义七种俄罗斯方块
struct BLOCK
{
WORD dir[4]; // 方块的四个旋转状态
COLORREF color; // 方块的颜色
} g_Blocks[7] = { {0x0F00, 0x4444, 0x0F00, 0x4444, RED}, // I
{0x0660, 0x0660, 0x0660, 0x0660, BLUE}, // 口
{0x4460, 0x02E0, 0x0622, 0x0740, CYAN}, // L 蓝绿色
{0x2260, 0x0E20, 0x0644, 0x0470, GREEN}, // 反L
{0x0C60, 0x2640, 0x0C60, 0x2640, BROWN}, // Z
{0x0360, 0x4620, 0x0360, 0x4620, YELLOW}, // 反Z
{0x4E00, 0x4C40, 0x0E40, 0x4640, MAGENTA}}; // T 品红// 定义当前方块、下一个方块的信息
struct BLOCKINFO
{
byte id; // 方块 ID
char x, y; // 方块在游戏区中的坐标
byte dir:2; // 方向
} g_CurBlock, g_NextBlock;
// 定义游戏区
BYTE g_World[WIDTH][HEIGHT] = {0};