MFC俄罗斯方块

MFC俄罗斯方块

ID:40750657

大小:101.50 KB

页数:10页

时间:2019-08-07

MFC俄罗斯方块_第1页
MFC俄罗斯方块_第2页
MFC俄罗斯方块_第3页
MFC俄罗斯方块_第4页
MFC俄罗斯方块_第5页
资源描述:

《MFC俄罗斯方块》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、MFC版俄罗斯方块2010-01-1121:17MFC版俄罗斯方块总算完成了,足足花了我两天时间,其间出现过好多问题,后来都被一一化解,最头疼的是昨天晚上那个Bug把我头都弄大了,找了一晚上都没找出来,幸亏第二天脑子清醒才发现问题,要不然我真的很难找到一条让自己不崩溃的理由。呵呵,还好顶住了,任务也算顺利完成了。我写的这个俄罗斯方块游戏功能虽然比较简单,界面做的也很普通,但是从设计到实现基本上是用自己的算法实现的,虽然在程序的封装性和模块化上面做的不够好,东补西凑也算凑合吧。总归一句话,不容易啊!闲话不多说

2、了,下面我介绍一下俄罗斯方块的设计思路和流程以及在编码过程中遇到的一些问题。在写俄罗斯方块之前我对这个经典的小游戏进行了策略分析,并大体总结出了它的功能需求。下面是我当时记录的游戏设计的功能需求:1.图形界面布局(长方形主框,图形预览,score,Level)2.各种Shape的数据结构的存储和随机生成3.图形界面的绘制以及各控件显示(主图形、预览图形显示、score、level、游戏说明)4.时钟控制图形更新(主图的下降)5.图形的变换控制:↑↓←→控制键响应6.边界控制和图形的保存(Map[27][41

3、])7.消格,得分,升级图形变化控制策略:要求对Shape对应四个点分别进行如下判断a.“1”代表有方格“0”无b.下边有方格停止并保存c.超出左右边界以及左右格有值(1)不能移动d.在变形之前先判断一下是否满足前三条,满足可以变形,不满足变形失败简单的分析之后就开工了,第一步就是简单的托下控件,几分钟就KO了,然后就是对Shape数据结构的分析,网上搜了一下有7类19种,于是在OneNote里面将所有可能都描绘出来了如下:左边是7种图形,右边是其相对正方形图形的偏移量,正方形没有变种,左边其它三类图形有2

4、个变种,右边三类图形有4个变种,加起来正好19种类型,将这些相对正方形偏移得来的图形记录到二维数组Shape[19][8]当中,然后就是设法让这些图形随机生成,简单,rand()%19即可,这样第二部就完成了。接下来就是想办法将图形绘制出来了,开始是基于过程,写了一大堆代码来实现这个功能,后来发现绘制出来的图形还要被擦除,这两个功能用到的代码基本上是一样的,于是就自己定义了一个m_DrawImage的成员函数来完成图形的绘制功能。主图形完了之后,开始考虑如何实现预览功能,发现预览的图形不需要考虑位置的移动,

5、并重载了一下m_DrawImage实现了对预览图形的绘制。接下来就是想办法让图形动起来了,想到了用时钟SetTimer让它隔一段时间位置下落一定距离,这里关键是要考虑到如何将之前的图形擦除,怎么办呢?其实只需将之前绘制的图形保存,并用和背景颜色一致画刷绘制就可实现擦除功能。第五步就是实现图形的变换控制了,注意一点对话框程序不能直接用WM_KEYDOWN消息来实现,要用PreTranslateMessage代替。因为在对话框程序中,某些特定的消息,例如按键消息,它们被Windows内部的对话框过程处理了(即在

6、基类中完成了处理,可以查看MFC的源代码),或者被发送给子控件(获取焦点的子控件)进行处理,所以我们在对话框类中就捕获不到按键的消息了。比较伤脑筋的就是第六步了,程序写到这里就要考虑如何保存之前的数据以及如何防止方块出界的问题了,问题变得越来越具体,对数据的要求也越来越精确,这一步我用GetClientRect(&rect)测量了主窗口的长和宽并用数组Map[27][41]将其进行了保存。在考虑如何保存方块位置以及边界控制的过程中,为题就出现了,我之前想只用到一个点坐标m_CurPos记录左上角一个方块的位

7、置,然后想根据其它方块和它相连的关系和偏移量Shape的关系来却定所有定的确切位置,在实现过程中发现这样好繁琐,每一个点的表示都有好长一串代码,我才意识到偷懒是不行的,还是必须用四个点来记录每一个方块的位置,于是我用PointArray[4]分别记录了四个点的坐标位置,这样之后问题就明朗了,一个一个点去考虑,比起四个点一起考虑要容易的多,这也是化抽象为具体,分而治之这种最简单而又最实用的方法的强大威力的的再一次证实。最后就是消格,得分,升级的问题了,有了前面的基础这些问题也都很快沿刃而解了。在第6步的过程中

8、也产生了最让我头疼的Bug,后来想想这根本就不算是问题,都怪自己粗心大意,害自己白忙活一晚上,最开始我本来是对的Map[27][41]这个数组横坐标对应x值,纵坐标对应y值,不知道突然哪根筋不对了,想着要把它改成Map[41][27],41行,27列,对啊,幸亏及时纠正,没想到这一改差点把我整崩溃了。本来这么简单的问题不应该看不出来,但是有时候啊,人的那个脑袋就是容易产生固定化思维模式,这也是阻碍很多人进步的原因

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。