2017-07-14 18 views
2
from random import random 


# This function handles the number guessing and number formatting 
def run_game(): 

    # rand is declared by grabbing a number between 0 and 1, multiplying it by 100, and rounds to nearest integer 
    rand = round(random() * 100, 0) 
    print("Guess the number [0 - 100]") 
    guesses = 0 

    while True: 

     # Assigns the 'answer' variable by grabbing user input from console 
     answer = input() 

     # Checks if the input from the console is a number, and if not, asks the user to enter a valid number 
     if answer.isdigit(): 
      n = int(answer) 
      if n > int(rand): 
       print("Number is less than " + str(n)) 
       guesses = guesses + 1 
      elif n < int(rand): 
       print("Number is greater than " + str(n)) 
       guesses = guesses + 1 
      else: 
       guesses = guesses + 1 
       print("It took you " + str(guesses) + " guesses to guess the right number!") 
       reply = play_again() 
       if reply is False: 
        break 
       else: 
        run_game() 
     else: 
      print("Please enter a number") 


def play_again(): 
    while True: 
     reply = input("Play again? (y/n)\n") 
     if reply.lower() == "y": 
      return True 
     elif reply.lower() == "n": 
      return False 
     else: 
      print("Enter 'y' or 'n'") 


if __name__ == "__main__": 
    run_game() 

このプログラムを実行すると、正常に動作します。数字を推測したら、yまたはnを入力してもう一度再生することができます。私が一度だけ遊んだら、うまくいく。しかし、yを選択して再びプレイすると、セカンドゲームをプレイした後にnを入力すると、何もしません。複数のゲームの後にプログラムが終了しない?

+1

「返信が偽の場合:」を「返信==偽:」に切り替えてみてください。彼らは別のものです。 'is'はオブジェクトの参照を指します。 –

+0

それは動作しません。私はちょうど私がちょうど休憩の代わりにsys.exit(0)を使うことができると言っている友人からの返信を得ました。そして、それは動作します。 – Waldxn

答えて

2

方が良いでしょう再帰呼び出しが戻った後(元の状態にあると仮定して)、元のゲームにそのまま進むだけです。

これを解決する方法はいくつかあります。

if reply: 
    run_game() 
break 

より良いアプローチは、再帰を取り除くために次のようになります。最も簡単なのは、それは常にbreakのように、再びプレーするユーザの選択を確認し処理するコードを変更することです。あなたがそれを行うにはいくつかの方法があります。一つのシンプルなアイデアは、単に適切な変数をリセットし、ユーザーが再びプレーしたいときに、あなたのゲームループと一緒に行くに権利を維持することです:

reply = play_again() 
if reply: 
    rand = round(random() * 100, 0) 
    print("Guess the number [0 - 100]") 
    guesses = 0 
else: 
    break 

再帰を回避するための別の方法は、別のループを追加することです。ここでは、別の関数でそれを行うことができます一つの方法があります:play_againからの戻り値はTrueFalseある場合は、私は上記のコードの全てに変更したことに注意して

def run_game(): 
    rand = round(random() * 100, 0) 
    print("Guess the number [0 - 100]") 
    guesses = 0 

    while True: 
     answer = input() 
     if answer.isdigit(): 
      n = int(answer) 
      if n > int(rand): 
       print("Number is less than " + str(n)) 
       guesses = guesses + 1 
      elif n < int(rand): 
       print("Number is greater than " + str(n)) 
       guesses = guesses + 1 
      else: 
       guesses = guesses + 1 
       print("It took you " + str(guesses) + " guesses to guess the right number!") 
       break # unconditionally break here! 

def run_many_games(): 
    again = True 
    while again: 
     run_game() 
     again = play_again() 

ことの一つは、私がテストする方法です。 boolの値が既にある場合は、追加の比較ステップは必要ありません。 if replyFalseをテストしている場合はif not reply)を実行してください。最後のコードブロックでagainと同じように、ループ状態のwhileでこれを行うこともできます。

0

この問題を解決するには良い方法です。あなたのコードでは、実行されるゲームは決して終了しないため、実際にはwhileループを終了することはありません。 sys.exit(0)を使うこともできますが、この種のプログラムでは悪い習慣です。

