欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

俄罗斯方块Dota版(附VC源码)

俄罗斯方块Dota版(附VC源码)



程序框架流程
    Win32 SDK C++编写
    玩了这么多年的俄罗斯方块,自己也来写一个,为了不太单调,加入了一些Dota的元素和连连看功能呵呵,可真当自己写的时候才发现创造者当时的巧妙的构思,俄罗斯方块中每个方块都是由四个小方块组成,但每个块的形状,变换又不相同,故利用C++继承已经多态来实现比较恰当。
   整个程序由一个背景窗口,一个玩家窗口,一个AI窗口和2个分数窗口组成。
 
   俄罗斯方块,顾名思义,即为方块组成,将整个窗口分为若干相同的小方块,采用全局数组来存储窗口中每个块的信息,掉落的方块均为4个小方块,下文中所说的掉落块即为游戏中的7种掉落方块,小块即为整个窗口中的每个小块,定义一个Block类来当做基类,包含4个Cpoint结构用于存放当前掉落方块在整个窗口的位置,另定义各种虚函数,如SwitchBlock来变换掉落块,MoveBlock来移动掉落块,FillBlock来将当前掉落块的信息填充到屏幕,CleanBlock、CleanSame等等。
   从Block基类派生出7种方块,然后重载SwitchBlock和AI功能函数实现每个掉落方块的不同功能
 
   通过重载AI函数来实现不同掉落块的AI功能,在Block中加入m_hwnd来存储当前掉落方块属于的窗口句柄,加入全局数组的引用来表示该掉落块属于那个窗口的数组。
   为了和玩家窗口独立,采用多线程的方式,将AI功能窗口创建在另一个线程的消息循环中。

    程序大体流程如下
   
    
     玩家窗口通过相应键盘的上下左右按键消息来调用相应的MoveBlock函数来移动掉落快,再MoveBlock中首先通过Check函数来判断该块的位置是否能移动,是否有满行,是否有相同连续的图案需要清除。如需要清除则调用Clean,CleanSame函数来清除相应的块。在Clean,CleanSame中调用Fall函数来实现悬空块的掉落。
图案背景的实现
    程序通过全局数组来保存整个窗口的每个小块信息。将整个窗口的背景分成若干小块,每个小块对应数组中的一个元素,数组中存放着每个小块位图的ID,而每个掉落块Block中的Cpoint存放的则是掉落块在数组中的索引,m_BitmapIndex[4]程序存放4个小块的相应的位图ID。FillBlock函数即实现m_BitmapIndex[4]中的ID写到全局数组中,CleanBlock即将掉落块对应位置的数组元素改回成相应背景图片的ID,ShowBlock函数则通过数组中的位图ID,显示出整个窗口的图画。
方块的移动实现和变换
    方块的移动通过MoveBlock函数实现。MoveBlock函数首先判断当前掉落块是否可以移动,如是否已到达边界,是否已经到达底部,然后判断当前整个窗口中是否存在满行或者连续的相同图案(连连功能),若存在则清除,然后让悬空的小块下落到相应的位置,最后调用ShowBlock函数刷新画面。若掉落块可移动则调用CleanBlock函数将该掉落块当前的全局数组中的位置的位图ID还原成背景的位图ID,然后4个CPoint成员中的的索引位置往相应的方向变动,再调用FillBlock函数填充当前位置的数组元素,使得该位置的位图变成该方块的图案,最后再调用ShowBlock函数刷新整个窗口。
    方块的变换通过虚函数SwitchBlock实现。从Block基类派生出7个掉落块的派生类,重写SwitchBlock虚函数。块的变换的工程和块的移动相似,不同之处在于变换块时改变4个Cpoint的方式。
清除满行块和连连看功能
    在MoveBlock中,通过Check函数判断当前块,如果为下移,则遍历当前数组,看是否存在满行的块,即该行所有的元素都不为背景图片ID,若为满行块则调用Clean函数清除,即将数组的该行元素全部改回相应的背景图片ID。然后遍历整个窗口,通过链表寻找每个小块周围的小块,看是否存在2个或者2个以上的相同图案的小块,若存在则清除,清除过程和清除满行块类似。清除完成后会有悬空的小块,调用Fall函数来实现小块的下落,因为下落后可能还会存在满行的块或者图案相同的小块,故采用循环的方式来实现清除块的功能
相应的代码如下

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功