我已经在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
答案 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