2016-07-25 9 views
-2

Ich bin neu bei Python (und Codierung im Allgemeinen) und nach etwa einer Woche lesen "Denken wie ein Informatiker: Lernen mit Python" Ich beschloss, zu versuchen, eine Version der klassischen "Raten Spiel". Ich fügte einige zusätzliche Funktionen hinzu, wie das Zählen der Anzahl der Vermutungen, die der Benutzer macht, und das Spielen gegen einen simulierten "Computer" -Player, um das Programm etwas interessanter zu machen. Außerdem basiert die Anzahl der Annahmen, die der Computer annimmt, auf der mittleren Anzahl von Schätzungen, die benötigt werden, um eine Zahl in einem gegebenen Bereich (die logarithmisch von Basis 2 für den Bereich n ist) zu erraten und variiert entsprechend der Standardabweichung. Jede Rückmeldung über die Struktur meines Codes oder die Art und Weise, wie ich die Anzahl der Schätzungen, die der Computer annimmt, generiert, wäre sehr zu begrüßen !!!Code-Feedback für Python Ratespiel

Anywayyysss .... hier ist mein Code

import random 


def get_number(level):     #selects a random number in range depending on difficulty selected 
    if level == "e": 
     number = random.randint(1,20) 
    if level == "m": 
     number = random.randint(1,100) 
    if level == "h": 
     number = random.randint(1,1000) 
    elif level != "e" and level != "m" and level != "h": 
     print ("Invalid input!") 
     get_number() 
    return number 


def select_level():     #prompts the user to select a difficulty to play on 
    level = str(input("Would you like to play on easy, medium, or hard? \n" 
         "Type 'e' for easy, 'm' for medium, or 'h' for hard!\n")) 
    return level 


def guess_number(level):  #function that prompts the user to guess within range depending on chosen difficulty 
    if level == "e": 
     guess = int(input("Guess a number between 1 and 20:\n")) 
    if level == "m": 
     guess = int(input("Guess a number between 1 and 100:\n")) 
    if level == "h": 
     guess = int(input("Guess a number between 1 and 1000:\n")) 
    return guess 


def check_guess(guess,number):   #processes the users guess and evaluates if it is too high, too low, or bang on 
    if guess > number: 
     print ("your guess is too high! Try again! \n") 
    if guess < number: 
     print ("your guess is too low! Try again! \n") 
    if guess == number: 
     print("\n{0} was the number!".format(number)) 


def com_num_guesses(level):   #function to get the number of guesses taken by the computer 
    if level == "e": 
     com_guesses = round(random.normalvariate(3.7,1.1)) 
    if level == "m": 
     com_guesses = round(random.normalvariate(5.8,1.319)) 
    if level == "h": 
     com_guesses = round(random.normalvariate(8.99,1.37474)) 
    print("The computer guessed the number in {0} guesses! Can you beat that?".format(com_guesses)) 
    return com_guesses 


def mainloop(): 
    level = select_level() 
    number = get_number(level) 
    com_guesses = com_num_guesses(level) 
    guess = guess_number(level) 
    check_guess(guess,number) 
    num_guesses = 1 
    if guess == number:   #tells program what to do if first guess is correct 
     print("You got it in {0} guesses.".format(num_guesses)) 
     if num_guesses == com_guesses: 
      print("It took the computer {0} guesses too!\nIt's a tie!\n".format(com_guesses)) 
     if num_guesses > com_guesses: 
      print("It took the computer {0} guesses.\nThe computer wins!\n".format((com_guesses))) 
     if num_guesses < com_guesses: 
      print("It took the computer {0} guesses.\nYou win!\n".format(com_guesses)) 
     play_again = str(input("To play again type 'yes'. To exit type 'no'. \n")) 
     if play_again == "yes": 
      mainloop() 
     if play_again == "no": 
      raise SystemExit(0) 
    while True:     #tells program how to handle guesses after the first guess 
     guess2 = guess_number(level) 
     check_guess(guess2,number) 
     num_guesses += 1 
     if guess2== number: 
      print("You got it in {0} guesses.".format(num_guesses)) 
      if num_guesses == com_guesses: 
       print("It took the computer {0} guesses too!\nIt's a tie!\n".format(com_guesses)) 
      if num_guesses > com_guesses: 
       print("It took the computer {0} guesses.\nThe computer wins!\n".format((com_guesses))) 
      if num_guesses < com_guesses: 
       print("It took the computer {0} guesses.\nYou win!\n".format(com_guesses)) 
      play_again = str(input("To play again type 'yes'. To exit type 'no'. \n")) 
      if play_again == "yes": 
       mainloop() 
      if play_again == "no": 
       raise SystemExit(0) 
      break 





mainloop() 
+8

Besser geeignet für Code Review - http://codereview.stackexchange.com/ –

+1

Ich stimme für das Schließen dieser Frage als Off-Topic ab, weil sie zu [codereview.se] gehört – Sayse

Antwort

0

In get_number(level):

  • elif könnte für alle if Ausdrücke nach dem ersten verwendet werden. Dies würde die Ausführung beschleunigen, da in Fällen, in denen ein Ausdruck wahr ist, die späteren Ausdrücke nicht ausgewertet werden müssen. (Das gleiche in guess_number(level) und check_guess(guess,number).)
  • Die elif könnte eine else gemacht werden.
  • Was soll get_number() tun? Ich denke, Sie möchten number = get_number(level) schreiben, oder Sie könnten eine while Schleife für den ganzen Block von Aussagen verwenden.

Was ist die while Schleife in mainloop() soll tun? Sie implementieren eine wiederholte Ausführung des Codes durch Aufruf von mainloop() in sich selbst. Allerdings würde ich die while Schleife gegen Ihre Implementierung bevorzugen. weder

Ist beaviour wenn ja oder nein eingegeben wird (das Ausbrechen aus der Schleife und immer bis zum Ende der mainloop gedacht?

Warum Sie zwischen der ersten Vermutung unterscheiden und später Vermutungen? Sie können mit behandelt werden derselbe Code

+0

Vielen Dank für Ihr Feedback Nachdem ich diesen Beitrag gemacht habe, habe ich festgestellt, dass es überflüssig ist, zwischen der ersten Schätzung und den nachfolgenden Vermutungen zu unterscheiden und den Code so zu ändern, dass er dies nicht mehr tut Mit der while-Schleife können mehrere Annahmen getroffen werden, ohne dass sich die Antwort (Nummer) ändert. Durch den Aufruf von mainloop() selbst kann eine neue Nummer für die nächste Runde des Spiels ausgewählt werden, indem zum Nummernauswahlverfahren zurückgekehrt wird, bevor die while-Schleife erneut aufgerufen wird. Ich habe deinen Vorschlag implementiert, um die ifs zu elifs zu ändern! –