实现小蛇的移动功能是“贪吃蛇”游戏的开发难点,图7-4列出了小蛇向右移动前后二维数组的元素值,虚线框内为对应代码的实现步骤:

假设小蛇初始元素值为54321,其中1为蛇头、5432为蛇身、最大值5为蛇尾。首先将二维数组中所有大于0的元素加1,得到65432;然后将最大值6变为0,即去除了原来的蛇尾;最后将2右边的元素由0变成1,即实现了小蛇向右移动。
定义函数moveSnake( )处理小蛇移动的相关操作:
Sub moveSnake() ' 移动小蛇及相关处理函数
Dim i As Long, j As Long
For i = 0 To BLOCK_HEIGHT -1 '对行遍历
For j = 0 To BLOCK_WIDTH -1 '对列遍历
If Blocks(i, j) > 0 Then '大于0的为小蛇元素
Blocks(i, j) += 1 '让其+1
End If
Next
Next
Dim As Long oldTail_i, oldTail_j, oldHead_i, oldHead_j '定义变量,存储旧蛇尾、旧蛇头坐标
Dim mm As Long '用于记录最大值
For i = 0 To BLOCK_HEIGHT -1 '对行遍历
For j = 0 To BLOCK_WIDTH -1 '对列遍历
If mm < Blocks(i, j) Then '如果当前元素值比max大
mm = Blocks(i, j) '更新max的值
oldTail_i = i ' 记录最大值的坐标,就是旧蛇尾的位置
oldTail_j = j
End If
If Blocks(i, j) = 2 Then '找到数值为2
oldHead_i = i ' 数值为2恰好是旧蛇头的位置
oldHead_j = j '
End If
Next
Next
Dim newHead_i As Long = oldHead_i ' 设定变量存储新蛇头的位置
Dim newHead_j As Long = oldHead_j
newHead_j = oldHead_j + 1 ' 向右移动,更新蛇头坐标
If newHead_j = BLOCK_WIDTH Then newHead_j = 0
Blocks(newHead_i, newHead_j) = 1 ' 新蛇头位置数值为1
Blocks(oldTail_i, oldTail_j) = 0 ' 旧蛇尾位置变成空白
End Sub
在updateWithoutInput( )函数中调用moveSnake( ):
Sub updateWithoutInput() '与输入无关的更新
moveSnake() '调用小蛇移动函数
End Sub
通过以上操作则实现了小蛇自动向右移动,效果如图7-5所示。

评论一下?