这个俄罗斯方块是我学mfc 写的第二个程序。是一个标准的,不带任何特色的程序(我指的是功能)
要完成这个游戏,我认为要解决三个问题。
1.方块的存储。
2.方块如何变形。
3.碰撞检测。
我解决上面三个问题的方法是:
1.方块的存储,这个方法是我自己想出来的,不知道有没有人用过。
方块的基本类型共有七中,我将每一种方块用一个4*4方阵表示。
如图:diamond.bmp所示。将方阵用图中有数字的那个方阵那样标记。
这样就可以把方块存储在一维数组之中。可以用0,1 标识。为了节省空间。
其实我们只需存储每一种方块的带有颜色的部分所在的位置。也就是说只用4个数就能
表示一种方块。如长条行的 就可以表示为 1 8 12 15 四个数。方行的就可表示为 12 13 15 14
这样就解决了方块的存储。为什么这么存储?看第二问题解决方法。
2方块的变形。方块变形的实质是什么呢? 其实就是旋转90度,顺时针还是逆时针无所谓。我采用的顺时针旋转90度。
怎么旋转呢。有了解决第一个问题的基础。那么实现旋转那么非常简单了。
还记得上面,我们用的四个数表示的方块吧。
我们看看长条旋转90度变成什么呢?还是用四个数表示。4 11 12 13.
那么他是怎么由 1 8 12 15 变成 4 11 12 13 的呢?
两种情况。当变换前的数字小于12 时 那么这个数字就加上 4. 再对12 取模数。
当变换前的数字大于12 时 那么就用这个数加上 1 然后减去 12 对4 取模 再加十二。
举个例子就是 1 -> 5
4 -> 8
8 -> 0
12-> 13
15-> 12
还算简单吧。
3.碰撞检测。
首先,游戏区域是一个方阵。每个方阵都有一个坐标。我们用二维数组表示这个方阵。
用二维数组的下标表示方阵的坐标。
由于每个方块也是一个方阵。它里面每个小方块也有坐标。我称他为相对坐标。
我们对正在下落的方块赋予一个相对于游戏区域的坐标,我称之为绝对坐标。
二维数据中用0,1两个状态标记当前方阵此位置时候被占据。
当方块向下,左,右,移动时候,我们先让他移动,看移动后的方块所在位置(绝对坐标+相对坐标)是否已被占据。
如果是,则发生了碰撞。
叙述的不是很清楚。
详情请看代码。
其中CGameDiamond 是有关方块存储,变形,坐标变换的类。
CGamePlatform 是负责整个游戏运行处理的类。CSepicalButton 是为了实现自画button 的类。
- 1
- 2
- 3
- 4
- 5
前往页