开发一个VBScript版本的"猜数字"游戏

时间:2016-07-07 12:58:50

标签: vbscript

我已经在StackOverflow上搜索过,并且看到了"猜数字"以前讨论过游戏,例如:How to create a number guessing game in JavaScript。但是,我的挑战是使用VBScript执行此操作。

我是编程新手,我一直在研究这段代码几十个小时无济于事。出于某种原因,代码会跳过部分并出现问题循环。具体地,代码(第45行)要求用户输入他们的猜测。一旦他们这样做,代码就会跳过第49行及以后的代码,从而导致脚本崩溃。脚本应该执行if - then序列(第48-68行)以针对随机数测试用户输入,同时为它们提供过高或过低的反馈。

我该如何解决?任何帮助将不胜感激。

'Initialization Section

Option Explicit

Const cGreetingMsg = "Pick a number between 1 - 100"

Dim intUserNumber, intRandomNo, strOkToEnd, intNoGuesses, strOkToEnd1

Randomize
intRandomNo = FormatNumber(Int((100 * Rnd) + 1))
intNoGuesses = 0

function GetPlayersName()
GetPlayersName = InputBox("What is your first name? ")


'Main Processing Section


End Function


select case strOkToEnd

    case 1 
    If FormatNumber(intUserNumber) < intRandomNo Then 

          'Test to see if the user's guess was too low
        MsgBox "Your guess was too low. Try again", ,cGreetingMsg
        End If 

    case 2

    If FormatNumber(intUserNumber) > intRandomNo Then
        MsgBox "Your guess was too high. Try again", , cGreetingMsg
        End If 

'Loop until either the user guesses correctly or the user clicks on Cancel
End Select



'Generate a random number

Do Until strOkToEnd = "yes"
  'Prompt user to pick a number
  intUserNumber = InputBox("Type your guess:", GetPlayersName, cGreetingMsg)
  intNoGuesses = intNoGuesses + 1
    'See if the user provided an answer  
    If Len(intUserNumber) <> 0 Then
        'Make sure that the player typed a number
    If IsNumeric(intUserNumber) = True Then
    Else
    If IsNumeric(intUserNumber) = False Then
    MsgBox "Sorry.  You did not enter a number.  Try Again."
    strOkToEnd = "yes"
    'Test to see if the user's guess was correct
    If FormatNumber(intUserNumber) = intRandomNo Then
          MsgBox "Congratulations! You guessed it. The number was " & _
          intUserNumber & "." & vbCrLf & vbCrLf & "You guessed it " & _
          "in " & intNoGuesses & " guesses.", ,cGreetingMsg
          strOkToEnd = "yes"
    End If
    End If
    End If
    End If
Exit Do 
Loop

2 个答案:

答案 0 :(得分:0)

让我们从一般建议开始:

  • 当您遇到代码问题时,请仔细考虑并考虑每行会发生什么。遵循执行流程。

  • 如果您不确定要发生什么,可以输入一个MsgBox语句来打印变量并查看其值。

  • 首先尝试在评论或自己的论文中写出您需要的步骤。看起来您可能有评论指导您,但看起来这些都没有在您进行更改时更新。

  • 当您编写代码时,请尝试一致地缩进,这样您就可以知道自己何时进入循环或if等等。(公平地说,这可能只是来自复制你的问题中的代码)

更具体的内容。首先考虑一下你想要完成的最少的事情。你想要这个:

'Get a random number
'Loop until user is correct or wants to exit
    'Ask user to input a number
    'Check the number against your randomly selected number
    'Output result

你的Select语句完全在循环之外,当你到达那里时,它实际上没有初始化它所选择的值。你也没有其他情况,所以这部分永远不会做任何事情。 strOkToEnd看起来主要用作退出标志,并且只设置为&#34; yes&#34;无论如何,所以我不确定你为什么要在这里寻找1或2。 (对于这样的标志,布尔值将是更好的选择。)对于用户号码过高和过低的检查也是如此,因此这些行将被遗漏。

循环开始很好。我在循环开始时看到的唯一问题是,在开始时调用GetPlayerName,以便每次迭代都会询问用户的名字。你应该在循环外调用它并保存值。循环结束是一个问题。最后一行是&#34;退出Do&#34;,这意味着循环永远不会执行多次。

当你开始处理输入时,事情会变得混乱。请注意,将if语句嵌套多个层会使事情变得复杂。每个级别的嵌套都会增加复杂性,因此请尽量减少这种复杂性。为此,您可以使用&#34; AND&#34;等工具。或者&#34; ElseIf ...然后&#34;。

