1

動くキャラクターが落下する「果物」/ASCII 文字を傍受するために左右に移動する必要があるコンソール ゲームを作成していますが、私だけが問題を抱えています。私は1秒間隔のタイマーを使用しています.タイマーが経過するたびに、すでにボードにある果物のリストをチェックし、各果物を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

参照されている命令クラスは、コンソールで文字を再描画するために使用されます。

文字が余白で描かれるべきところに文字が続く、フルーツが 1 文字ではなく 2 文字落ちる、フルーツが前のフルーツの左側にスポーンして停止するなど、奇妙な問題が発生しています。特にデバッグに問題があります。ブレークポイントを設定してコードにステップ インすると、デバッガーが不規則に場所を移動するように見えます。タイマーが一時停止している間もタイマーがまだ実行されていて、速度が遅すぎるようです。

行ごとに適切にデバッグする方法はありますか、それとも何が起こっているのかについて賢明な推測をする必要がありますか?

4

1 に答える 1

1

経過したメソッドでは、タイマーを停止する必要があります。最初の行でタイマーを停止し、最後の行で有効にしてください。

Sub FruitTick() Handles FruitTimer.Elapsed
    FruitTimer.Enabled = False

    ' Your actual code

    FruitTimer.Enabled = True
End Sub

おそらく、コードが 1 秒以上続き、最後の実行が完了する前にコードが再び開始されます。これは、デバッグ時により明白です。おそらくすべての問題が発生し、最終的にメモリの問題が発生します。

于 2013-08-05T15:38:52.667 に答える