物件所对应的接触面的方块位置为被占用状态 (MAP_STATE_NOT_EMPTY=1)来确定,利用数组 InterFace[74][4]记录 1~7 种下坠物的 1~4 种形态的接触面信息。 统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值决 定分数的多少,程序统计分数是:消一行得 100 分,同时消 2 行得 400 分,销掉 x
行,则分 数为:x*(x*100)。如果总分数达到过关条件就过关,改变游戏速度,游戏初始化,开启新 的一关,然后再加载方块。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。
4.2 中断操作流程的实现
(1) 处理键盘事件 关于按键命令消息的响应,可以通过对 WM_KEYDOWN 消息的处理函数进行截获并 重写来实现,下面是对该处理函数 OnKeyDown()的重写。 // 功能:处理用户的输入,方块的左,右移,加速及变形 void CSkyblue_RectView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { switch(nChar) { case VK_LEFT: RectArrow(LEFT); break; case VK_RIGHT: RectArrow(RIGHT); break; case VK_UP: RectChange(); break; case VK_DOWN: RectArrow(DOWN); break; } CView::OnKeyDown(nChar, nRepCnt, nFlags);
} 4.3 变形的实现
当按下向上键时,将会执行方块变化事件(change())。常见的方块有 7 种(长条形、Z 字形、反 Z 形、田字形、7 字形、反 7 形、T 字型),所有图形都是用两个一维数组来统计它 的横坐标和纵坐标,每个方块有 4 种不同的变化形状。 例计算变形后的小方块的坐标和显示的状态值 //变形后位置在数组中的存放顺序仍需遵循先左后右,在同一列中先上后下
xx1=x1; xx2=x2; xx3=x3; xx4=x4; yy1=y1; yy2=y2; yy3=y3; yy4=y4; switch(m_currentRect) { case 1: xx1=x1+1; yy1=y1-1; xx3=x3-1; yy3=y3+1; xx4=x4-2; yy4=y4+2; m_lscurrentRect = 11; break; case 11: xx1=x1-1; yy1=y1+1; xx3=x3+1; yy3=y3-1; xx4=x4+2; yy4=y4-2; m_lscurrentRect = 1; break; …… //省略部分为同类实现的变形后小方块坐标的计算代码 case 73: xx2=x2+1; yy2=y2-1; xx3=x3+2; yy3=y3-2; xx4=x4-1; yy4=y4-1; m_lscurrentRect = 7; break; }
4.4 游戏区域绘图的实现
首先将外部位图文件 rect.bmp 中的位图动态导入(映射)到内存位图里面,根据游戏区域 中的二维数组 GameStatus[MAX_ROW][MAX_COL]中的内部数据将所有数据状态中为被占 用状态 MAP_STATE_NOT_EMPTY 的小方块区域用指定的小方块图样类型来填充,然后将 已经绘制好的游戏区域图像一次性的拷贝到与屏幕关联的设备环境中,从而达到屏幕的显 示。
4.5 功能的完善
为了使得游戏功能更加健全,另外为用户提供了一些附加功能,如表 4.5.1 所示。 表 4.5.1 功能名称 游戏等级选择 选项 初级......顶级 附加功能描述
列表 其他描述 对游戏快慢难度的设定
功能名称 方块图案样式选择 游戏区域大小选择 网格的选用 背景音乐的选用
选项 深蓝......条纹 小、中、大 有、无 有、无
其他描述 对下坠物的小方块图案样式选择 对游戏区域的行列数选择 是否需要在游戏区域绘制网格 在游戏过程中是否播放背景音乐
先将这些目标功能通过资源编辑器在主菜单条进行添加,将前面已有的菜单选项补 全,再通过 ClassWizard
添加对应的响应处理函数。其最终效果如图
1
图 4..5.2 游戏设置 游戏是用来给大家娱乐的,所以要能在使用的过程中给大家带来快乐,消除大家的疲 劳,所以我在游戏中添加了漂亮的场景和动听的