1

以下代码揭示了我的理解中的差距。有人可以告诉我它是什么以及如何修复代码

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim NumberToGuess, Answer As Integer
    NumberToGuess = InputBox("Enter a Secret Number Between 1 and 20!")
    While Answer <> NumberToGuess
        Answer = InputBox("Please enter your guess")
        If IsNumeric(Answer) = False Then MsgBox("That ain't no number")
        If Answer > NumberToGuess Then MsgBox("Too high thicko. Try Again")
        If Answer < NumberToGuess Then MsgBox("Too Low chump. Try Again")
    End While
    MsgBox("Well done you guessed the right number")
End Sub
4

4 回答 4

2

这个问题有很多问题,您的问题对于您在谈论哪个问题含糊不清。所以我会在这里列出所有这些。

  1. 您将NumberToGuessand声明Answer为 Integer 并将其分配给InputBox. 但InputBox可以返回任何东西(数字或字母)。一旦您尝试将用户的输入分配给NumberToGuess. 那是在你检查它是否是数字之前。
  2. 如果有OPTION STRICT ON,它会显示编译错误“Option Strict On 不允许从 'String' 到 'Integer' 的隐式转换”。一般来说,保留OPTION STRICT ON是一种很好的做法,有助于避免看似无辜的错误。例如,在这里您将String类型分配给Integer变量,这是不允许的。
  3. 您已经使用了While带有InputBox. 除非他们给出正确的答案,否则用户无法取消游戏。InputBox 的取消按钮不起作用。
  4. If无论之前的条件如何,都将评估您的所有条件。我假设您希望一次只显示一个消息框。所以你可能也想利用ElseIf

为了解决这些问题,我们开始:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim NumberToGuess As String    '<-- declare as string because we will hold the result of InputBox in it.
    Dim Answer As String = ""      '<-- declare as string because we will hold the result of InputBox in it.

    NumberToGuess = InputBox("Enter a Secret Number Between 1 and 20!")
    While Answer <> NumberToGuess
        Answer = InputBox("Please enter your guess")
        If String.IsNullOrEmpty(Answer) Then Exit While '<-- if user pressed cancel button in InputBox.
        If Not IsNumeric(Answer) Then
            MsgBox("That ain't no number")
        ElseIf CInt(Answer) > CInt(NumberToGuess) Then
            MsgBox("Too high thicko. Try Again")
        ElseIf CInt(Answer) < CInt(NumberToGuess) Then
            MsgBox("Too Low chump. Try Again")
        Else
            ' neither less nor more. so this is the correct answer.
            MsgBox("Well done you guessed the right number")
            Exit While
        End If
    End While
End Sub

然而,上面的代码是一个很大的烦恼,因为 a MessageBox,然后InputBox, thenMessageBox , thenInputBox... 要解决这个问题,您可以在其InputBox本身中显示消息。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim NumberToGuess As String    '<-- declare as string because we will hold the result of InputBox in it.
    Dim Answer As String = ""      '<-- replace with whatever answer you are expecting.
    Dim Message As String = "Please enter your guess"

    NumberToGuess = InputBox("Enter a Secret Number Between 1 and 20!")
    While Answer <> NumberToGuess
        Answer = InputBox(Message)
        If String.IsNullOrEmpty(Answer) Then Exit While '<-- if user pressed cancel button in InputBox.
        If Not IsNumeric(Answer) Then
            Message = "That ain't no number"
        ElseIf CInt(Answer) > CInt(NumberToGuess) Then
            Message = "Too high thicko. Try Again"
        ElseIf CInt(Answer) < CInt(NumberToGuess) Then
            Message = "Too Low chump. Try Again"
        Else
            ' neither less nor more. so this is the correct answer.
            MsgBox("Well done you guessed the right number")
            Exit While
        End If
    End While
End Sub
于 2014-08-30T10:16:36.900 回答
1

没什么大不了的——你只是错过了一些else;)

private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim NumberToGuess, Answer As Integer
    NumberToGuess = InputBox("Enter a Secret Number Between 1 and 20!")
    While Answer <> NumberToGuess
        Answer = InputBox("Please enter your guess")
        If IsNumeric(Answer) = False Then MsgBox("That ain't no number")
        Else
            If Answer > NumberToGuess Then MsgBox("Too high thicko. Try Again")
            If Answer < NumberToGuess Then MsgBox("Too Low chump. Try Again")
        End If
    End While
    MsgBox("Well done you guessed the right number")

End Sub

问题是,如果您只是这样写,则检查第一个条件-如果您不输入数字,则会显示消息并检查您的下一个条件-您显然只希望检查那些是否是数字。所以把它包装在一个Else块内

顺便说一句:我不认为 for 的缺失值Answer是个问题,但我现在无法检查(我的 Linux Distro 上的 MonoDevelop 与 VB.net 存在一些问题 :( - 请调试您的代码以确定是否存在问题)

于 2014-08-30T09:48:20.063 回答
1

问题在于InputBox 函数的返回值。
它返回一个字符串,您尝试将其分配给一个整数变量。
这会强制 VB 编译器执行从字符串到整数的隐式转换,并且在您输入有效数字之前它可以工作,但是如果您将输入框留空,则隐式转换会失败并引发InvalidCastException.

如果您使用Option Strict On编译代码,这将在构建过程中被捕获。
没有它,您的程序会在分配时崩溃。
NumberToGuess 的赋值也存在同样的问题

Dim NumberToGuess, Answer As Integer
While True
    Dim input = InputBox("Enter a Secret Number Between 1 and 20!")
    if IsNumeric(input) Then
        NumberToGuess = Convert.ToInt32(input)
        Exit While
    Else
        MsgBox("Not a valid number")
    End If
End While    
While Answer <> NumberToGuess
    Dim result = InputBox("Please enter your guess")
    If IsNumeric(result) = False Then 
       MsgBox("That ain't no number")
    Else
       Answer = Convert.ToInt32(result)
       If Answer > NumberToGuess Then MsgBox("Too high thicko. Try Again")
       If Answer < NumberToGuess Then MsgBox("Too Low chump. Try Again")
    End If
End While
MsgBox("Well done you guessed the right number")

我还应该补充一点, Carsten Konig 先生的回答正确地指出了您的逻辑代码流中的错误。

于 2014-08-30T09:52:46.277 回答
0

您可以使用:

 Dim NumberToGuess, Answer As Integer
        NumberToGuess = InputBox("Enter a Secret Number Between 1 and 20!")
        While Answer <> NumberToGuess
            Answer = InputBox("Please enter your guess")
            If IsNumeric(Answer) = False Then
                MsgBox("That ain't no number")
            Else
                Select Case Answer < NumberToGuess
                    Case True
                        MsgBox("Too Low chump. Try Again")
                    Case False
                        MsgBox("Too high thicko. Try Again")
                    Case Else
                        MsgBox("Well done you guessed the right number")
                End Select
            End If
        End While
于 2014-08-30T09:58:19.473 回答