2016-06-21 10 views
0

私はPythonでRock、Paper、Scissorsのゲームを作成しましたが、プレイヤーが無効なコマンドを入力した場合、この方法を再開するのに問題がありました。ユーザーが最初に尋ねるときに 'r'、 'p'、または 's'以外のものを入力すると、適切な値が入力されると常に値Noneが返されます。ラウンドを再開することができたことがわかったが、ゲームに賭け金を追加したときに不便であることが判明した。Python:値を取り込まずにメソッドを再起動するにはどうすればよいですか?

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) 

ユーザタイプが '' 'P' が続く出力:

[R] OCK、[P] APER、または[S] cissors? a
これは有効なコマンドではありません。再試行する。
[R] ock、[P] aper、または[S] cissors? p
なし

+1

注目すると、メソッドを「再起動」していないため、メソッドに_recursing_しています。 'rps ':'ループではないwhileの選択肢を考慮する必要があります。現在のアプローチでは、ユーザが再帰バッファをオーバーランさせてプログラムをクラッシュさせるまで無効な値を入力する可能性があります。 –

答えて

1

現在のコードを修正するには、値をreturnに設定する必要があります。

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.") 
     return get_input() 
#  ^^^^^^ 

choice = get_input() 
print(choice) 

しかし、ユーザーが誤った入力を多すぎると、スタックのサイズが大きくなりすぎます。何が欲しいのループである:ありますので、Pythonでwhile Trueを使用することがOKであることを

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.") 

注:対話型シェルからのテキスト入力を検証するとき、私はループを使用することをお勧めします

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

OPの表示方法を教えてください。間違った入力に対する反復呼び出しは、入力を処理する方法ではありません。 – lejlot

+1

良いアイデア。私はそれを行うでしょう –

+0

これは、それを行うためのひどい方法です - 何が間違っているループと - 有効な入力までループ。再帰を使って検証するのはひどいです。 –

3

no do ... while。リトライ回数が限られている場合は、for _ in range(num_retries)を使用できます。

関連する問題