2013-08-05 101 views
0

我正在製作一個控制檯遊戲,其中一個移動的角色必須左右移動才能攔截下降的「水果」/ 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 

而這裏的類水果:稱

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

您應該在經過的方法中停止計時器。嘗試停止計時器並使其在最後一行啓用。

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

    ' Your actual code 

    FruitTimer.Enabled = True 
End Sub 

可能是,您的代碼持續一秒多,並且代碼在最後一次執行完成之前再次啓動。調試時更明顯。它可能會產生你所有的問題,最終會導致內存問題。

+0

+1對於一個有用的建議,雖然我剛剛嘗試過它,它仍然在做一些奇怪的事情,調試器沒有逐行執行代碼。在很多情況下,它執行相同的行兩次,我不能解決爲什麼! – Lou

+1

在主sub我使用GetAsyncKeyState函數來記錄按鍵來移動播放器,但這是獨立於FruitTimer,我看不出它會如何影響的東西。 – Lou