我必须为我的工作学习视觉基础,并且我已经在我自己的时间编写代码来帮助加快这个过程。我在这里有一个基本的控制台应用程序,我认为我没有错误地传递参数。
这个程序应该做的是在矩形中绘制一堆ASCII字母。其中一封信将代表玩家。当玩家按下一个键时,它应该清除屏幕并根据按下的箭头键将玩家重新绘制在新位置。
问题是我将所有代码分成子和函数,以便于维护和理解。现在它被打破了,当按下一个键时,玩家的位置不再变化。
Sub Game()
Dim width As Integer = 60
Dim height As Integer = 10
Dim playerX As Integer = 5
Dim playerY As Integer = 5
Dim cursorX As Integer = 0
Dim cursorY As Integer = 0
Dim numofTiles As Integer = 0
Dim keyPressed As ConsoleKeyInfo = Nothing
While True
numofTiles = 0
cursorY = 0
'Each time the screen is updated these variables need to go back to default
For i = 0 To height - 1
cursorY += 1
cursorX = 0
'we are starting on a new line so the X position of the cursor will go back to 0
For j = 0 To width - 1
DrawTiles(cursorX, playerX, cursorY, playerY)
cursorX += 1
numofTiles += 1
'update information since we just drew a char to the screen
Next
Console.WriteLine()
Next
keyPressed = Console.ReadKey()
If PlayerPressedLeftKey(keyPressed) Then
If LeftIsClear(playerX) Then
MovePlayerLeft(playerX)
End If
ElseIf PlayerPressedRightKey(keyPressed) Then
If RightIsClear(playerX, width) Then
MovePlayerRight(playerX)
End If
ElseIf PlayerPressedUpKey(keyPressed) Then
If TopIsClear(playerY) Then
MovePlayerUp(playerY)
End If
ElseIf PlayerPressedDownKey(keyPressed) Then
If BottomIsClear(playerY, height) Then
MovePlayerDown(playerY)
End If
End If
Console.Clear()
End While
End Sub
Sub DrawTiles(cursorX, playerX, cursorY, playerY)
If Not CursorIsOnPlayersPosition(cursorX, playerX, cursorY, playerY) Then
DrawBackgroundTile()
ElseIf CursorIsOnPlayersPosition(cursorX, playerX, cursorY, playerY) Then
DrawPlayer()
End If
End Sub
Function RightIsClear(playerX, width)
If playerX + 1 < width Then : Return True
Else : Return False
End If
End Function
Function LeftIsClear(playerX)
If playerX > 0 Then : Return True
Else : Return False
End If
End Function
Function BottomIsClear(playerY, height)
If playerY < height Then : Return True
Else : Return False
End If
End Function
Function TopIsClear(playerY)
If playerY - 1 > 0 Then : Return True
'top edge of screen is (X, 0)
Else : Return False
End If
End Function
Function CursorIsOnPlayersPosition(cursorX, playerX, cursorY, playerY)
If cursorX = playerX AndAlso cursorY = playerY Then
Return True
Else : Return False
End If
End Function
Sub DrawPlayer()
Console.ForegroundColor = ConsoleColor.Green
Console.Write("X")
Console.ResetColor()
End Sub
Sub DrawBackgroundTile()
Console.Write("-")
End Sub
Function PlayerPressedLeftKey(keyPressed)
If keyPressed.Key = ConsoleKey.LeftArrow Then
Return True
Else : Return False
End If
End Function
Function PlayerPressedRightKey(keyPressed)
If keyPressed.Key = ConsoleKey.RightArrow Then
Return True
Else : Return False
End If
End Function
Function PlayerPressedUpKey(keyPressed)
If keyPressed.Key = ConsoleKey.UpArrow Then
Return True
Else : Return False
End If
End Function
Function PlayerPressedDownKey(keyPressed)
If keyPressed.Key = ConsoleKey.DownArrow Then
Return True
Else : Return False
End If
End Function
Sub MovePlayerLeft(playerX)
playerX -= 1
End Sub
Sub MovePlayerRight(playerX)
playerX += 1
End Sub
Sub MovePlayerUp(playerY)
playerY -= 1
End Sub
Sub MovePlayerDown(playerY)
playerY += 1
End Sub
我很确定LeftIsClear(),RightIsClear()等函数是问题所在。
If LeftIsClear(playerX) Then
MovePlayerLeft(playerX)
End If
LeftIsClear()函数和MovePlayerLeft()子函数都将playerX作为参数,MovePlayerLeft()在LeftIsClear()中。我确信这会破坏代码,以便我无法再改变玩家的位置。
我知道这是一大块代码,但我想尽可能清楚地了解我的问题。重要的部分是while循环和函数所采用的参数。