2016-06-21 18 views
0

Ich habe ein Rock, Paper, Scissors-Spiel in Python erstellt, aber ich hatte Probleme, die Methode neu zu starten, wenn der Player einen ungültigen Befehl eingegeben hat. Wenn der Benutzer beim ersten Mal etwas anderes als 'r', 'p' oder 's' eingibt, wird immer der Wert None zurückgegeben, wenn ein korrekter Wert eingegeben wird. Ich fand, dass ich die Runde einfach neu starten könnte, aber als ich dem Spiel eine Wette hinzufügte, erwies es sich als Unbequemlichkeit.Python: Wie kann ich eine Methode neu starten, ohne irgendwelche Werte zu erfassen?

def get_input(): 
    choice = input("[R]ock, [P]aper, or [S]cissors? ").lower() 
    if choice == 'r': 
     return 'rock' 
    elif choice == 'p': 
     return 'paper' 
    elif choice == 's': 
     return 'scissors' 
    else: 
     print("That is not a valid command. Try again.") 
     get_input() 

choice = get_input() 
print(choice) 

die Ausgabe, wenn der Benutzer ein 'a' von einem 'p' folgt:

[R] ock, [P] aper oder [S] cissors? a
Das ist kein gültiger Befehl. Versuch es noch einmal.
[R] ock, [P] aper oder [S] cissors? p
Keine

+1

Beachten Sie, dass Sie nicht Ihre Methode "neu starten", Sie sind _recursing_ in Ihre Methode. Sie sollten eine "while choice not in 'rps" in Betracht ziehen: 'loop stattdessen - Mit Ihrer aktuellen Methode könnte ein Benutzer ungültige Werte eingeben, bis er den Rekursionspuffer überläuft und Ihr Programm zum Absturz bringt. –

Antwort

1

Um Ihren aktuellen Code zu beheben, sollten Sie return den Wert.

Wenn der Benutzer jedoch zu viele falsche Eingaben liefert, wird der Stapel am Ende zu groß. Was Sie wollen, ist eine Schleife:

def get_input(): 
    while True: 
     choice = input("[R]ock, [P]aper, or [S]cissors? ").lower() 
     if choice == 'r': 
      return 'rock' 
     elif choice == 'p': 
      return 'paper' 
     elif choice == 's': 
      return 'scissors' 
     # go through the loop again. 

choice = get_input() 
print(choice) 
+0

Könnten Sie die Antwort erweitern, um OP zu zeigen, wie es gemacht werden sollte? Wiederholte Aufrufe bei falscher Eingabe sind nicht die Art, Eingaben zu verarbeiten. – lejlot

+1

Gute Idee. Ich werde es tun –

+0

Dies ist ein schrecklicher Weg, es zu tun - was ist falsch mit einer while-Schleife - und Schleife bis eine gültige Eingabe. Rekursion zu validieren ist schrecklich. –

3

Bei der Texteingabe von einer interaktiven Shell Validierung, empfehle ich eine Schleife:

def get_input(): 
    while True: 
     choice = input("[R]ock, [P]aper, or [S]cissors? ").lower() 
     if choice == 'r': 
      return 'rock' 
     elif choice == 'p': 
      return 'paper' 
     elif choice == 's': 
      return 'scissors' 
     else: 
      print("That is not a valid command. Try again.") 

Beachten Sie, dass es OK ist while True in Python zu verwenden, weil es nein do ... while. Wenn es nur eine begrenzte Anzahl von Wiederholungen geben sollte, können Sie for _ in range(num_retries) verwenden.