【问题标题】:Debugging using a timer使用定时器调试
【发布时间】:2013-08-05 15:22:08
【问题描述】:

我正在制作一个控制台游戏,其中移动角色必须左右移动才能拦截掉落的“水果”/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

所指的 Instruction 类只是用来在 Console 中重绘字符。

我遇到了一些奇怪的问题,例如尾随字符应该被空格覆盖,水果掉落两个字符而不是一个字符,水果在前一个水果的左侧产卵然后停止等等。 ..但我在调试它时特别有问题。当我在代码中设置断点并单步执行时,调试器似乎不规律地从一个地方移动到另一个地方,就好像定时器在它暂停时仍在运行,而我太慢了。

有什么方法可以逐行正确地调试它,还是我必须对正在发生的事情做出明智的猜测?

【问题讨论】:

    标签: vb.net debugging visual-studio-2012 timer console


    【解决方案1】:

    您应该在 elapsed 方法中停止计时器。尝试在开始时停止计时器并在最后一行启用它。

    Sub FruitTick() Handles FruitTimer.Elapsed
        FruitTimer.Enabled = False
    
        ' Your actual code
    
        FruitTimer.Enabled = True
    End Sub
    

    您的代码可能会持续超过一秒钟,并且在最后一次执行完成之前代码会再次启动。调试时更明显。它可能会产生你所有的问题,最终会导致内存问题。

    【讨论】:

    • +1 提供一个有用的建议,虽然我刚刚尝试过它仍然在做一些奇怪的事情,但调试器并没有逐行逐行执行代码。在许多情况下,它会执行同一行两次,我不知道为什么!
    • 在主子中,我使用 GetAsyncKeyState 函数来记录按键以移动播放器,但这与 FruitTimer 是分开的,我看不出它会如何影响事物。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2010-09-16
    • 2011-01-14
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多