VisualFreeBasic游戏趣味编程_7.2_基于二维数组的游戏地图

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

为了实现图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

评论一下?

OωO
取消