Ich habe meine Python Hangman-App mit sehr einfachem Code fertiggestellt.

import random import sys # lets set some variables wordList = [ "lion", "umbrella", "window", "computer", "glass", "juice", "chair", "desktop", "laptop", "dog", "cat", "lemon", "cabel", "mirror", "hat" ] guess_word = [] secretWord = random.choice(wordList) # lets randomize single word from the list length_word = len(secretWord) alphabet = "abcdefghijklmnopqrstuvwxyz" letter_storage = [] def beginning(): print("Hello Mate!\n") while True: name = input("Please enter Your name\n").strip() if name == "": print("You can"t do that! No blank lines") else: break beginning() def newFunc(): print("Well, that"s perfect moment to play some Hangman!\n") while True: gameChoice = input("Would You?\n").upper() if gameChoice == "YES" or gameChoice == "Y": break elif gameChoice == "NO" or gameChoice == "N": sys.exit("That"s a shame! Have a nice day") else: print("Please Answer only Yes or No") continue newFunc() def change(): for character in secretWord: # printing blanks for each letter in secret word guess_word.append("-") print("Ok, so the word You need to guess has", length_word, "characters") print("Be aware that You can enter only 1 letter from a-z\n\n") print(guess_word) def guessing(): guess_taken = 1 while guess_taken < 10: guess = input("Pick a letter\n").lower() if not guess in alphabet: #checking input print("Enter a letter from a-z alphabet") elif guess in letter_storage: #checking if letter has been already used print("You have already guessed that letter!") else: letter_storage.append(guess) if guess in secretWord: print("You guessed correctly!") for x in range(0, length_word): #This Part I just don"t get it if secretWord[x] == guess: guess_word[x] = guess print(guess_word) if not "-" in guess_word: print("You won!") break else: print("The letter is not in the word. Try Again!") guess_taken += 1 if guess_taken == 10: print(" Sorry Mate, You lost :<! The secret word was", secretWord) change() guessing() print("Game Over!") 

Ich habe also ein paar Fragen zu meinem Code:

  1. Ich habe angefangen, ein paar Dinge über Klassen in Python zu lernen, und dachte, „Hey, lass uns diesen Henker mit Klassen schreiben.“ ) „Aber nach einigem Codieren wurde mir klar, dass ich nur Klassen mit 1 Funktion erstellt habe und statt func() habe ich sie nur class.func() genannt und das“ s alles. Gibt es einen guten Grund, warum und wie ich Klassen in einem Hangman-Spiel verwenden sollte?

  2. Ich weiß, dass Code sehr einfach ist und auf meiner Ebene sollte ich die Effektivität nicht genau beachten der Code aber immer noch – Welcher Teil sollte verbessert werden (nicht der Code selbst, sondern meine Logik dort)? Ich möchte „richtig“ schreiben, aber mein Code sieht immer noch super einfach aus.

Antwort

Spielbarkeit

Ich habe Ihr Spiel ausgeführt, um es zuerst zu testen, und etwas Merkwürdiges bemerkt, wenn ein Buchstabe ist zweimal im selben Wort gefunden, z. B. “ Glas “ hier:

Pick a letter A You guessed correctly! ["-", "-", "a", "-", "-"] Pick a letter s You guessed correctly! ["-", "-", "a", "s", "-"] ["-", "-", "a", "s", "s"] 

Ich bin mir nicht sicher, ob das beabsichtigt ist, aber als Spieler finde ich es seltsam, dass es so ist „s wird zweimal angezeigt. Ich habe herausgefunden, woher es im Code stammt:

for x in range(0, length_word): #This Part I just don"t get it if secretWord[x] == guess: guess_word[x] = guess print(guess_word) 

Wenn Sie print(guess_word) von nicht einrücken In zwei Ebenen vermeiden Sie dieses Verhalten, da es nicht in einer Schleife ausgeführt wird:

for i in range(0, length_word): if secretWord[i] == guess: guess_word[i] = guess print(guess_word) 

Das Drucken eines Raw-Arrays wie ["-", "-", "a", "s", "s"] ist etwas verwirrend. Zuerst wusste ich nicht, was es war denn bis ich eins richtig erraten und die Ergebnisse gesehen habe. Lassen Sie es also etwas freundlicher drucken:

print("Word to guess: {0}".format(" ".join(guess_word))) 
Pick a letter o You guessed correctly! Word to guess: - o - 

Viel besser! Aber es wird ein bisschen umständlich, all das jedes Mal einzugeben. Machen wir also eine Utility-Funktion dafür und wir können sie für die verwenden print(guess_word) auch zu Beginn eines Spiels.

def print_word_to_guess(letters): """Utility function to print the current word to guess""" print("Word to guess: {0}".format(" ".join(guess_word))) 

Dann haben wir nur print_word_to_guess(guess_word) wann immer wir es brauchen. Es wäre auch möglich, eine optionale andere Nachricht zu erstellen, aber standardmäßig Word to guess:, aber das überlasse ich Ihnen als Herausforderung.


Das Spiel sagt mir auch nie etwas darüber, wie viele Chancen ich noch habe, also muss ich (im wahrsten Sinne des Wortes) raten, bis ich es herausgefunden habe. Es ist sehr einfach, eine kleine Utility-Funktion zu erstellen:

def print_guesses_taken(current, total): """Prints how many chances the player has used""" print("You are on guess {0}/{1}.".format(current, total)) 

Dann einige Code-Ergänzungen:

def guessing(): guess_taken = 1 MAX_GUESS = 10 print_guesses_taken(guess_taken, MAX_GUESS) while guess_taken < MAX_GUESS: 

Und:

