2017-07-14 2 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() 

Also wenn ich dieses Programm ausführen, läuft es gut. Sobald ich die Zahl erraten habe, kann ich y oder n eingeben, um sie erneut abzuspielen. Wenn ich nur einmal gespielt habe, funktioniert es gut. Aber wenn ich y wähle und wieder spiele, gibt n nichts ein, nachdem ich das zweite Spiel gespielt habeProgramm wird nach mehreren Spielen nicht beendet?

+1

Versuchen Sie, 'zu wechseln, wenn die Antwort falsch ist:' zu 'wenn die Antwort == False:'. Sie sind verschiedene Dinge; "ist" bezieht sich auf die Referenz des Objekts. –

+0

Das funktioniert nicht. Ich habe gerade eine Antwort von einem Kumpel bekommen, dass ich sys.exit (0) anstelle von break verwenden könnte. Und es funktioniert. – Waldxn

Antwort

2

Ihr Hauptproblem ändern wird, dass Sie die Rekursion verwenden eine neue zu starten Spiel, aber nachdem der rekursive Aufruf zurückkehrt (vorausgesetzt, dass er es tut), gehst du einfach weiter in das ursprüngliche Spiel.

Es gibt ein paar Möglichkeiten, wie Sie das beheben können. Am einfachsten wäre es, den Code zu ändern, dass die Auswahl des Benutzers Griff Überprüfung wieder zu spielen, so dass es immer break s:

if reply: 
    run_game() 
break 

Ein besserer Ansatz wäre die Rekursion loszuwerden. Es gibt ein paar Möglichkeiten, wie Sie das tun können. Eine einfache Idee ist, einfach die entsprechenden Variablen zurückgesetzt und rechts halten auf mit Ihrem Spiel Schleife zu gehen, wenn der Benutzer es wünscht, wieder zu spielen:

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

Eine andere Möglichkeit, Rekursion zu vermeiden, wäre eine weitere Schleife hinzuzufügen. Hier ist eine, wie Sie es mit einer separaten Funktion tun könnte:

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() 

Eine Sache, die Sie beachten, dass ich in all den obigen Code geändert habe, ist, wie ich testen, ob der Rückgabewert von play_again ist True oder False. Es ist kein zusätzlicher Vergleichsschritt erforderlich, wenn Sie bereits einen bool-Wert haben. Tun Sie einfach if reply (oder if not reply, wenn Sie für False testen). Sie können dies auch in einem while Loop-Zustand, wie ich mit again in meinem letzten Codeblock tun.

0

Heres ein guter Weg, um dieses Problem zu lösen. In Ihrem Code beenden Sie die while-Schleife nie wirklich, da run game nie beendet wird und keine Systemvariable zurückgegeben wird, um sie zu brechen. Die Verwendung von sys.exit (0) funktioniert ebenfalls, aber es ist eine schlechte Angewohnheit, sich für diese Art von Programmen zu interessieren.

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

Der Grund dies geschieht, weil run_game landet selbst rekursiv aufrufen. Anstatt das Spiel neu zu starten, wenn der Benutzer erneut spielt, erstellt es effektiv eine neue Instanz des Spiels. Wenn der Benutzer dann die Wiedergabe beendet, kehrt er zur alten Sitzung zurück, anstatt das Programm zu beenden.

Sie können dies sogar selbst beweisen, indem Sie sich an die Lösung erinnern, bevor Sie erneut spielen, und dann entscheiden, nach der zweiten Sitzung nicht mehr zu spielen. Sie spielen dann die vorherige Sitzung erneut und geben die Lösung ein, an die Sie sich erinnern oder aufgeschrieben haben.

Jetzt können Sie dieses Problem lösen, indem Sie sys.exit() anstelle von break verwenden, um das Schließen des Programms zu erzwingen, aber das scheint keine gute Übung zu sein. Wenn jemand wieder zu oft spielt, kann dies dazu führen, dass das Programm keinen Stack mehr hat und abstürzt. es ist stattdessen wahrscheinlich besser, dass der Check aus run_game wie diese

if __name__ == "__main__": 
    while True: 
    run_game() 
    if not play_again(): 
    break 

zu bewegen und den anderen Block in run_game dieser

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

Es hat keinen Sinn, True oder False entsprechend der Benutzereingabe zurückzugeben, Sie können direkt von dort aus arbeiten.

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() 

Auf diese Weise ist der Code etwas sauberer und behebt Ihr Problem. Es macht keinen Sinn, "Flaggen" herumzureichen, wenn man Dinge direkt machen kann. Da Ihr Spiel von 0 bis 100 ist, sollten Sie auch überprüfen, ob der Benutzer keine Zahl größer als 100 setzt, da niedriger als 0 die Prüfung isdigit nicht besteht.

Verwandte Themen