VisualFreeBasic游戏趣味编程_10.2_随机颜色方块的实现

2026-1-22 / 0 评论 / 73 阅读

为了实现随机颜色的方块,首先进行宏定义:

#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

评论一下?

OωO
取消