3.3.2地雷及雷区表面探测情况
在游戏设计上,我利用了两个二文数组分别记录地雷的分布情况及雷区表面探测情形,如图5和图6所示:
图5标示地雷分布情况
图6标示地雷探测情况
因为两个数组文数皆为2,所以我们通过双循环做数据的对比工作。另外,当游戏玩家按下非地雷的方块时,程序必须自动将周边非地雷的方块翻开,这个动作我们也可以通过双循环的方式检查以按下的方块为中心与周边的8个方块所形成的3*3的二文数组,鼠标指针所指即是代表按下的方块,利用双循环作数据的对比,不但速度快,而且在设计阶段,程序的架构也比较清楚。程序设计时双循环常常搭配二文数组使用。
3.3.3清除未靠近地雷的方块
这里先引入一个“递归”的概念,“递归”(Recursion)简单的说,就是一个程序能被自己所定义的语句调用。递归在程序设计上是一种重要的数据结构形态,通过递归程序的编写,在程序代码上会变得相当简洁,不过如果设计不当,会造成无穷循环或堆迭溢满的情形,所以递归的程序中心必须含有if…then或Select Case等设计,以终止递归执行。
在游戏过程中,当游戏者按下非地雷方块时,方块会沿四周八个方向向外翻开非地雷的方块。
程序的执行方面必须判断:以按下方块为中心,检查周围八个方块是否为非地雷方块,若其中有一个方块是非地雷方块时,则又以其为中心,向外检查周围八个方块是否为非地雷方块,如此反复的执行即构成递归的使用条件。
前面已经提到,递归必须设计终止的条件判断,在本游戏的递归架构中,当判断方块的内容为数字时(即在非地雷方块周围),即立即停止递归程序。
递归其实也不是万能的,以本游戏做测试,当地雷区范围越大,且地雷数目不多时(一翻开非地雷方块,几乎全部方块都会翻开),执行递归就会变的非常缓慢,甚至造成堆迭溢满(不足)的情形,所以在游戏设计上必须考虑地雷区的大小,以免造成执行时错误中断的情况发生。
代码部分如下所示:
Private Sub doClear(ByVal x As Integer, _
ByVal y As Integer, _
ByVal index As Integer)
MINE_NUM_CLEAR = MINE_NUM_CLEAR + 1
For xx = x - 1 To x + 1
For yy = y - 1 To y + 1
If xx >= 0 And xx <= MAP_X And _
yy >= 0 And yy <= MAP_Y Then
If Not (xx = x And yy = y) Then
If mapFaceArr(xx, yy) = 1 And _
mapArr(xx, yy) >= 0 And _
mapArr(xx, yy) <= 8 Then
mapFaceArr(xx, yy) = 0
Select Case mapArr(xx, yy)
Case 0
Call setMineImage((yy * MAP_X + xx), 10)
Call doClear(xx, yy, (yy * MAP_X + xx))
Case 1 To 8
MINE_NUM_CLEAR = MINE_NUM_CLEAR + 1
上一页 [1] [2] [3] [4] [5] [6] [7] 下一页