第一个If检查输入长度不是= 0.如果该长度为0,则不执行任何操作。其他所有内容都嵌套在此内部,因此无需输入任何内容。包含这样的东西很好,但最好确保通过该程序的快乐路径先工作。如果您确实发现了输入问题,请尝试提供错误输出以让用户知道,并确保循环仍然将其取回。

所以,让我们说输入长度不是0,所以我们进入那个区块。下一项检查是针对IsNumeric的。如果输入是数字,则不执行任何操作。这是一个问题。你想在这里进行比较,在&#34; If IsNumeric(intUserNo)= True然后&#34;块。另请注意,如果函数返回True或False,则您不希望包含&#34; =真&#34;部分,它足以说&#34;如果是IsNumeric(intUserNo)那么&#34;。

当不是数字时,该功能将按原样进入Else。在这个Else中,&#34; If IsNumeric(intUserNumber)&#34;检查除了增加复杂性之外什么都不做。在其中,您输出正确的错误消息并设置退出标志,但然后(仍然在输入不是数字时执行的块内),您检查他们的数字是否与您的匹配。

这是VBS中数字游戏猜测的精简版:

Option Explicit

Dim intUserNo, intRandomNo, boolExit

'Get random number
Randomize
intRandomNo = Int((100 * Rnd) + 1)

'Loop until number is guessed
boolExit = False
Do Until boolExit
    'Prompt user for number
    intUserNo = InputBox("Guess a number:")
    intUserNo = cInt(intUserNo)

    'See if user number matches the random number
    If intUserNo = intRandomNo Then
        MsgBox "Congratulations! You guessed it!"
        boolExit = True 
    ElseIf intUserNo > intRandomNo Then
        MsgBox "Too high"
    Else
        MsgBox "Too low"
    End If
Loop

即使过期,它仍然是功课。因此,我将为您提供额外的功能。

希望有所帮助。

答案 1 :(得分:-1)

这是在Visual Studio 2017中,它在控制台中运行,只需将所有内容粘贴到Console项目中。

模块模块1

Sub Main()

    Dim displayMenu As Boolean = True
    While (displayMenu)
        displayMenu = MainMenu()

    End While
End Sub


Function MainMenu() As Boolean
    Console.Clear()
    Console.WriteLine("Choose an option: ")
    Console.WriteLine("1 - Print Numbers")
    Console.WriteLine("2 - Guessing Game")
    Console.WriteLine("3 - Exit")

    Dim result As String = Console.ReadLine()

    If result = "1" Then
        Return PrintNumbers()
    ElseIf result = "2" Then
        Return GussingGame()
    ElseIf result = "3" Then
        Return False
    Else
        Return True
    End If

End Function

Function PrintNumbers() As Boolean

    Console.Clear()
    Console.WriteLine("Type a number: ")
    Dim result As Integer = CInt(Console.ReadLine())
    Dim counter As Integer = 1
    While counter < result + 1
        Console.Write(counter)
        Console.Write(" - ")
        counter += 1
    End While
    Console.ReadLine()
    Return True

End Function

Function GussingGame() As Boolean

    Console.Clear()
    Console.WriteLine("Type a number: ")
    Dim random As New Random()
    Dim randomNumber As Integer = random.Next(1, 11)
    Dim guesses As Integer = 0
    Dim incorrect As Boolean = True

    Do While incorrect = True
        Console.Write(" Guess a number between 1 and 10:")
        Dim result As String = Console.ReadLine()
        guesses += 1
        If result = randomNumber.ToString() Then
            incorrect = False


        ElseIf result < randomNumber Then
            Console.WriteLine("Wrong. too low")

        ElseIf result > randomNumber Then
            Console.WriteLine("Wrong. too high")

        Else
            Console.WriteLine("Wrong")
        End If
    Loop

    Console.WriteLine("Correct! It took you {0} guesses.", guesses)
    Console.ReadLine()
    Return True

End Function

结束模块

&#39;我正在教自己,并且发现太高太低但是 帮助看别人写的东西。可能有一种更简单的方法 &#39;我希望它有所帮助。我从微软虚拟学院获得了大部分 &#39; https://mva.microsoft.com/en-US/training-courses/visual-basic-fundamentals-for-&#39;?绝对初学者-16507升= sg5H0OKbC_8306218965