- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MFC俄罗斯方块.doc
MFC版俄罗斯方块
2010-01-11 21:17
MFC版俄罗斯方块总算完成了,足足花了我两天时间,其间出现过好多问题,后来都被一一化解,最头疼的是昨天
晚上那个Bug把我头都弄大了,找了一晚上都没找出来,幸亏第二天脑子清醒才发现问题,要不然我真的很难找到一
条让自己不崩溃的理由。呵呵,还好顶住了,任务也算顺利完成了。我写的这个俄罗斯方块游戏功能虽然比较简
单,界面做的也很普通,但是从设计到实现基本上是用自己的算法实现的,虽然在程序的封装性和模块化上面做的
不够好,东补西凑也算凑合吧。总归一句话,不容易啊!
闲话不多说了,下面我介绍一下俄罗斯方块的设计思路和流程以及在编码过程中遇到的一些问题。在写俄罗斯方
块之前我对这个经典的小游戏进行了策略分析,并大体总结出了它的功能需求。
下面是我当时记录的游戏设计的功能需求:
1.图形界面布局(长方形主框,图形预览,score,Level)
2.各种Shape的数据结构的存储和随机生成
3.图形界面的绘制以及各控件显示(主图形、预览图形显示、score、level、游戏说明)
4.时钟控制图形更新(主图的下降)
5.图形的变换控制: ↑↓←→控制键响应
6.边界控制和图形的保存(Map[27][41])
7.消格,得分,升级
图形变化控制策略:
要求对Shape对应四个点分别进行如下判断
a.“1”代表有方格“0”无
b.下边有方格停止并保存
c.超出左右边界以及左右格有值(1)不能移动
d.在变形之前先判断一下是否满足前三条,满足可以变形,不满足变形失败
简单的分析之后就开工了,第一步就是简单的托下控件,几分钟就KO了,然后就是对Shape数据结构的分析,网上
搜了一下有7类19种,于是在OneNote里面将所有可能都描绘出来了如下:
左边是7种图形,右边是其相对正方形图形的偏移量,正方形没有变种,左边其它三类图形有2个变种,右边三类图
形有4个变种,加起来正好19种类型,将这些相对正方形偏移得来的图形记录到二维数组Shape[19][8]当中,然后就
是设法让这些图形随机生成,简单,rand()%19即可,这样第二部就完成了。接下来就是想办法将图形绘制出来了,
开始是基于过程,写了一大堆代码来实现这个功能,后来发现绘制出来的图形还要被擦除,这两个功能用到的代码
基本上是一样的,于是就自己定义了一个m_DrawImage的成员函数来完成图形的绘制功能。主图形完了之后,开始
考虑如何实现预览功能,发现预览的图形不需要考虑位置的移动,并重载了一下m_DrawImage实现了对预览图形的
绘制。接下来就是想办法让图形动起来了,想到了用时钟SetTimer让它隔一段时间位置下落一定距离,这里关键是要
考虑到如何将之前的图形擦除,怎么办呢?其实只需将之前绘制的图形保存,并用和背景颜色一致画刷绘制就可实
现擦除功能。第五步就是实现图形的变换控制了,注意一点对话框程序不能直接用WM_KEYDOWN消息来实现,要用
PreTranslateMessage代替。因为在对话框程序中,某些特定的消息,例如按键消息,它们被Windows内部的对话
框过程处理了(即在基类中完成了处理,可以查看MFC的源代码),或者被发送给子控件(获取焦点的子控件)进行
处理,所以我们在对话框类中就捕获不到按键的消息了。比较伤脑筋的就是第六步了,程序写到这里就要考虑如何
保存之前的数据以及如何防止方块出界的问题了,问题变得越来越具体,对数据的要求也越来越精确,这一步我用
GetClientRect(rect)测量了主窗口的长和宽并用数组Map[27][41]将其进行了保存。在考虑如何保存方块位置
以及边界控制的过程中,为题就出现了,我之前想只用到一个点坐标m_CurPos记录左上角一个方块的位置,然后想
根据其它方块和它相连的关系和偏移量Shape的关系来却定所有定的确切位置,在实现过程中发现这样好繁琐,每
一个点的表示都有好长一串代码,我才意识到偷懒是不行的,还是必须用四个点来记录每一个方块的位置,于是我
用PointArray[4]分别记录了四个点的坐标位置,这样之后问题就明朗了,一个一个点去考虑,比起四个点一起考
虑要容易的多,这也是化抽象为具体,分而治之这种最简单而又最实用的方法的强大威力的的再一次证实。最后就
是消格,得分,升级的问题了,有了前面的基础这些问题也都很快沿刃而解了。
在第6步的过程中也产生了最让我头疼的Bug,后来想想这根本就不算是问题,都怪自己粗心大意,害自己白忙活一
晚上,最开始我本来是对的Map[27][41]这个数组横坐标对应x值,纵坐标对应y值,不知道突然哪根筋不对了,想着
要把它改成Map[41][27],41行,27列,对啊,幸亏及时纠正,没想到这一改差点把我整崩溃了。
文档评论(0)