和一些基本的操作函 数。对于操作函数,可以把它们分为内部实现的基本核心操作(如判断操作)以及明显提供 给外部使用的整体模块外部操作(如状态控制操作)。而内部的基本操作又可以分为判断操 作和执行操作这样两种类型[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 处理方块到达图 将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对 它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已 经到达了底部,可以通过当前下坠