Rätselraten für Anfänger

Sep 01 2020

Ich habe angefangen, Programmieren zu lernen, und als erstes Programm, das ich selbst geschrieben habe, wollte ich ein Ratespiel entwickeln - das Folgende habe ich bekommen.

Ich suche hauptsächlich nach einer Überprüfung meiner GuessFunktion, habe aber einige spezifische Fragen:

  1. Ist es sinnvoll, meine Schleifenvariable als Funktionsparameter zu haben?
  2. Ich definiere derzeit einige Variablen (z. B. tries) außerhalb meiner Funktion. Ist dies eine idiomatische Methode, um dies zu tun?
import random
tries = [1]
def Guess(playing):
    number = random.randint(1,100)
    print(number)
    print("We are going to play high and low, the avabile numbers are from 1 to 100 included.")
    while playing == True:
        user_input = input("What is your number? ")
        if int(user_input) == number:
            print("You have won!")
            playing = False
        elif int(user_input) < number:
            print("You need to give a higher number")
            tries.append(1)
        elif int(user_input) > number:
            print("You need to give an lower number")
            tries.append(1)
        else:
            print("You have put an wrong number")
            playing = False
    print("It took you " + str(sum(tries)) + " turns to guess")
    still = input("Do you want to play again?")
    if still == "yes" or still == "YES" or still == "y" or still == "si":
        Guess(playing=True)
    else:
        playing=False

Guess(playing=True)

Antworten

8 IEatBagels Sep 01 2020 at 21:02

Insgesamt haben Sie mit Ihrem Code gute Arbeit geleistet. Es gibt ein paar Dinge, auf die ich achten würde:

  • Sie zahlen nicht für Leerzeichen! Was ich meine ist, dass es wichtig ist, Ihren Code atmen zu lassen. Verwenden Sie einige leere Zeilen, es wird Ihre Augen wundern, wenn Sie mit großen Codestücken arbeiten.
  • Warum ist triesein Array? Meiner Meinung nach triessollte die Anzahl der Versuche darstellen, also sollte es eine Anzahl sein!
  • Beachten Sie, dass Sie Bedingungen haben. ==, <, > and... ?Angenommen, ich bitte Sie, mir eine Zahl zu geben, die weder gleich noch kleiner oder größer als 3 ist. Gibt es eine mögliche Option? Was Sie stattdessen tun sollten, ist sicherzustellen, dass der Spieler eine Nummer eingibt! Wenn ich jetzt "Ich weiß nicht, ob ich nur ein Baby bin" auf "Wir werden hoch und niedrig spielen, die verfügbaren Zahlen liegen zwischen 1 und 100" beantworten würde, stürzt Ihr Programm ab ! Sie sollten in try/catchBlöcke schauen , um dieses Problem zu lösen, das könnte eine nächste Sache sein, die Sie lernen sollten!
  • Angenommen, ich benötige drei Versuche bei meinem ersten Durchspielen, dann starte ich ein neues Spiel (mit "Ja", wenn ich dazu aufgefordert werde) und ich kann beim ersten Versuch erfolgreich sein. Ihr Code sagt mir, dass ich vier Versuche benötigt habe, um erfolgreich zu sein. Können Sie herausfinden, warum und wie Sie das beheben können?
  • Sie könnten Ihre Schleife mit dem vereinfachen breakSchlüsselwort, das auch etwas , das Sie für (während wir gerade dabei sind, versuchen zu verstehen , die Nutzung der gesucht werden soll break, returnund continue. Diese drei Schlüsselwörter sind ziemlich nützlich, obwohl Sie wahrscheinlich bereits wissen return).
  • Was ist, wenn ich ein englischer Major bin und es nicht ertragen kann, Grammatikfehler zu machen (das ist offensichtlich nicht mein Fall) und ich "Ja" anstelle von "Ja" oder "JA" schreibe, wenn ich gefragt werde, ob ich wieder spielen möchte? Sie können die abgesenkte (oder obere ) Version der Eingabe mit dem vergleichen, was Sie überprüfen möchten (z. B.still.lower() == "yes" ).
1 ChristianDean Sep 02 2020 at 08:55

