gpt4 book ai didi

vb.net - VB.net计时器滴答事件问题

转载 作者:行者123 更新时间:2023-12-02 04:10:42 24 4
gpt4 key购买 nike

我编写了以下代码,以构建一个使两辆赛车比赛(randomgenerator)并使用户在最终结果上下注的基本游戏。我在某处犯了个严重错误,因为我的赛车仅在中途行驶,然后陷在起跑线后面,程序不断重复发出哔哔声和messsagebox.show并将结果添加到“不正确”框中。我花了最后三天的时间来弄清楚哪里出了问题,而我只是想念它。感谢您抽出宝贵的时间对此进行研究。我真的很感谢任何建议。

终止应用程序的唯一方法是单击“停止调试”。

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

最佳答案

您的计时器在每一刻都在做所有事情。在计时器的每个滴答声中都会处理处理比赛结束的代码。应该将其包含在处理比赛结束的if-logic中。

在发出“发出哔哔声表示比赛结束”的注释后,所有内容均应包含在检查比赛结束的范围内:

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

关于vb.net - VB.net计时器滴答事件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5337088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com