2017-11-03 19 views
-1

私はpythonでrock-paper-scissorゲームを書いていますが、私は解決できないエラーがあります。助けてください。- : 'NoneType'と '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!!") 

エラーが

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

とエラー再度choosing()を呼び出すと、それは返すので、あなたは、その値を返さない無効な値に

+0

7行目の戻り値を逃した –

+0

再帰は入力を求めるのに少し残酷に思える。 – aluriak

+0

私はまた別の問題があります。オンラインインタープリタでコードが実行されていても問題ないですが、Linux端末で実行しているときにエラー './paper.py:2行目:予期しないトークンの近くに構文エラーがあります。 '(' ./paper。 py:line 2: 'p1 = random.randint(0、2)' ' –

答えて

2

を入力した後にのみときI入力有効な値が来ると言いますNone

choosing() 

:行を変更

return choosing() 

これは私の意見では、再帰呼び出しと比べてループとして良いだろう。

+0

Pythonの方が優れているだけでなく、_proper_の可能性が高く、ほとんどの(すべての)Pythonインタプリタと小さなスタックでtail-call最適化が不足しているためです。 –

+1

誰かが有効なレスポンスを入力しようと1,000回試みると、結果として得られる 'RecursionError'は完全には不十分ではありません。 – kindall

0

Pythonでは、明示的に値を返さないと、デフォルトのNone型が返されます。あなたが返す関数呼び出しchoosing()追加することによってこの問題を解決することができます:私は@Kindallに同意し、

また
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) 

を、ここでの再帰は単に入力を求めるためのやり過ぎのように思えます。

0

エラーはのtry-catchで扱うことができ

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

をintに非番号の入力をキャストに起こります。私もchoose()関数で再帰を使うのは奇妙です。私はこの機能を実行するだろう

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") 
関連する問題