Hier sind einige Verbesserungen, von denen ich denke, dass Sie sie vornehmen könnten (IEatBabels hat viele davon angesprochen, aber ich möchte einige Bereiche erweitern und meine eigene Formulierung hinzufügen):

  • Warum ist trieseine Liste? Es wäre einfacher und sinnvoller, einfach tries = 0anfangen zu lassen und dann try ( tries += 1) jedes Mal zu erhöhen, wenn der Benutzer eine falsche Nummer eingibt.
  • Da Sie keine anderen Funktionen in Ihrem Programm haben, würde ich mich nicht einmal darum kümmern, eine GuessFunktion zu erstellen . Schreiben Sie einfach den Code direkt in das Programm.
  • Sie haben gerade Ihr Programm ist das Debuggen, aber Sie zeigt dem Benutzer die Nummer , die sie angeblich sind schriftlich zu erraten , print(number)in Guess!
  • Was passiert, wenn der Benutzer beschließt, frech zu sein und etwas Kauderwelsch zu machen (dh etwas, das keine Zahl ist)? Ihr Programm wird eine Ausnahme auslösen, wenn es versucht, die Eingabe in eine Zahl umzuwandeln. Was Sie tun sollten, ist, den Code unter Ihrer Schleife in einen try/exceptBlock zu packen. Auf diese Weise können Sie den Benutzer bei jeder Eingabe von Kauderwelsch auffordern, eine gültige Nummer einzugeben.
  • Ich bin nicht sicher, warum Sie den elseBlock nach Ihren if/elifAussagen haben? Wenn die Benutzereingabe nicht der Zahl entspricht und nicht kleiner als die Zahl und nicht größer als die Zahl ist, was könnte es sonst sein? Nichts! Die elseAussage dort ist also wirklich nicht nötig . Möglicherweise haben Sie versucht, die elseAnweisung in Fällen zu verwenden , in denen die Benutzereingabe nicht gültig war. Dies wird jedoch nicht ganz funktionieren. Wenn Sie das versucht haben, lesen Sie meinen letzten Punkt.
  • Konvertieren Sie die Benutzereingaben einmal in eine Ganzzahl und speichern Sie sie in einer Variablen. Dies spart Zeit und sieht sauberer aus, als die Benutzereingaben jedes Mal zu konvertieren, wenn Sie sie testen möchten.
  • Ich bin mir nicht sicher, warum Sie hier Rekursion verwenden. Rekursion ist ein ausgezeichnetes Werkzeug, aber oft whileoder forSchleifen funktionieren viel besser. Ich denke, Ihr Programm ist einer dieser Fälle. Verwenden Sie einfach zwei Schleifen - eine Schleife, um den Benutzer zu fragen, ob er noch einmal spielen möchte, und eine Schleife für das eigentliche Spiel.
  • Mir ist aufgefallen, dass Sie Flaggen verwendet haben, um aus unseren Schleifen auszubrechen. Dies ist eine gute Methode. Aber ich würde es vorziehen, hier nur zu verwenden break. breakist eine Anweisung, die Python anweist, sofort aus der Schleife zu springen, in der es sich gerade befindet. Sie hat den gleichen Effekt wie das Setzen von Flags auf Trueund / oder False.
  • Sie waren in Ihrem Programm ziemlich gut darin, aber stellen Sie immer sicher, dass Sie beschreibende Variablennamen verwenden und klaren, expliziten Code schreiben. Dies macht Ihren Code sauber und selbstdokumentierend und ermöglicht es Ihnen, in Monaten darauf zurückzugreifen und schnell zu verstehen, was er tut und wie er funktioniert.

Hier ist, wie ich Ihr Programm mit den oben genannten Vorschlägen und einigen Verbesserungen in Bezug auf Formatierung, Logik und Benennung neu schreiben würde (auch IEatBagels hat einen hervorragenden Punkt in Bezug auf Leerzeichen gemacht. Stellen Sie sicher, dass Sie sich dies zu Herzen nehmen!):

import random


print("We are going to play high and low, the avabile numbers are from 1 to 100 included.")

tries = 0
while True:
    number_to_guess = random.randint(1, 100)
    while True:
        try:
            user_input = input("What is your number? ")
            guess = int(user_input)
        except ValueError:
            print("That's not a valid number! Try again.")
        else:
            if guess == number_to_guess:
                print("You have won!")
                break
            elif int(user_input) < number_to_guess:
                print("You need to give a higher number")
                tries += 1
            elif int(user_input) > number_to_guess:
                print("You need to give a lower number")
                tries += 1

    print("It took you " + str(tries) + " turns to guess")
    still = input("Do you want to play again?")

    if not (still == "yes" or still == "YES" or still == "y" or still == "si"):
        break