from random import random 


# This function handles the number guessing and number formatting 
def run_game(): 

    # rand is declared by grabbing a number between 0 and 1, multiplying it by 100, and rounds to nearest integer 
    rand = round(random() * 100, 0) 
    print("Guess the number [0 - 100]") 
    guesses = 0 

    while True: 
     answer = input() 
     if type(answer) == int: 
      n = int(answer) 
      if n > int(rand): 
       print("Number is less than " + str(n)) 
       guesses = guesses + 1 
      elif n < int(rand): 
       print("Number is greater than " + str(n)) 
       guesses = guesses + 1 
      else: 
       guesses = guesses + 1 
       print("It took you " + str(guesses) + " guesses to guess the right number!") 
       break 
    reply = play_again() 
    if reply: 
     run_game() 
    else: 
     print 'Thank you for playing' 

def play_again(): 
    while True: 
     reply = raw_input("Play again? (y/n)\n") 
     if reply.lower() == "y": 
      return True 
     elif reply.lower() == "n": 
      return False 
     else: 
      print("Enter 'y' or 'n'") 

if __name__ == "__main__": 
    run_game() 
0

これは、run_gameが再帰的に呼び出されるためです。ユーザーが再びプレイすることを選択したときにゲームを再開するのではなく、効果的にゲームの新しいインスタンスを作成します。その後、ユーザーが再生を停止することを選択すると、プログラムを終了するのではなく、古いセッションに戻ります。

解決方法を覚えておいてから、もう一度再生することを選択してから、2番目のセッションの後に再度再生しないことを選択することで、自分自身にも証明できます。前のセッションをもう一度再生し、思い出した、または書き留めた解決策を入力します。

breakの代わりにsys.exit()を使用してプログラムを強制終了することでこの問題を解決できますが、これは良い方法ではありません。誰かが何度も何度も繰り返しプレイすることを選択した場合、スタックスペースが足りなくなりクラッシュする可能性があります。代わりに、それはあなたの主な問題は、あなたが新しいを開始するために再帰を使用していることである この

run_gameでその run_game

このような
if __name__ == "__main__": 
    while True: 
    run_game() 
    if not play_again(): 
    break 

のチェックアウトし、他の修正ブロックを移動するために、おそらく

else: 
    guesses = guesses + 1 
    print("It took you " + str(guesses) + " guesses to guess the right number!") 
    break 
0

ユーザー入力に応じてTrueまたはFalseを返すことには意味がありません。そこから直接作業できます。

import sys 
from random import random 


# This function handles the number guessing and number formatting 
def run_game(): 

    # rand is declared by grabbing a number between 0 and 1, multiplying it by 100, and rounds to nearest integer 
    rand = round(random() * 100, 0) 
    print("Guess the number [0 - 100]") 
    guesses = 0 

    while True: 

     # Assigns the 'answer' variable by grabbing user input from console 
     answer = input() 

     # Checks if the input from the console is a number, and if not, asks the user to enter a valid number 
     if answer.isdigit(): 
      n = int(answer) 
      if n > int(rand): 
       print("Number is less than " + str(n)) 
       guesses = guesses + 1 
      elif n < int(rand): 
       print("Number is greater than " + str(n)) 
       guesses = guesses + 1 
      else: 
       guesses = guesses + 1 
       print("It took you " + str(guesses) + " guesses to guess the right number!") 
       play_again() 
     else: 
      print("Please enter a number") 


def play_again(): 
    while True: 
     reply = input("Play again? (y/n)\n") 
     if reply.lower() == "y": 
      run_game() 
     elif reply.lower() == "n": 
      sys.exit(0) 
     else: 
      print("Enter 'y' or 'n'") 


if __name__ == "__main__": 
    run_game() 

このようにして、コードはややクリーナーになり、問題が解決されます。物事を直接行うことができるときには、「旗」を渡すことに意味はありません。 あなたのゲームは0から100までですので、0より小さい数字がisdigitのチェックに合格しないため、ユーザーが100を超える数字を入力しないかどうかを確認する必要があります。

関連する問題