北华航天工业学院计算机系制作VC++程序设计项目实践贾振华北华航天工业学院计算机系制作单击此处编辑母版标题样式第6章俄罗斯方块游戏的开发学习目标:1.MFC类之间关系的基本概念2.进行图形的绘制的具体应用3.如果进行图形重绘4.如何响应键盘消息北华航天工业学院计算机系制作单击此处编辑母版标题样式6.1基础知识6.1.1Windows程序工作原理图6-1Windows程序工作原理北华航天工业学院计算机系制作单击此处编辑母版标题样式6.1基础知识6.1.2程序结构剖析图6-2MFC类关系图为了对MFC方式的程序的框架有一个总体的认识,用MFCAppWizard(exe)新建一个名为MyTest的单文档工程。该工程主要由4个类组成,各类之间的关系如图6-2所示。北华航天工业学院计算机系制作单击此处编辑母版标题样式6.2系统分析俄罗斯方块的游戏规则是:在游戏界面中,不停的有游戏方块从窗口上方往下落。游戏者需要根据游戏方块的形状,操作控制键对方块进行移动、旋转,尽可能将一层铺满。当一层被铺满后,该层会消失,否则层会迭高。当层数迭高到不能落下游戏方块后,该游戏结束。北华航天工业学院计算机系制作单击此处编辑母版标题样式6.3系统设计为实现本实例的功能,主要完成如下几方面:(1)设计几种方块形状。对于用4个小方块组成的方块组合,不考虑自身旋转变化的话,总共有7种,分别为L型,T型,一型,N型,田型,J型以及倒N型。方块的这几种不同形状,可以使用产生随机数的办法随机抽取一种。坐标系采用左上角为坐标系中心,横轴向右,纵轴向下。北华航天工业学院计算机系制作单击此处编辑母版标题样式6.3系统设计(2)初始化显示和屏幕刷新时重绘游戏面板及方块。方块由4*4的共16个单元格组成,同时游戏面板由10*20的单元格组成。单元格初始标记为0,即不显示,如果是1则以分配的颜色显示。这样整个10*20个单元格就可以通过颜色来表示彩色方块或黑色背景了。北华航天工业学院计算机系制作单击此处编辑母版标题样式6.3系统设计(3)使方块定时下落。这可以通过定时器来控制。(4)响应按键消息,包括让方块向左、右、下方向落下,及旋转。可以通过坐标值加1或减1个单元格来实现。(5)判断方块是否出界。主要是通过判断坐标是否小于或大于边界范围,即超出0~9和0~19个单元格。(6)判断游戏结束。及新产生的方块已经落到之前的方块上,不能在下降,此时即弹出提示框显示游戏结束和分数。为了达到以上的目的,设置成员变量如表6-1所示。北华航天工业学院计算机系制作单击此处编辑母版标题样式6.3系统设计变量类型变量名称访问权限功能intflagprivateflag=1时游戏开始,方块开始下落intflag2private图形是够重绘Intleftprivate面板左端起始位置Inttopprivate面板上端起始位置intindexprivate随机产生方块intcor[20][10]private保存方块颜色CPointdd[4];private方块位置intHprivate方块产生时的纵向起始位置intRprivate方块产生时的横向起始位置inttimeprivate定时器时长intcountprivate得分intwprivate出左右边界intkprivate旋转intKprivate避免自动下落和键盘控制冲突表6-1成员变量北华航天工业学院计算机系制作单击此处编辑母版标题样式6.3系统设计表6-2成员函数函数类型函数声明访问权限功能voidBlockCreateprivate初始化产生7种方块形状voidBlockDisplayprivate初始显示及重绘游戏面板voidBlockDropprivate方块自动下落intMoveToRotate(intas)private方块旋转intMoveToDown()private方块向下移动voidMoveToLeft()private方块向左移动voidMoveToRight()private方块向右移动voidGameOver()private游戏结束intIsOutPanel(intw);private方块出界intArriveAtBottomprivate方块到底北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.1新建工程创建Singledocument。编译、执行,测试刚创建的新工程是否工作正常。北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.2设计七种方块形状总共有7种,分别为L型,T型,一型,N型,田型,J型以及倒N型。方块的这几种不同形状,可以使用产生随机数的办法随机抽取一种。坐标系采用左上角为坐标系中心,横轴向右,纵轴向下。北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.3显示方块根据方块形状初始将cor[x][y]==1,即是方块形状的位置,在游戏面板上以初始方块颜色重绘显示重绘正在下降和左右移动的方块,产生方块显示方块北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.4显示游戏面板擦除之前画的方块,即以黑色覆盖轨迹是方块形状的位置则将cor[x][j]==1,用于以后的方块局部重绘根据方块形状初始将cor[x][y]==1,即是方块形状的位置,在游戏面板上以初始方块颜色重绘显示重绘正在下降和左右移动的方块,避免擦除轨迹时闪屏造成方块运动不连续在游戏面板右部空白处提示显示下一个新产生的方块北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.4显示游戏面板根据方块形状初始将cor[x][y]==1,即是方块形状的位置,在游戏面板上以初始方块颜色重绘显示显示下一个新产生的方块第一个方块倒底后绘制黑色游戏面板用背景色擦除游戏面板右上部分的原有图形重绘正在下落的和到底的方块落到面板不动的方块变色北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.5方块自动下降方块通过设置定时器自动下降如果方块没下降到底则继续下降游戏面板已满,游戏结束,是否重新开始新游戏北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.6按键控制方块向左移动方块向左移动,每次按键使横坐标减16.4.7按键控制方块向右移动方块向右移动,每次按键使横坐标加16.4.8按键控制方块下降方块未到底则正常下降,每次按键使纵坐标加1北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.9响应键盘消息响应向左箭头方向控制,即左移响应向右箭头方向控制,即右移响应向下箭头方向控制,即加速下降响应向上箭头方向控制,即旋转重绘游戏面板此时编译执行测试代码,通过键盘方向键控制可以看到图形的向左、向右、向下移动,但此时的运动轨迹并没有擦除,而且还超出了游戏界面的边界,在后面的步骤中将解决这些问题。北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.10擦除方块运动轨迹(1)首先要添加设置标志位的代码如下:将当前方块标志为0,游戏面板重绘时不显示方块保存当前方块横坐标,重绘面板时删除之前轨迹保存当前方块纵坐标,重绘面板时删除之前轨迹(2)在BlockDisplay中添加flag=1;。(3)如果是向左移东,修改响应键盘函数在MoveToLeft()函数前添加BlockErase(),函数的后面添加flag2=1。北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.11判断方块是否出左边界小于等于0出左边界6.4.12判断方块是否出右边界大于等于9出右边界北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.13按键控制方块旋转保存原方块坐标值取直线型方块的中心为新坐标原点其他方块的中心为组成图形的第2个点的坐标转换成新坐标系内的坐标如果旋转后的坐标出了边界则不允许旋转,仍然用之前保存的原始坐标北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.14判断方块是否到底到底返回0,没到底返回1第一个到底的方块设置方块标志位为2保存方块颜色,以备重绘落到以前到底的方块上设置方块标志位为2保存方块颜色,以备重绘北华航天工业学院计算机系制作单击此处编辑母版标题样式6.4系统实现6.4.15判断游戏结束如果有10个方格连续,加100分消除满行后方块还有其余显示部分原来其余显示部分占的方块标志置为0,即重绘时不显示如果游戏面板最上面一行有任意方格标志为2,则表示游戏面板已满终止定时器定时下降分数清零,重新开始定时下降方块北华航天工业学院计算机系制作单击此处编辑母版标题样式本章小结Windows应用程序在本质上是面向对象的。程序提供给用户界面的可视对象在程序的内部一般也是一个对象,用户对可视对象的操作通过事件驱动模式触发相应对象的可用方法。程序的运行过程就是用户的外部操作不断产生事件,这些事件又被相应的对象处理的过程。通过本章的学习,读者可以在VisualC++中了解程序中MFC类的作用;如何进行图形的重绘;如何响应键盘消息;掌握游戏编程的基本方法。总之,为今后更复杂的游戏编程打下基础。北华航天工业学院计算机系制作