课 程 设 计
课程名称: 班
程 序 设 计
课题名称: 俄罗斯方块游戏的设计 级: 计算机 09-1BJ 班 曾灵芝(14092400558) 甘靖 完成人: 指导教师:
湖南理工计算机 2011 年 4 月 14 日
用 VC++实现俄罗斯方块的程序设计 一、课程设计的目的与要求
1.1 课程设计的目的 课程设计的目的
综合运用所学知识,熟练掌握 VC++程序设计的编码与 MFC 框架结构 。
1.2 课程设计的要求
要求用VC++设计与实现俄罗斯方块游戏。要求包括系统的需求分析;系统总框 图及每个模块的设计分析;MFC 应用程序架构;框架的扩展;算法;游 戏的内部实现;游戏区域绘图的实现;系统存在的问题及错误处理;列出所有定义的函 数及说明;附上程序源代码。
二、设计正文
2.1 需求分析
2.1.1 游戏需求 随机给出不同的形状 (长条形、Z 字形、反 Z 形、田字形、7 字形、反 7 形、T 字 型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关, 设置六关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。 游戏功能要求如下: 2.2.2 游戏界面需求 游戏界面需求: 良好的用户界面,有关数显示和分数显示。让方块在一定的区域内运动和变形, 该区域用一种颜色表明,既用一种颜色作为背景,最好设为黑色。还需用另一种颜色把 黑色围起来,宽度适中,要实现美感。 2.1.3 游戏形状 方块 需求 游戏形状(方块 需求: 方块)需求 良好的方块形状设计,绘制七种常见的基本图形(长条形、Z 字形、反 Z 形、田字 形、7 字形、反 7 形、T 字型),各个方块要能实现它的变形,可设为顺时针或逆 时 针变形,一般为逆时针。
2.2 算法分析
2.2.1 程序流程图 开始
到达底部
销行操作
生成下一个下坠物 下降一个单位
将新生的下坠物代替旧的“下一 个下坠物“
将旧的“下一个下坠物”用作当前 下坠物
到达底部
销行操作
到达底部, 游戏结束
游戏结束处理
结束
1.Main()
2.Rectview()
13.GameEnd( 游戏结束 6.invalidatecurren
重新游戏 游戏开始
3.Gamestart()
4.DrawGame 刷新
7.OnTimer() 下一个图行 8.GamePaush
5.RectDown() 达到指定位 10.IsBottom()
否 按键 11.KeyDown(
达到指定位 9.OnDraw() 显示屏幕信 12.RectChang 图 2.2.3 程序运行调用图 按向上键
2.2.2 定义方块的数据结构
对于方块在某一瞬间的位置标识,我们采用一个 4×2 的小数组标识出来,即用 4 个存储单位 空间存储当前下坠物的每一子块的位置,也就是说,用 4 个存储单位空间存储当前下坠物的 每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐 标值(x,
y),而每个方块按照从左到右的方式进行编号,并且在编号过程中对于同一列的方块 (x0,y0) (x1,y1) (x2,y2) (x3,y3) (x0,y0) (x1,y1) (x2,y2) (x3,y3) 实行从上到下进行编号
[2]
。
0
1 2 3
2 3 0 1
图 3.1 方块编号 ActiveStatus[0][0]和 ActiveStatus[0][1]则是第 0 号方块的横坐标 x 和纵坐标 y ; ActiveStatus[2][0]和 ActiveStatus[2][1]则是第 2 号方块的横坐标 x 和纵坐标 y。
2.2.3 游戏设计分析
有前面的功能描述可知,我先虚拟出俄罗斯方块游戏的类对象,并抽象出核心的数据 属性和操作方法等,然后再作细化,最后将整个虚拟类的外壳脱掉,再移植到视图类中去, 其实现如下: CRectGameView : public CView { //内部存取数据结构 int m_stateMap[MAX_ROW][MAX_COL]; //初始化操作 GameInitnal(); //游戏的初始化
//用于判断数据相关状态的操作 IsLeftLimit(); IsRightLitmit(); IsBottom(); IsGameEnd(); //下坠物件是否可向左移动 // //是否已经到达了底部 //是否游戏已经结束
//方块物件下坠过程中的操作 RectChange(); RectDown(); RectArrow(); //状态控制操作 GameStart(); GamePause(); GameEnd(); } 通过上面的代码可以看出,在虚拟类中抽象出了核心的内部数据和一些基本的操作函 数。对于操作函数,可以把它们分为内部实现的基本核心操作(如判断操作)以及明显提供 给外部使用的整体模块外部操作(如状态控制操作)。而内部的基本操作又可以分为判断操 作和执行操作这样两种类型[3]。 //游戏开始 //游戏暂停 //游戏结束 //下坠物件变形 //下坠物件正常下落 //下坠物件方向移动(左,右,下加速)
三 系统设计
3.1 创建界面的主框架
首先建立一个项目工程,名为 skyblue_Rect,并在 AppWizard 的架构选择过程中选择 单文档方式,其他保持默认选项。其项目的架构类视图信息如图所示: 在构架类视图中是MFC基本架构组合:App(应用程序)类、Document(文档)类、 View(视图)类、Frame 框架) ( 类和用于提示关于作者的对话框CAboutDlg类,至于COptionDlg 类是用作俄罗斯方块参数选择的对话框类对象。
3.2 正常流程的设计
3.2.1 定时制机制
从分析游戏的特性可以知道,定时器的产生与生效应该在游戏开始的时候,而在游戏 暂停或者游戏结束时则将已经设定的定时器失效/销亡 (对于暂停的情况,使它销亡,当游戏 从暂停状态又进入游戏状态时候,则重新创建一个定时器并激活它的运作),所以分别在游 戏的开始函数、暂停函数已经结束函数中实现定时器的激活与去激活工作。这里,先在资源 编辑器菜单资源里面添加三个菜单选项,分别是游戏的“开始”、“暂停”、和“结束”,然后利 用ClassWizard直接在视图类对象Cskyblue_RectView中为它们添加空白
的处理函数,具体如 表 2 所示。 3.2.1 菜单选项功能对应表 菜单选项名称 开始游戏 暂停游戏 结束游戏 快捷键 &;S &;P &;E 资源ID ID_GAME_STAT ID_GAME_PAISH ID_GAME_END 响应处理函数 OnGameStart() OnGamePaush() OnGameEnd()
3.2.2 定时处理
经过定时器的设置后,这里通过利用 ClassWizard 跳到定时器到时候的处理函数 OnTimer()去实现,当固定时间片间隔到达后,先检测当前下坠物是否已经到达了底部,不 是则进行 RectDown()下坠物向下移动一个单位的操作,是则到底后产生一个新的“下一个下 坠物”,并代替旧的,将原先旧的“下一个下坠物”用作当前激活状态下正在使用的下坠物, 并对使用后的一些状态进行检测:是否马上到达底部,使则进行销行操作 ;是否在到达底部的同时到达游戏区域的顶部,从而判定游戏是否因违规而结束。 随机抽取一个数
随机数 1 2 3 反Z形 4 5 6 7
一字形
Z 字形
7 字形
反7形
倒T形
田字型
游戏是否 结束 否 保存当前方块坐标
是
游戏结束 调 GameEnd() 关数初始化 返回开始界面
显示方块于屏幕上 图 3.2.2 装载方块 视图类创建了 m_icurrentStatus 和 m_inextStatus 两个成员变量来记录下坠物的类型,共 有七种形状,并从 7 种方块中随机抽取图形。而 m_currentRect 除了记录下坠物的类型外,还 需记录其当前的变形状态,最多用两位表示,第 1 位用作类型标识(1~7),第 2 位用作同种类型的 不同表现方式,最多有 4 种状态(1~4)。 在产生新的下一个下坠物前,需要先将当前状态物的记录和旧的下一个下坠物保存下 来,然后用随机函数 Random()产生一个最大值不大于指定值的随机正整数,将这个新生成 的正整数用作新的“下一个下坠物”的形状值。
四、系统实施
4.1 底部到达的判断与销行的实现
堆积方块,判断接触 面状态及是否得分
1. 判 断 行 满 、 处 理 销 行、堆积方块向下移动
2.统计分数
判断是否过关 否
是
关数增加,游戏 速度将变快。调 用游戏初始化 GameStart() 开 始 新的一关
视图重绘(InvalidateView()) 图 3.2.3 处理方块到达图 将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对 它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已 经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态 (MAP_STATE_NOT_EMPTY=1)来确定,利用数组 InterFace[74][4]记录 1~7 种下坠物的 1~4 种形态
上一篇:
用VC++实现DES加密算法的简略代码_vc代码
下一篇:
路过的时光