我正在制作一个控制台游戏,其中一个移动的角色必须左右移动以拦截掉落的'果实'/ ASCII字符,只有我遇到麻烦。我正在使用一个间隔为1秒的计时器,每次经过时,它应该检查已经在板上的水果列表并将每个水果向下移动一个,然后随机将新水果插入板上。水果都是作为课堂上的对象。
这是计时器代码:
Sub FruitTick() Handles FruitTimer.Elapsed
Dim RandomNumber As Integer
Dim Fruit As Fruit
For i = 0 To FruitList.Count - 1
If FruitList(i).Position.Y < FruitBoard.Height - 1 Then
FruitList(i).LowerFruitByOne()
End If
Next
PeriodUntilFruitAppears -= 1
If PeriodUntilFruitAppears <= 0 Then
PeriodUntilFruitAppears = FruitFrequency
RandomNumber = New Random().Next(1, 5)
If RandomNumber = 1 Then
Fruit = New Fruit()
Fruit.AddToList()
Fruit.PlaceOnBoard()
End If
End If
End Sub
这是Fruit的课程:
Public Class Fruit
Private FruitIcons() As Char = {"#", "ð", "ó", "ç", "%", "$"}
Public Icon As Char
Public Position As Location
Public Colour As ConsoleColor
Sub New()
Me.Icon = FruitIcons(New Random().Next(FruitIcons.Length))
Me.Position = New Location(New Random().Next(FruitBoard.Width), 0)
Me.Colour = New Random().Next(1, 16)
End Sub
Sub New(_Icon As Char, _
_Position As Location, _
_Colour As ConsoleColor)
Me.Icon = _Icon
Me.Position = New Location(_Position.X, 0)
Me.Colour = _Colour
End Sub
Sub PlaceOnBoard()
Console.SetCursorPosition(FruitBoard.Position.X + Me.Position.X, FruitBoard.Position.Y + Me.Position.Y)
Console.ForegroundColor = Me.Colour
Console.BackgroundColor = FruitBoard.BackColour
Console.Write(Me.Icon)
End Sub
Sub AddToList()
FruitList.Add(Me)
End Sub
Sub LowerFruitByOne()
Dim DrawInstruction As Instruction
DrawInstruction = New Instruction(" ", _
New Location(FruitBoard.Position.X + Me.Position.X, _
FruitBoard.Position.Y + Me.Position.Y), _
FruitBoard.BackColour, _
FruitBoard.BackColour)
DrawInstruction.Execute()
Me.Position.Y += 1
DrawInstruction = New Instruction(Me.Icon, _
New Location(FruitBoard.Position.X + Me.Position.X, _
FruitBoard.Position.Y + Me.Position.Y), _
Me.Colour, _
FruitBoard.BackColour)
DrawInstruction.Execute()
End Sub
End Class
所引用的指令类仅用于在控制台中重绘字符。
我遇到了一些奇怪的问题,例如尾随字符应该被空白区域覆盖,水果掉落两个字符而不是一个,水果产生在前一个水果的左边然后停止等等。 ..但我在调试它时遇到了问题。当我放入一个断点并进入代码时,调试器似乎不规则地从一个地方到另一个地方,好像计时器在它暂停时仍在运行而且我太慢了。
有没有办法正确地,逐行地调试它,或者我将不得不对正在发生的事情做出明智的猜测?
答案 0 :(得分:1)
您应该在经过时间的方法中停止计时器。尝试在beggning上停止计时器并在最后一行启用它。
Sub FruitTick() Handles FruitTimer.Elapsed
FruitTimer.Enabled = False
' Your actual code
FruitTimer.Enabled = True
End Sub
可能,您的代码持续时间超过一秒,代码在上次执行完成之前再次启动。调试时哪个更明显。它可能会产生所有问题,最终会导致内存问题。