为了实现随机颜色的方块,首先进行宏定义:
#define ColorTypeNum 9 '方块颜色为彩色的个数
定义全局变量colors数组记录ColorTypeNum+1种颜色,其中第0种为灰白色(表示空白),其他为彩色:
Dim Shared colors(ColorTypeNum) As COLORREF ' 颜色数组,小方块可能的几种颜色
在startup()函数中对颜色数组进行初始化:
colors(0) = BGR(225, 225, 225) ' 颜色数组第一种颜色为灰白色,表示空白小方块
For i = 1 To ColorTypeNum '其他几种颜色为彩色
colors(i) = HSBtoRGB_Gdi(HSB((i -1) * 40, 80, 90, 255))
Next
为了记录小方块的颜色,为Block结构体添加成员变量colorId:
Type Block ' 小方块结构体
As Long x, y ' 小方块在画面中的x,y坐标
As Long i, j ' 小方块在二维数组中的i,j下标
colorId As Long '对应颜色的下标
End Type
在startup()中对blocks初始化时,设置其颜色序号为[0, ColorTypeNum]的随机数:
Randomize
blocks(i, j).colorId = Int(Rnd * (ColorTypeNum+1))
在show()函数中以对应颜色绘制出所有的小方块:
gg.Brush colors(blocks(i, j).colorId) '设置填充颜色
gg.DrawFrame blocks(i, j).x,blocks(i, j).y, BlockSize,BlockSize
实现效果如图10-3所示

修改中随机颜色的生成代码,使得1/3的方块颜色为灰白色,更符合“十字消除”游戏的玩法,如图10-4所示。

完整代码
#define BlockSize 19 '小方块的边长
#define RowNum 13 '游戏画面一共RowNum行小方块
#define ColNum 21 '游戏画面一共ColNum列小方块
#define ColorTypeNum 9 '方块颜色为彩色的个数
Type Block ' 小方块结构体
As Long x, y ' 小方块在画面中的x,y坐标
As Long i, j ' 小方块在二维数组中的i,j下标
colorId As Long '对应颜色的下标
End Type
'全局变量定义
Dim Shared blocks(RowNum -1, ColNum -1) As Block ' 构建二维数组,存储所有数据
Dim Shared colors(ColorTypeNum) As COLORREF ' 颜色数组,小方块可能的几种颜色
Sub startup() '初始化函数
Dim As Long i, j ,t
'对blocks二维数组进行初始化
For i = 0 To RowNum -1
For j = 0 To ColNum -1
blocks(i, j).x = j * BlockSize '小方块左上角的坐标
blocks(i, j).y = i * BlockSize
blocks(i, j).i = i '存储当前小方块在二维数组中的下标
blocks(i, j).j = j
Randomize
t = Int(Rnd * (ColorTypeNum + 5)) -4 '为了产生更多的灰白色,更符合“十字消除”游戏的玩法
If t<0 Then t=0
blocks(i, j).colorId = t
Next
Next
colors(0) = BGR(225, 225, 225) ' 颜色数组第一种颜色为灰白色,表示空白小方块
For i = 1 To ColorTypeNum '其他几种颜色为彩色
colors(i) = HSBtoRGB_Gdi(HSB((i -1) * 40, 80, 90, 255))
Next
End Sub
Sub show(gg As yGDI) '绘制函数
gg.Cls BGR(220, 220, 220) '灰色背景。
gg.Pen 1, BGR(255, 255, 255) ' 白色线条
Dim As Long i, j
' 以对应的颜色、坐标画出所有的小方块
For i = 0 To RowNum -1
For j = 0 To ColNum -1
gg.Brush colors(blocks(i, j).colorId) '设置填充颜色
gg.DrawFrame blocks(i, j).x,blocks(i, j).y, BlockSize,BlockSize
Next
Next
gg.Redraw
End Sub
Sub updateWithoutInput() '与输入无关的更新
Sleep 10 '暂停若干毫秒
End Sub
Sub updateWithInput(hWndForm As hWnd, gg As ygdi) ' 和输入有关的更新
End Sub
Sub 游戏执行过程(hWndForm As hWnd)
Dim gg As yGDI = hWndForm
startup() '初始化
Do '循环执行
show(gg) '绘制
updateWithInput(hWndForm, gg)
updateWithoutInput()
Loop
End Sub
评论一下?