为了实现图7-1中网格状的游戏地图效果,这一节介绍二维数组的概念。首先输入并运行以下代码:
Sub 游戏执行过程(hWndForm As hWnd)
Dim a(2, 4) As Long
Dim i As Long, j As Long
For i = 0 To 2
For j = 0 To 4
a(i, j) = i * 10 + j
Next
Next
For i = 0 To 2
For j = 0 To 4
Print a(i, j)
Next
Next
End Sub
其中,Dim a(2, 4) As Long定义了二维数组a,有3行5列15个元素。通过 a(i, j)的形式可以访问二维数组的元素,下标i范围为0~2,下标j范围为0~4。
练习题7-1:生成一个4行4列的二维数组,元素取值为1~5的随机数,输出二维数组。如果二维数组中的元素为5,则将其元素值变为0,输出更新后的二维数组。样例输出如下所示。

二维数组也可以在定义时直接初始化,例如:
Dim a(2, 3) As Long = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}
其中,{1,2,3,4}赋给第0行,{5,6,7,8}赋给第1行,{9,10,11,12}赋给第2行:

首先利用宏定义设定游戏画面高度上的格子数目HEIGHT、宽度上的格子数目WIDTH、每个小格子的大小BLOCK_SIZE:
#define BLOCK_HEIGHT 30 ' 高度上一共30个小格子
#define BLOCK_WIDTH 40 ' 宽度上一共40个小格子
#define BLOCK_SIZE 20 ' 每个小格子的长宽大小
利用二维数组存储所有格子的信息:
Dim Blocks(BLOCK_HEIGHT,BLOCK_WIDTH) As Long ' 二维数组,用于记录所有的游戏数据
利用两重for循环,可以设定元素Blocks(i,j)的值为随机整数:
Dim i As Long, j As Long
For i = 0 To BLOCK_HEIGHT -1
For j = 0 To BLOCK_WIDTH -1
Blocks(i, j) = Int(Rnd * 30) ' 赋值为随机数
Next
Next
然后可以根据元素数值设定填充颜色,在对应位置绘制小方格:
gg.Pen 1, BGR(255,255,255)
For i = 0 To BLOCK_HEIGHT -1
For j = 0 To BLOCK_WIDTH -1
gg.Brush HSBtoRGB_Gdi(HSB(Blocks(i, j)*10, 90, 100, 255)) '根据元素值设定填充颜色
gg.DrawFrame j*BLOCK_SIZE,i*BLOCK_SIZE,BLOCK_SIZE,BLOCK_SIZE
Next
Next

全部源码
#define BLOCK_HEIGHT 17 ' 高度上一共30个小格子
#define BLOCK_WIDTH 27 ' 宽度上一共40个小格子
#define BLOCK_SIZE 15 ' 每个小格子的长宽大小
Sub 游戏执行过程(hWndForm As hWnd)
Dim gg As yGDI = hWndForm
Dim Blocks(BLOCK_HEIGHT -1, BLOCK_WIDTH -1) As Long ' 二维数组,用于记录所有的游戏数据
Dim i As Long, j As Long
For i = 0 To BLOCK_HEIGHT -1
For j = 0 To BLOCK_WIDTH -1
Blocks(i, j) = Int(Rnd * 30) ' 赋值为随机数
Next
Next
gg.Pen 1, BGR(255,255,255)
For i = 0 To BLOCK_HEIGHT -1
For j = 0 To BLOCK_WIDTH -1
gg.Brush HSBtoRGB_Gdi(HSB(Blocks(i, j)*10, 90, 100, 255)) '根据元素值设定填充颜色
gg.DrawFrame j*BLOCK_SIZE,i*BLOCK_SIZE,BLOCK_SIZE,BLOCK_SIZE
Next
Next
End Sub
二维数组Blocks(HEIGHT,WIDTH)中也可以记录蛇的信息。设定元素值为0表示空,画出灰色的方格;元素值为1表示蛇头,蛇头后的蛇身依次为2、3、4、5等正整数,画出彩色的方格,如图7-3所示。

#define BLOCK_HEIGHT 17 ' 高度上一共30个小格子
#define BLOCK_WIDTH 27 ' 宽度上一共40个小格子
#define BLOCK_SIZE 15 ' 每个小格子的长宽大小
Sub 游戏执行过程(hWndForm As hWnd)
Dim gg As yGDI = hWndForm
Dim Blocks(BLOCK_HEIGHT -1, BLOCK_WIDTH -1) As Long ' 二维数组,用于记录所有的游戏数据
Dim i As Long, j As Long
Blocks(BLOCK_HEIGHT / 2, Int(BLOCK_WIDTH / 2)) = 1 '画面中间画蛇头,数字为1
For i = 1 To 4
Blocks(BLOCK_HEIGHT / 2, Int(BLOCK_WIDTH / 2) - i) = i + 1 '向左依次4个蛇身,数值依次为2、3、4、5
Next
gg.Pen 1, BGR(255, 255, 255)
'对二维数组所有元素遍历
For i = 0 To BLOCK_HEIGHT -1
For j = 0 To BLOCK_WIDTH -1
If Blocks(i, j) > 0 Then
gg.Brush HSBtoRGB_Gdi(HSB(Blocks(i, j) * 10, 90, 100, 255)) '根据元素值设定填充颜色
Else
gg.Brush BGR(165, 165, 165) 'GDI的颜色值。
End If
gg.DrawFrame j *BLOCK_SIZE, i *BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE
Next
Next
End Sub
最后,我们用7.1节的游戏框架重构,将Blocks设为全局变量,初始化代码放到startup()中,绘制功能放到show()中:
#define BLOCK_HEIGHT 17 ' 高度上一共30个小格子
#define BLOCK_WIDTH 27 ' 宽度上一共40个小格子
#define BLOCK_SIZE 15 ' 每个小格子的长宽大小
'全局变量定义
Dim Shared Blocks(BLOCK_HEIGHT -1, BLOCK_WIDTH -1) As Long ' 二维数组,用于记录所有的游戏数据
Sub startup(gg As yGDI) '初始化函数
Dim i As Long, j As Long
Blocks(BLOCK_HEIGHT / 2, Int(BLOCK_WIDTH / 2)) = 1 '画面中间画蛇头,数字为1
For i = 1 To 4
Blocks(BLOCK_HEIGHT / 2, Int(BLOCK_WIDTH / 2) - i) = i + 1 '向左依次4个蛇身,数值依次为2、3、4、5
Next
gg.Pen 1, BGR(255, 255, 255)
End Sub
Sub show(gg As yGDI) '绘制函数
gg.Cls
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
gg.Brush HSBtoRGB_Gdi(HSB(Blocks(i, j) * 10, 90, 100, 255)) '根据元素值设定填充颜色
Else
gg.Brush BGR(165, 165, 165) 'GDI的颜色值。
End If
gg.DrawFrame j *BLOCK_SIZE, i *BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE
Next
Next
gg.Redraw
End Sub
Sub updateWithoutInput() '与输入无关的更新
End Sub
Sub updateWithInput() ' 和输入有关的更新
End Sub
Sub 游戏执行过程(hWndForm As hWnd)
Dim gg As yGDI = hWndForm
startup(gg) '初始化函数,仅执行一次
Do
show(gg) ' 进行绘制
updateWithoutInput() ' 和输入无关的更新
updateWithInput() ' 和输入有关的更新
sleep 10
Loop
End Sub

评论一下?