假设键盘控制游戏角色向右移动,根据其右侧目标位置、再右侧位置的元素,有表9-2所示情况。

根据用户的不同输入,变量goal_i、goal_j存储游戏角色移动的目标位置, goalNext_i、goalNext_j存储目标位置再向前的一个位置。根据表9-2,共有6种情况会移动游戏角色及更新关卡元素,在update()函数中实现相应的处理:
Sub updateWithInput(hWndForm As hWnd, gg As ygdi) ' 和输入有关的更新
Static pp As Long '预防一直按下,造成一直移动
If pp = 1 Then
If IsKeyPress(&H57) = 0 And IsKeyPress(&H53) = 0 And IsKeyPress(&H41) = 0 And IsKeyPress(&H44) = 0 Then
pp = 0
End If
Else
If IsKeyPress(&H57) Then ' 上
pp = 1
ElseIf IsKeyPress(&H53) Then ' 下
pp = 1
ElseIf IsKeyPress(&H41) Then ' 左
pp = 1
ElseIf IsKeyPress(&H44) Then ' 右
pp = 1
End If
If pp = 1 Then
Dim goal_i As Long = players.i ' 移动的目标位置
Dim goal_j As Long = players.j
Dim goalNext_i As Long = goal_i '目标位置再向前的一个位置
Dim goalNext_j As Long = goal_j
' 根据用户的不同按键输入,获得目标位置、再向前的一个位置
If IsKeyPress(&H57) Then ' 上
goal_i = Players.i - 1 ' 目标位置在玩家位置的下边
goalNext_i = goal_i - 1 ' 目标的下一个位置,在其再下边
ElseIf IsKeyPress(&H53) Then ' 下
goal_i = Players.i + 1 ' 目标位置在玩家位置的下边
goalNext_i = goal_i + 1 ' 目标的下一个位置,在其再下边
ElseIf IsKeyPress(&H41) Then ' 左
goal_j = Players.j -1 ' 目标位置在玩家位置的左边
goalNext_j = goal_j -1 ' 目标的下一个位置,在其再左边
ElseIf IsKeyPress(&H44) Then ' 右
goal_j = Players.j + 1 ' 目标位置在玩家位置的右边
goalNext_j = goal_j + 1 ' 目标的下一个位置,在其再右边
End If
'根据不同地图元素的情况,判断如何移动角色和更新地图元素
If Mid(level(goal_i), goal_j + 1, 1) = "e" Or Mid(level(goal_i), goal_j + 1, 1) = "t" Then
'如果目标位置是empty,或者target
Players.i = goal_i
Players.j = goal_j
ElseIf Mid(level(goal_i), goal_j + 1, 1) = "b" And Mid(level(goalNext_i), goalNext_j + 1, 1) = "e" Then
' 如果目标位置是box,再前面一个是empty
Players.i = goal_i ' 玩家移动到目标位置
Players.j = goal_j
Mid(level(goal_i), goal_j + 1, 1) = "e" ' 目标位置变成empty
Mid(level(goalNext_i), goalNext_j + 1, 1) = "b" ' 再前面变成box
ElseIf Mid(level(goal_i), goal_j + 1, 1) = "b" And Mid(level(goalNext_i), goalNext_j + 1, 1) = "t" Then
' 如果目标位置是box,再前面一个是target
Players.i = goal_i ' 玩家移动到目标位置
Players.j = goal_j
Mid(level(goal_i), goal_j + 1, 1) = "e" ' 目标位置变成empty
Mid(level(goalNext_i), goalNext_j + 1, 1) = "a" '再前面变成achieved
ElseIf Mid(level(goal_i), goal_j + 1, 1) = "a" And Mid(level(goalNext_i), goalNext_j + 1, 1) = "e" Then
'如果目标位置是achieved,再前面一个是empty
Players.i = goal_i ' 玩家移动到目标位置
Players.j = goal_j
Mid(level(goal_i), goal_j + 1, 1) = "t" ' 目标位置变成target
Mid(level(goalNext_i), goalNext_j + 1, 1) = "b" ' 再前面变成box
ElseIf Mid(level(goal_i), goal_j + 1, 1) = "a" And Mid(level(goalNext_i), goalNext_j + 1, 1) = "t" Then
'如果目标位置是achieved,再前面一个是target
Players.i = goal_i ' 玩家移动到目标位置
Players.j = goal_j
Mid(level(goal_i), goal_j + 1, 1) = "t" ' 目标位置变成target
Mid(level(goalNext_i), goalNext_j + 1, 1) = "a" ' 再前面变成achieved
Else '其他情况都推不动
Return ' 不做任何处理,函数直接返回
End If
End If
End If
End Sub
读者可以自己更改代码,看看是否和预料的结果一样。如果不同,自己试着排除错误。
评论一下?