比较最佳时间并不总是能正常工作,也不确定为什么

时间:2018-12-24 16:05:47

标签: string vb.net timer

这是针对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)

2 个答案:

答案 0 :(得分:1)

马上就可以进行一些隐式类型转换,例如:

CurrentScore = lblTime.Text

大概CurrentScore是数字数据类型(如Integer或Double),但是您将值设置为等于String。要更正这些错误,请打开Option Strict。更深入地看,这似乎是您的问题,因为您使用String.Compare方法按字母顺序比较分数。举个例子,当您分别通过1112121作为当前分数和高分时,String.Compare返回-1,但是显然1211112

您需要做的是将所有数值转换为数值数据类型,然后使用适当的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