这是针对VB.NET 2017的。我正在创建一个程序,以保持最佳成绩。程序中的计时器像秒表一样运行。最后,我想将过去游戏的最佳记录与新游戏的当前时间进行比较。如果新游戏的时间更快,那么我想将其替换为数据文件。我可以做到这一点,但有时会比最快的时间慢一些。我尝试了多种情况,但无法保持一致。如果有人可以帮助,将不胜感激。我有一些消息框,所以我可以看到一些结果。正常运行后,它们会被注释掉。
If TotalBalls = 2 And SelectPoison = 2 Then
tmrTime.Enabled = False
CurrentScore = lblTime.Text
MsgBox("You win.")
'''''''''''''''''''''''''''''''''''''''''''''''''''
' CurrentScore = lblTime.Text
MsgBox("Current Time is " & CurrentScore)
NewScoreCheck = String.Compare(CurrentScore, RecordHighScore)
MsgBox(NEwScoreCheck)
'NewScoreCheck will be less than 0 if CurrentScore is less (alphabetically) than RecordhighScore
'NewScoreCheck will be greater than 0 if RecordHighSchore is greater than CurrentScore
If NewScoreCheck < 0 Then
MsgBox(CurrentScore)
Try
MsgBox("In the try statement. Writing new time")
Dim FileWrite As System.IO.StreamWriter
FileWrite = New System.IO.StreamWriter("PoisonHighScore.TXT", False)
FileWrite.WriteLine(CurrentScore)
FileWrite.Close()
Catch
MsgBox("Saving error")
End Try
Else
MsgBox("Not the fastest time.")
End If
Else
MsgBox("You lose.")
End If
strExit = MsgBox("Do you want to play again?", vbYesNo)
If strExit = vbYes Then
Application.Restart()
End If
End Sub
编辑1:我使用一些变量作为TimeSpan,这就是为什么我将CurrentScore和RecordHighScore的值设置为Strings的原因。当我使用TimeSpan时,它将不会存储为Integer并将返回错误。我正在寻找一种比较两次的方法,但是需要以一种可以比较它们的方式存储它们,这就是为什么我使用了上面提到的比较字符串方法的原因。在查看以下解决方案后,我了解到我为什么不能这样做。我的问题现在变成了如何存储它们,因为它不能存储为双精度,单精度或整数?
为了更清楚一点,请考虑两位赛车手在两个不同的时间结束,而这些时间是不可预测的。最快的时间将获胜,我们将把获胜者的时间写入文本文件(我知道该怎么做)。
P.S。我也尝试过CInt(CurrentScore)
答案 0 :(得分:1)
马上就可以进行一些隐式类型转换,例如:
CurrentScore = lblTime.Text
大概CurrentScore是数字数据类型(如Integer或Double),但是您将值设置为等于String。要更正这些错误,请打开Option Strict。更深入地看,这似乎是您的问题,因为您使用String.Compare方法按字母顺序比较分数。举个例子,当您分别通过1112
和121
作为当前分数和高分时,String.Compare返回-1,但是显然121
比1112
快
您需要做的是将所有数值转换为数值数据类型,然后使用适当的comparison operator比较它们。
答案 1 :(得分:0)
如果您希望Timer
的行为像秒表,那为什么不使用StopWatch
?如果您使用StopWatch
,则可以获得ElapsedMilliseconds
,它返回一个长整数。 Stop
方法只会暂停计时器;您需要调用Reset
方法将StopWatch重置为零。将ElapseMilliseconds收集到变量中后,调用此函数。
NewScoreCheck = String.Compare(CurrentScore, RecordHighScore)
字符串的比较方法与数字相同。
Dim a As String = "72"
Dim b As String = "100"
If String.Compare(a, b) < 0 Then
MessageBox.Show("a comes first")
Else
MessageBox.Show("b comes First")
End If
结果b首先出现!
使用MsgBox检查值不是一个好主意。 Visual Studio具有各种出色的调试工具。不可避免地,您会忘记删除MsgBox;我有 :-)。使用Debug.Print,它将不在发行版本中。
Dim sw As New Stopwatch()
Private Sub BeginGame()
sw.Start()
End Sub
Private Sub OPCode2()
Dim TimeInMilliseconds As Long = sw.ElapsedMilliseconds
Dim TotalBalls As Integer = 2
Dim SelectPoison As Integer = 2
Dim RecordHighScore As Long
Dim CurrentScore As Long
If TotalBalls = 2 And SelectPoison = 2 Then
sw.Stop()
CurrentScore = sw.ElapsedMilliseconds
sw.Reset() 'So you can play again and get a new time
MsgBox("You win.")
'''''''''''''''''''''''''''''''''''''''''''''''''''
Debug.Print($"Current Time is {CurrentScore}")
If CurrentScore > RecordHighScore Then
Try
Debug.Print("In the try statement. Writing new time")
Dim FileWrite As System.IO.StreamWriter
FileWrite = New System.IO.StreamWriter("PoisonHighScore.TXT", False)
FileWrite.WriteLine(CurrentScore.ToString)
FileWrite.Close()
Catch
MsgBox("Saving error")
End Try
Else
MsgBox("Not the fastest time.")
End If
Else
MsgBox("You lose.")
End If
Dim strExit As MsgBoxResult
strExit = MsgBox("Do you want to play again?", vbYesNo)
If strExit = vbYes Then
'Not a good way to do this, clear your variables and UI
Application.Restart()
End If
End Sub