2017-11-03 1 views
-1

Ich schrieb Rock-Paper-Scissor-Spiel mit Python und ich habe Fehler, die ich nicht lösen kann. bitte hilfe.nicht unterstützte Operandentyp (en) für -: 'NoneType' und 'int'

import random 
p1 = random.randint(0, 2) 
def choosing(): 
    p = int(input("Rock: 0; Paper: 1; scissor: 2:")) 
    if p < 0 or p > 2: 
     print("\nPlease enter valid value") 
     choosing() 
    else: 
     return int(p) 
p2 = choosing() 

print ("\n" + str(p1)) 
if p1 == p2: 
    print("DRAW!!") 
elif p2 - p1 == 1 or p1 - p2 == 2: 
    print("YOU WON!!") 
elif p1 - p2 == 1 or p2 - p1 == 2: 
    print("YOU LOSE!!") 

Fehler sagt

> Traceback (most recent call last): 
    File "python", line 15, in <module> 
TypeError: unsupported operand type(s) for -: 'NoneType' and 'int' 

und Fehler kommt nur, wenn ich Eingabe gültiger Wert nach ungültigen Wert eingeben

+0

Sie verfehlten eine Rückkehr in Zeile 7 –

+0

Rekursion scheint ein wenig übertrieben für die Eingabe zu fragen. – aluriak

+0

Ich habe auch ein anderes Problem, wenn Code im Online - Interpreter läuft, ist alles in Ordnung, aber beim Ausführen in Linux Terminal habe ich Fehler './paper.py: Zeile 2: Syntaxfehler in der Nähe von unerwarteten Token '(' ./paper. py: Zeile 2: 'p1 = random.randint (0, 2)' ' –

Antwort

2

Wenn Sie choosing() erneut aufrufen, die Sie nicht ihren Wert zurück, so dass er zurückkehrt None. Ändern Sie die Zeile:

choosing() 

zu:

return choosing() 

Dies wäre besser als eine Schleife als als rekursive Aufruf, meiner Meinung nach.

+0

Nicht nur besser in Python, sondern wahrscheinlich _proper_, angesichts der fehlenden Tail-Call-Optimierung in den meisten (allen?) Python-Interpretern und den kleineren Stacks. –

+1

Wenn jemand 1000 Versuche unternimmt, eine gültige Antwort einzugeben, ist der resultierende 'RekursionError' nicht völlig unverdient :-) – kindall

0

Wenn Sie in Python keinen Wert explizit zurückgeben, wird der Standardwert None zurückgegeben. Sie können dieses Problem beheben, indem das Hinzufügen einer der Funktionsaufruf choosing() Rückkehr:

def choosing(): 
    p = int(input("Rock: 0; Paper: 1; scissor: 2:")) 
    if p < 0 or p > 2: 
     print("\nPlease enter valid value") 
     return choosing() 
    else: 
     return int(p) 

Auch ich mit @Kindall einverstanden sind, scheint Rekursion hier wie ein Overkill für nur für die Eingabe zu fragen.

0

Der Fehler tritt die nicht-Eingangsnummer

p = int(input("Rock: 0; Paper: 1; scissor: 2:")) 

int in Gießen, die mit try-catch gehandhabt werden können. Ich fühle mich auch seltsam, Rekursion in der Funktion() zu verwenden. Ich würde tun, um die Funktion als

def choosing(): 
    while True: 
     try: 
      p = int(input("Rock: 0; Paper: 1; scissor: 2:")) 
      if p < 0 or p > 2: 
       print("\nPlease enter valid value") 
      else: 
       return p 
     except ValueError: 
      print("\nPlease enter valid value") 
Verwandte Themen