推箱子游戏效果如图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






评论一下?