VisualFreeBasic游戏趣味编程_9.2_应用字符数组存储关卡数据

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

推箱子游戏效果如图9-4所示。

图9-4中的“推箱子”游戏一共有表9-1所示的几种元素。

表9-1

元素图片 功能描述 英文名称 缩写字符
空白区域:玩家可以穿过,箱子可以推上去 empty 'e'
墙:玩家不能经过,箱子不能推过去 wall 'w'
箱子:在前方没有障碍物的情况下,玩家可以推动 box 'b'
空白目标:需要玩家将箱子推上去 target 't'
完成目标:一个箱子在目标上的叠加状态 achieved 'a'
游戏角色:可以键盘控制移动,推动箱子到达目标 player 'p'

我们可以采用二维字符数组的形式描述关卡地图数据。用表9-1中对应的缩写字符,图9-4的地图可以表示为:

   Dim level(63) As String = _
      {"w", "w", "w", "w", "w", "w", "w", "w", _
      "w", "w", "w", "t", "b", "e", "e", "w", _
      "w", "e", "e", "e", "e", "e", "e", "w", _
      "w", "e", "e", "e", "e", "e", "e", "w", _
      "w", "e", "e", "e", "e", "e", "e", "w", _
      "w", "e", "e", "p", "a", "e", "e", "w", _
      "w", "e", "e", "e", "w", "w", "w", "w", _
      "w", "w", "w", "w", "w", "w", "w", "w"}

用字符串的形式对二维数组初始化,代码可写为:

   Dim level(7) As String = {"wwwwwwww", "wwwtbeew", "weeeeeew", "weeeeeew", "weeeeeew", "weepaeew", "weeewwww", "wwwwwwww"}

dim level(7) 是有8个数据,0~7 8个。


定义全局变量level储存地图数据,在show()函数中根据level的值绘制出表9-1中的对应图案,完整代码如9-2所示。

#define B_SIZE 32 ' 方块大小
#define B_NUM 8   ' 方块个数,一共8*8个方块
'用字符型二维数组存储地图数据
'e: empty w: wall t: target b: box a: achieved p:player
'全局变量定义
Dim Shared level(B_NUM -1) As ZString * B_NUM + 1 = {"wwwwwwww", "wwwtbeew", "weeeeeew", "weeeeeew", "weeeeeew", "weepaeew", "weeewwww", "wwwwwwww"}

Sub startup() '初始化函数

End Sub

Sub show(gg As yGDI) '绘制函数
   gg.Cls BGR(150,150,150) '灰色背景。
   Dim i As Long, j As Long 

   For i = 0 To B_NUM -1 '遍历关卡二维数组数据
      For j=0 To B_NUM -1 
         If Chr(level(i) [j]) = "e" Then 'empty元素是空白区域
            gg.Pen 0,0 '框
            gg.Brush BGR(150, 150, 150) '绘制灰色地面
            gg.DrawFrame j*B_SIZE,i*B_SIZE,B_SIZE,B_SIZE
         ElseIf Chr(level(i) [j]) = "w" Then 'wall元素是墙
            gg.Pen 1,BGR(120, 120, 120)  '框
            gg.Brush BGR(155, 0, 0)     '绘制淡红色、灰色线的方框
            gg.DrawFrame j*B_SIZE,i*B_SIZE,B_SIZE,B_SIZE            
         ElseIf Chr(level(i) [j]) = "b" Then 'box元素是可移动的箱子
            gg.Pen 1,BGR(150, 150, 150)  '框
            gg.Brush BGR(255, 255, 0)    '绘制一个黄色的方块 
            gg.DrawFrame j*B_SIZE,i*B_SIZE,B_SIZE,B_SIZE              
         ElseIf Chr(level(i) [j]) = "t" Then 'target元素是目标
            gg.Pen 0,0  '框
            gg.Brush BGR(255,255,255)  
            gg.DrawFrame (j+0.25)*B_SIZE,(i+0.25)*B_SIZE,B_SIZE*0.5,B_SIZE*0.5
         ElseIf Chr(level(i) [j]) = "a" Then 'achieved 元素是已完成目标
            gg.Pen 0,0  '框
            gg.Brush BGR(255, 255, 0)    '绘制一个黄色的方块 
            gg.DrawFrame j *B_SIZE, i *B_SIZE, B_SIZE, B_SIZE  
            gg.Pen 1,BGR(150, 150, 150)  '框
            gg.Brush BGR(255,255,255)  
            gg.DrawFrame (j+0.25)*B_SIZE,(i+0.25)*B_SIZE,B_SIZE*0.5,B_SIZE*0.5                        
         ElseIf Chr(level(i) [j]) = "p" Then 'player 元素是玩家,绘制一个人脸图案
            '一个红色圆脸
            gg.Pen 0,0  '框
            gg.Brush BGR(255,0,0) '一个红色圆脸
            gg.DrawEllipse (j+0.1)*B_SIZE,(i+0.1)*B_SIZE,B_SIZE*0.8,B_SIZE*0.8              
            '两个黑色眼睛
            gg.Brush BGR(90, 90, 90) 'GDI的颜色值。
            gg.DrawEllipse (j+0.2)*B_SIZE,(i+0.35)*B_SIZE,B_SIZE*0.25,B_SIZE*0.25 
            gg.DrawEllipse (j+0.55)*B_SIZE,(i+0.35)*B_SIZE,B_SIZE*0.25,B_SIZE*0.25 
            '一个深灰色嘴巴
            gg.DrawFrame (j+0.3)*B_SIZE,(i+0.7)*B_SIZE,B_SIZE*0.4,B_SIZE*0.1 
         End If 
      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
取消