2017-03-29 21 views
1

私はPythonを学びたいと思っています。私はちょうど練習のためにシンプルなロック、ペーパー、はさみのゲームを作った。私は小さな問題を抱えています。Python - 自分自身を呼び出すメソッド

各プレイヤーが同じアイテムを選択すると、ゲームはタイで終了します。

enter image description here

プレイヤーがミスを犯すと、再び選択しなければならない場合には、変数が空です。プレイヤー1は「なし」と言います。

enter image description here

これは方法です。この問題は、elseブランチで発生します。

def play1(): 
    player1_choice = input("Player 1 - Go: ") 
    if (check(player1_choice)): 
     return player1_choice 
    else: 
     print(error_msg) 
     play1() # Something is wrong here. 

どうしたのですか?どうすれば修正できますか?おかげで

+3

'else'では' return play1() 'とするべきです – kuro

+1

この関数は、プレイヤーがダムや悪意のある場合にスタックを吹き飛ばすことができます。 – timgeb

答えて

2

あなたがする必要はありません再帰を使用しないでください。これは古典的な whileループ・アプリケーションである

def play1(): 
    while True: 
     player1_choice = input("Player 1 - Go: ") 
     if (check(player1_choice)): 
      return player1_choice 
     else: 
      print(error_msg) 
+0

それはうまくいく。ありがとうございました。唯一の変更点は、* return *の直後に* break *を追加したことです。私はそれが必要かどうかわからないが、私はループが永遠に続くことを心配していた。 – Lumo5

+0

それは必要ではないだけでなく、あなたはそれに到達することができません - それは "死んで"コードです。 ** return **は関数から完全に外れます。そのため、ブレークは機能しません。それは、自殺の犠牲者を手錠をかけるようなものです。 – Prune

0

;:これを試してみてくださいあなたは妥当な答えが得られるまで(既知の答えは受け入れられない)ループを作り、その答えを呼び出しプログラムに返します。あなたがループを入力すると、あなたがそれを繰り返す必要は何回を知っているとき

ためのループを使用してください。あなたが仕事を持っているとき

再帰は適切であることができます:

  1. 簡単な何かをします。
  2. 残っているタスクを、より小さなものに近づけ、些細な「完了」状態に近づけます。
  3. この小さなタスクをと同じ関数に渡して処理します。

このアプリケーションでは、ユーザーから間違った回答を得ても、開始時よりも解決策(有効な回答)に近づくことはありません。今の仕事はそれほど単純ではありません。さらに処理するとですが、繰り返しループでも同様に処理されます。

関連する問題