for i in range(0, length_word): if secretWord[i] == guess: guess_word[i] = guess print_word_to_guess(guess_word) print_guesses_taken(guess_taken, MAX_GUESS) 

Ihre Wortliste ist ziemlich begrenzt. Für die Zukunft sollten Sie vielleicht online nach einer Textdatei mit einer ganzen Reihe von Wörtern suchen und einfach eine zufällige daraus lesen würde mehr Abwechslung bringen!


Codeverbesserungen

main Funktion

Sie führen Ihr gesamtes Spiel aus funktioniert, sobald Sie sie machen. Es wäre sinnvoller, sie in die Funktion __main__ einzufügen:

if __name__ == "__main__": beginning() newFunc() change() guessing() 

newFunc() funktioniert übrigens nicht gut als Name, da es nichts darüber aussagt, was es tut. So etwas wie ask_user_to_play() wäre viel besser.


Benennung von Konstanten

Python hat keine echten Konstanten, aber es ist dennoch eine gute Praxis, sie zu benennen Variablen, die sich in ALL_CAPS_WITH_UNDERSCORES nicht ändern sollten (mit Änderung meine ich die Zuordnung zu anderen Werten). Ein einfacher Suchvorgang & in einer IDE oder einem Texteditor bewirkt, dass Ihr gesamtes Skript repariert wird.

GUESS_WORD = [] SECRET_WORD = random.choice(wordList) # lets randomize single word from the list LENGTH_WORD = len(SECRET_WORD) ALPHABET = "abcdefghijklmnopqrstuvwxyz" letter_storage = [] 

Docstring

Es ist eine gute Angewohnheit, allen Funktionen, Klassen und Modulen eine docstring hinzuzufügen, um sie für andere zu beschreiben Programmierer, wofür der betreffende Code bestimmt ist. Ich habe dies für die oben genannten 2 Dienstprogrammfunktionen getan.


Tipphinweise

Seit Python 3 können Sie jetzt Geben Sie Hinweise für Ihre Funktions- und Methodensignaturen ein und verwenden Sie statische Code-Analyse-Tools. Dies erleichtert auch das Lesen des Codes für Menschen.


Verbesserter Code

Folgendes habe ich mir ausgedacht, alle oben genannten Punkte angewendet und den Abstand verbessert ( Ihre hatte überall zu viele Leerzeilen). Es gibt wahrscheinlich andere Dinge, die verbessert werden könnten, aber dies sollte ein guter Anfang sein.

import random, sys from typing import List # TODO try to load these from a text file WORD_LIST = [ "lion", "umbrella", "window", "computer", "glass", "juice", "chair", "desktop", "laptop", "dog", "cat", "lemon", "cabel", "mirror", "hat" ] GUESS_WORD = [] SECRET_WORD = random.choice(WORD_LIST) # lets randomize single word from the list LENGTH_WORD = len(SECRET_WORD) ALPHABET = "abcdefghijklmnopqrstuvwxyz" letter_storage = [] # Utility functions def print_word_to_guess(letters: List) -> None: """Utility function to print the current word to guess""" print("Word to guess: {0}".format(" ".join(letters))) def print_guesses_taken(current: int, total: int) -> None: """Prints how many chances the player has used""" print("You are on guess {0}/{1}.".format(current, total)) # Game functions def beginning() -> None: """Starts the game""" print("Hello Mate!\n") while True: name = input("Please enter Your name\n").strip() if name == "": print("You can"t do that! No blank lines") else: break def ask_user_to_play() -> None: """Ask user if they want to play""" print("Well, that"s perfect moment to play some Hangman!\n") while True: gameChoice = input("Would You?\n").upper() if gameChoice == "YES" or gameChoice == "Y": break elif gameChoice == "NO" or gameChoice == "N": sys.exit("That"s a shame! Have a nice day") else: print("Please Answer only Yes or No") continue def prepare_secret_word() -> None: """Prepare secret word and inform user of it""" for character in SECRET_WORD: # printing blanks for each letter in secret word GUESS_WORD.append("-") print("Ok, so the word You need to guess has", LENGTH_WORD, "characters") print("Be aware that You can enter only 1 letter from a-z\n\n") print_word_to_guess(GUESS_WORD) def guessing() -> None: """ Main game loop to have user guess letters and inform them of the results """ guess_taken = 1 MAX_GUESS = 10 print_guesses_taken(guess_taken, MAX_GUESS) while guess_taken < MAX_GUESS: guess = input("Pick a letter\n").lower() if not guess in ALPHABET: #checking input print("Enter a letter from a-z ALPHABET") elif guess in letter_storage: #checking if letter has been already used print("You have already guessed that letter!") else: letter_storage.append(guess) if guess in SECRET_WORD: print("You guessed correctly!") for i in range(0, LENGTH_WORD): if SECRET_WORD[i] == guess: GUESS_WORD[i] = guess print_word_to_guess(GUESS_WORD) print_guesses_taken(guess_taken, MAX_GUESS) if not "-" in GUESS_WORD: print("You won!") print("Game Over!") break else: print("The letter is not in the word. Try Again!") guess_taken += 1 print_guesses_taken(guess_taken, MAX_GUESS) if guess_taken == 10: print(" Sorry Mate, You lost :<! The secret word was {0}".format(SECRET_WORD)) if __name__ == "__main__": beginning() ask_user_to_play() prepare_secret_word() guessing() 

Kommentare

  • Ich kann ‚ nicht sagen, wie sehr ich Ihre Antwort schätze! Ich werde alle Ihre Tipps durchsehen und mich mit ihnen herausfordern, nochmals vielen Dank 🙂
  • Kein Problem, ich hatte auch Spaß beim Überprüfen! Ich hoffe, Sie veröffentlichen in Zukunft weitere = =

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.