Ik heb mijn Python Hangman-app voltooid met zeer eenvoudige code.

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!") 

Dus, ik heb een paar vragen over mijn code:

  1. Ik ben begonnen wat dingen te leren over klassen in Python en ik dacht “Hé, laten we deze Galgje met klassen schrijven ) “Maar na wat coderen realiseerde ik me dat ik zojuist lessen had gemaakt met 1 func en in plaats van func() noemde ik ze gewoon class.func() en dat” s allemaal. Is er een goede reden waarom en hoe ik klassen zou moeten gebruiken in een Hangman-spel?

  2. Ik weet dat code erg basaal is en op mijn niveau zou ik de effectiviteit van de code maar toch – welk deel moet worden verbeterd (niet de code zelf, maar mijn logica daar)? Ik wil op een “juiste” manier schrijven, maar mijn code ziet er nog steeds super basic uit.

Antwoord

Speelbaarheid

Ik heb je spel gespeeld om het eerst te testen, en merkte iets vreemds op als een letter tweemaal in hetzelfde woord gevonden, zoals ” glass ” hier:

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

Ik weet niet zeker of dat inherent is aan het ontwerp, maar als speler vind ik het vreemd dat het “wordt twee keer weergegeven. Ik heb gevonden waar het vandaan kwam in de code:

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) 

Als je print(guess_word) door twee niveaus, je zult dat gedrag vermijden omdat het niet in een lus zal lopen:

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

Het afdrukken van een onbewerkte array zoals ["-", "-", "a", "s", "s"] is een beetje verwarrend, aanvankelijk wist ik niet wat het was want totdat ik er een goed vermoedde en de resultaten zag. Dus laten we het iets vriendelijkers laten afdrukken:

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

Veel beter! Maar het zal een beetje onhandig worden om dat allemaal elke keer te typen, dus laten we er een hulpprogramma voor maken en we kunnen het gebruiken voor de print(guess_word) ook aan het begin van een game.

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

Daarna print_word_to_guess(guess_word) wanneer we het nodig hebben. Het zou ook mogelijk zijn om een optioneel ander bericht te maken, maar standaard Word to guess:, maar dat laat ik voor je over als een uitdaging.


De game vertelt me ook nooit iets over hoeveel kansen ik nog heb, dus ik blijf gissen (letterlijk) totdat ik erachter ben. Dat is heel gemakkelijk om een kleine utility-functie te maken:

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

Dan een paar code toevoegingen:

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

En:

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) 

Je lijst met woorden is vrij beperkt. Overweeg in de toekomst misschien om online een tekstbestand te zoeken met een hele reeks woorden en lees er gewoon een willekeurig bestand uit, dat zou meer variatie brengen!


Codeverbeteringen

main functie

Je draait al je spel functies zodra u ze maakt. Het zou logischer zijn om ze in de functie __main__ te plaatsen:

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

Overigens, newFunc() werkt niet goed als een naam, aangezien het niets zegt over wat het doet. Iets als ask_user_to_play() zou veel beter zijn.


Naamgeving van constanten

Python heeft geen echte constanten, maar toch is het een goede gewoonte om variabelen die niet zouden moeten veranderen (met verandering bedoel ik opnieuw toegewezen aan andere waarden) in ALL_CAPS_WITH_UNDERSCORES. Een simpele vondst & vervangen in een IDE of teksteditor volstaat om je hele script te repareren.

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

Docstring

Het “is een goede gewoonte om een docstring toe te voegen aan alle functies, klassen en modules, om te beschrijven voor andere programmeurs waarvoor de code in kwestie is. Ik heb dat gedaan voor de bovenstaande 2 hulpprogramma-functie.


Typ hints

Sinds Python 3 kun je nu typ hints voor uw functie- en methodehandtekeningen, en gebruik statische code-analysehulpmiddelen. Dit maakt de code ook gemakkelijker leesbaar voor mensen.


Verbeterde code

Hier is wat ik bedacht, al het bovenstaande toepasbaar en de afstand ( de jouwe had overal te veel lege regels). Er zijn waarschijnlijk andere dingen die kunnen worden verbeterd, maar dit zou een goed begin moeten zijn.

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

Reacties

  • Ik kan ‘ niet zeggen hoeveel ik uw antwoord waardeer! Ik zal al je tips doornemen en mezelf ermee uitdagen, nogmaals bedankt 🙂
  • Geen probleem, ik vond het ook leuk om het te beoordelen! Ik hoop dat je er in de toekomst nog wat meer post =)

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *