2011-03-17 105 views
3

我寫了下面的代碼來構建一個基本的遊戲,使兩輛賽車(randomgenerator),並讓用戶選擇他們對最終結果的賭注。我在某個地方犯了一個錯誤,我的賽車只是半路賽跑,然後卡在起跑線後面,程序不停地重複嗶嗶聲和messsagebox.show,並將結果添加到「錯誤」框中。我花了三天的時間試圖找出我出錯的地方,我只是想念它。感謝您花時間看這個。我非常感謝任何建議。VB.net計時器滴答事件問題

終止應用程序的唯一方法是點擊「停止調試」。

Screen shot of application

Option Explicit On 
Option Strict On 

Public Class MainForm 

    Private Sub exitButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles exitButton.Click 
     Me.Close() 
    End Sub 


    Private Sub MainForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     'fills the list box with items, then selects the first item 
     resultListBox.Items.Add("No guess") 
     resultListBox.Items.Add("Tie") 
     resultListBox.Items.Add("Red Car wins") 
     resultListBox.Items.Add("White car wins") 
     resultListBox.SelectedIndex = 0 
    End Sub 

    Private Sub startButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles startButton.Click 
     raceTimer.Enabled = True 

    End Sub 

    Private Sub raceTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles raceTimer.Tick 
     ' moves two cars from a starting line to a finish line on the form 
     ' displays a message indicating the race results 
     ' calculates and displays the number of times the user selects the 
     ' correct race result from the resultlistbox, and the number 
     ' of times the user selects an incorrect race result 

     Dim randomgenerator As New Random 
     Dim whitenewlocation As Integer 
     Dim rednewlocation As Integer 
     Dim raceresult As String 
     Dim userchoice As String 
     Dim finishline As Integer = finishTextBox.Left + 1 
     Static numbercorrect As Integer 
     Static numberincorrect As Integer 

     ' save the user's list box selection, then disable the list box 
     userchoice = resultListBox.SelectedItem.ToString 
     resultListBox.Enabled = False 

     'calculate the new location of each picture box's right border 
     ' don't allow the right border to go beyond the finish line 
     whitenewlocation = whitePictureBox.Right + randomgenerator.Next(0, 11) 
     If whitenewlocation > finishline Then 
      whitenewlocation = finishline 
     End If 
     rednewlocation = redPictureBox.Right + randomgenerator.Next(0, 11) 
     If rednewlocation > finishline Then 
      rednewlocation = finishline 
     End If 

     'move each picture box toward the finish line 
     whitePictureBox.SetBounds(whitenewlocation - whitePictureBox.Width, 0, 0, 0, BoundsSpecified.X) 
     redPictureBox.SetBounds(rednewlocation - redPictureBox.Width, 0, 0, 0, BoundsSpecified.X) 

     'the following selection structure is processed only when at least 
     ' one of the picture boxes is at the finish line 
     If whitePictureBox.Right = finishline _ 
      OrElse redPictureBox.Right = finishline Then 
      'disable the timer 
      raceTimer.Enabled = False 
     End If 

     'sound a beep to indicate the end of the race 
     For x As Integer = 1 To 5 
      Console.Beep(100, 100) 
     Next x 

     'store the result of the race in a variable 
     If whitenewlocation = rednewlocation Then 
      raceresult = "Tie" 
     ElseIf whitenewlocation > rednewlocation Then 
      raceresult = "White car wins" 
     Else 
      raceresult = "red car wins" 
     End If 

     'display the race results 
     MessageBox.Show("Race Over!" & ControlChars.NewLine & raceresult, _ 
     "Car Race", MessageBoxButtons.OK, MessageBoxIcon.Information) 

     'move the picture boxes back to the starting line 
     whitePictureBox.SetBounds(12, 0, 0, 0, BoundsSpecified.X) 
     redPictureBox.SetBounds(12, 0, 0, 0, BoundsSpecified.X) 


     'if the user did not want to guess the race results, then 
     'don't update or display the counter values; otherwise, 
     'compare the race results to the user's selection and update 
     ' the appropriate counter, then display both counter values 
     If userchoice <> "no guess" Then 
      If raceresult = userchoice Then 
       numbercorrect = numbercorrect + 1 
      Else 
       numberincorrect = numberincorrect + 1 
      End If 
      correctLabel.Text = Convert.ToString(numbercorrect) 
      incorrectLabel.Text = Convert.ToString(numberincorrect) 
     End If 

     'enable the list box 
     resultListBox.Enabled = True 
    End Sub 
End Class 

回答

1

你的計時器是做每個替一切。處理比賽結束的代碼將在計時器的每個時間點進行處理。它應該包含在處理比賽結束的if邏輯中。

評論「發出蜂鳴聲來表示比賽結束」後

的allmost eveything應該是檢查比賽結束內部:

If whitePictureBox.Right = finishline OrElse redPictureBox.Right = finishline Then 
    'put all logic of the "ending" of the race here 
end if 

所以這個代碼將作爲你的預期:

Private Sub raceTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RaceTimer.Tick 
    ' moves two cars from a starting line to a finish line on the form 
    ' displays a message indicating the race results 
    ' calculates and displays the number of times the user selects the 
    ' correct race result from the resultlistbox, and the number 
    ' of times the user selects an incorrect race result 

    Dim randomgenerator As New Random 
    Dim whitenewlocation As Integer 
    Dim rednewlocation As Integer 
    Dim raceresult As String 
    Dim userchoice As String 
    Dim finishline As Integer = finishTextBox.Left + 1 
    Static numbercorrect As Integer 
    Static numberincorrect As Integer 

    ' save the user's list box selection, then disable the list box 
    userchoice = resultListBox.SelectedItem.ToString 
    resultListBox.Enabled = False 

    'calculate the new location of each picture box's right border 
    ' don't allow the right border to go beyond the finish line 
    whitenewlocation = whitePictureBox.Right + randomgenerator.Next(0, 11) 
    If whitenewlocation > finishline Then 
     whitenewlocation = finishline 
    End If 
    rednewlocation = redPictureBox.Right + randomgenerator.Next(0, 11) 
    If rednewlocation > finishline Then 
     rednewlocation = finishline 
    End If 

    'move each picture box toward the finish line 
    whitePictureBox.SetBounds(whitenewlocation - whitePictureBox.Width, 0, 0, 0, BoundsSpecified.X) 
    redPictureBox.SetBounds(rednewlocation - redPictureBox.Width, 0, 0, 0, BoundsSpecified.X) 

    'the following selection structure is processed only when at least 
    ' one of the picture boxes is at the finish line 
    If whitePictureBox.Right = finishline _ 
     OrElse redPictureBox.Right = finishline Then 
     'disable the timer 
     RaceTimer.Enabled = False 
     'sound a beep to indicate the end of the race 
     For x As Integer = 1 To 5 
      Console.Beep(100, 100) 
     Next x 

     'store the result of the race in a variable 
     If whitenewlocation = rednewlocation Then 
      raceresult = "Tie" 
     ElseIf whitenewlocation > rednewlocation Then 
      raceresult = "White car wins" 
     Else 
      raceresult = "red car wins" 
     End If 

     'display the race results 
     MessageBox.Show("Race Over!" & ControlChars.NewLine & raceresult, _ 
     "Car Race", MessageBoxButtons.OK, MessageBoxIcon.Information) 

     'move the picture boxes back to the starting line 
     whitepicturebox.SetBounds(12, 0, 0, 0, BoundsSpecified.X) 
     redpicturebox.SetBounds(12, 0, 0, 0, BoundsSpecified.X) 


     'if the user did not want to guess the race results, then 
     'don't update or display the counter values; otherwise, 
     'compare the race results to the user's selection and update 
     ' the appropriate counter, then display both counter values 
     If userchoice <> "no guess" Then 
      If raceresult = userchoice Then 
       numbercorrect = numbercorrect + 1 
      Else 
       numberincorrect = numberincorrect + 1 
      End If 
      correctlabel.Text = Convert.ToString(numbercorrect) 
      incorrectlabel.Text = Convert.ToString(numberincorrect) 
     End If 

     'enable the list box 
     Resultlistbox.Enabled = True 
    End If 


End Sub 
+0

沒辦法!非常感謝。我非常關注邏輯錯誤,所以我完全忽略了決策結構!這對我來說是一個巨大的學習曲線。非常感謝Stefan! – Wannabe 2011-03-17 10:41:17

相關問題