Haben Sie den Code bearbeitet, um ihn richtig einzurücken, was das Problem hervorheben sollte. Der Fehler ist, weil eine If
Anweisung nur eine Else
Bedingung haben kann, die Grundstruktur einer If
Anweisung ist;
If <boolean condition> Then
<true outcome>
Else
<false outcome>
End If
Im Moment haben Sie mehrere Instanzen von
If <boolean condition> Then
<true outcome>
Else
<false outcome>
Else
<unknown condition>
End If
die ungültige Syntax ist nur, weil ein GrundIf
Anweisung True
oder False
zurückkehren kann.
Allerdings gibt es auch ElseIf
, die mehrere boolesche Bedingungen angeben und unterschiedliche Ergebnisse zurückgeben können.
Das sieht so aus;
If <boolean condition> Then
<true outcome>
ElseIf <boolean condition> Then
<true outcome>
ElseIf <boolean condition> Then
<true outcome>
Else
<false outcome>
End If
Basierend auf, wie Sie die If
Aussagen nisten der Code in Frage wie diese neu geschrieben werden könnte;
Randomize
value = Int((150 * Rnd + 1) * Rnd + lowerbound)
guess = InputBox("guess the number", "guess", "guess here")
If guess = value Then
Call MsgBox("correct", vbOKOnly + vbInformation + vbSystemModal, "guess")
WScript.Quit
ElseIf guess < value Then
Call MsgBox("too low", vbOKOnly + vbQuestion + vbSystemModal, "guess")
once = 1
Else
Call MsgBox("too high", vbOKOnly + vbQuestion + vbSystemModal, "guess")
End if
once = 1
Do
guess = InputBox("try again", "guess", "guess here")
If guess = value Then
Call MsgBox("correct", vbOKOnly + vbInformation + vbSystemModal, "guess")
ElseIf guess < value then
Call MsgBox("too low", vbOKOnly + vbQuestion + vbSystemModal, "guess")
Else
Call MsgBox("too high", vbOKOnly + vbQuestion + vbSystemModal, "guess")
End If
Loop
Paar Dinge über das Beispiel oben
Ersetzt die +
mit =
in der Linie
guess+inputbox("guess the number","guess","guess here")
zu beachten, da es nicht das Ergebnis der InputBox()
-guess
zuweisen Ich gehe davon aus, dass du es tust. Wenn Sie das Ergebnis von InputBox()
-guess
zu verketten versuchen, das würde immer noch nicht funktionieren werden Sie
guess = guess + InputBox("guess the number", "guess", "guess here")
verwenden, wenn dies der Fall ist, obwohl ich persönlich bevorzuge &
über +
für String-Verkettung zu verwenden.
Die Klammern in MsgBox()
scheinen etwas seltsam zu sein, normalerweise würden Sie MsgBox()
ohne Klammern aufrufen, wenn das Ergebnis nicht zu einer Variablen wie diesem zurückgibt;
MsgBox "correct", vbOKOnly + vbInformation + vbSystemModal, "guess"
aber wenn man die Klammern enthalten wollte (wie ich tun bevorzugen) Sie nur Call
wie diese
Call MsgBox("correct", vbOKOnly + vbInformation + vbSystemModal, "guess")
, die die gefürchtete
Microsoft VBScript compilation error: Cannot use parentheses when calling a Sub
vermeidet verwenden können Die Funktion kann jedoch immer noch mit Klammern umgeben werden, wenn kein Wert zurückgegeben wird.
Sie haben vielleicht auch bemerkt, dass ich die hartcodierten numerischen Werte in MsgBox()
durch die Named Constants ersetzt habe, die für andere leichter zu lesen und ihre Bedeutung zu interpretieren ist. Sie sind auch in VBScript hart gekocht, also gibt es keine Entschuldigung dafür, sie nicht zu benutzen.
Denken über das, was Sie zu tun, dachte ich versucht, konnte erneut Faktor der Code ein wenig zu hoffnungsvoll, wie Sie
Dim value, guess, msg, once
Randomize
value = Int((150 * Rnd + 1) * Rnd + lowerbound)
Do
If once = 0 Then
msg = "guess the number"
Else
msg = "try again"
End If
guess = CInt(InputBox(msg, "guess", "guess here"))
If guess = value Then
Call MsgBox("correct", vbOKOnly + vbInformation + vbSystemModal, "guess")
WScript.Quit
ElseIf guess < value then
Call MsgBox("too low", vbOKOnly + vbQuestion + vbSystemModal, "guess")
once = 1
Else
Call MsgBox("too high", vbOKOnly + vbQuestion + vbSystemModal, "guess")
once = 1
End If
Loop
Dinge von diesem nehmen erwartet funktioniert;
Wir brauchen nur die eine InputBox()
innerhalb der Schleife sowohl die erste anfängliche Schätzung und die nachfolgenden „versuchen Sie es erneut“ Versuche zu behandeln. Dies bedeutet, dass wir das gleiche Stück Code nicht erneut duplizieren, siehe DRY Principle.
InputBox()
gibt einen String zurück, also versuchte der Code zuerst, einen String-Wert mit einem Integer-Wert zu vergleichen, der alle möglichen seltsamen Ergebnisse liefert. Wenn der Vergleich mit CInt()
in Ganzzahl erfolgt, beginnt der Vergleich wie erwartet zu funktionieren.
Meinst du, "else if" anstatt "else" oft zu verwenden. –
Oder vielleicht sollte die Zeile unter dem "else" in der gleichen Zeile wie die "else" sein, um es in ein "else if" zu verwandeln. Auch 'lowbound' ist nicht definiert und wird als 0 behandelt. –
Alternativ können Sie [' Select-Case'] (http://www.w3schools.com/asp/vbscript_conditionals.asp) verwenden, um schneller und besser lesbar zu sein Code. –