Jai terminé mon application Python Hangman avec un code très basique.
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!")
Donc, jai quelques questions à propos de mon code:
-
Jai commencé à me pencher sur les classes en Python et je me suis dit « Hey, écrivons ce pendu avec des classes ) « Mais après un certain codage que jai réalisé, je viens de créer des classes avec 1 func et au lieu de
func()
je les ai juste appelésclass.func()
et ça » Cest tout. Y a-t-il une bonne raison pour laquelle et comment utiliser des classes dans un jeu du pendu? -
Je sais que le code est très basique et à mon niveau, je ne devrais pas vraiment me soucier de l’efficacité de le code mais quand même – Quelle partie devrait être améliorée (pas le code lui-même mais ma logique là-bas)? Je veux écrire de manière « correcte » mais mon code a toujours lair super basique.
Réponse
Jouabilité
Jai lancé votre jeu pour le tester en premier, et jai remarqué quelque chose détrange quand une lettre est trouvé deux fois dans le même mot, comme » glass » ici:
Pick a letter A You guessed correctly! ["-", "-", "a", "-", "-"] Pick a letter s You guessed correctly! ["-", "-", "a", "s", "-"] ["-", "-", "a", "s", "s"]
Je « ne sais pas si cest par conception, mais en tant que joueur, je trouve étrange que cela « est affiché deux fois. Jai trouvé son origine dans le 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)
Si vous désindiquez simplement print(guess_word)
par deux niveaux, vous éviterez ce comportement car il ne fonctionnera pas en boucle:
for i in range(0, length_word): if secretWord[i] == guess: guess_word[i] = guess print(guess_word)
Imprimer un tableau brut comme ["-", "-", "a", "s", "s"]
est un peu déroutant, au début je ne savais pas ce que cétait jusquà ce que jaie deviné un droit et vu les résultats. Alors, faisons-le imprimer quelque chose de plus convivial:
print("Word to guess: {0}".format(" ".join(guess_word)))
Pick a letter o You guessed correctly! Word to guess: - o -
Beaucoup mieux! Mais il sera un peu compliqué de taper tout cela à chaque fois, alors créons une fonction utilitaire pour cela et nous pouvons lutiliser pour le print(guess_word)
au début dune partie également.
def print_word_to_guess(letters): """Utility function to print the current word to guess""" print("Word to guess: {0}".format(" ".join(guess_word)))
Ensuite, nous nous contentons de print_word_to_guess(guess_word)
chaque fois que nous en avons besoin. Il serait également possible de créer un message facultatif différent mais par défaut à Word to guess:
, mais je vous laisse cela comme un défi.
Le jeu ne me dit jamais rien sur le nombre de chances quil me reste, donc je suis laissé deviner (littéralement) jusquà ce que je le comprenne. Cest très facile de créer une petite fonction utilitaire à faire:
def print_guesses_taken(current, total): """Prints how many chances the player has used""" print("You are on guess {0}/{1}.".format(current, total))
Puis quelques ajouts de code:
def guessing(): guess_taken = 1 MAX_GUESS = 10 print_guesses_taken(guess_taken, MAX_GUESS) while guess_taken < MAX_GUESS:
Et:
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)
Votre liste de mots est assez limitée, pour lavenir envisagez peut-être de chercher un fichier texte en ligne avec tout un tas de mots et lisez-en un au hasard, cela apporterait plus de variété!
Améliorations du code
main
fonction
Vous exécutez tout votre jeu fonctionne dès que vous les créez. Il serait plus judicieux de les placer dans la fonction __main__
:
if __name__ == "__main__": beginning() newFunc() change() guessing()
Au fait, newFunc()
ne fonctionne pas bien en tant que nom, car il ne dit rien sur ce quil fait. Quelque chose comme ask_user_to_play()
serait bien mieux.
Dénomination des constantes
Python n’a pas de vraies constantes, mais néanmoins, c’est une bonne pratique de nommer variables qui ne devraient pas changer (par changement, je veux dire réaffecté à des valeurs différentes) dans ALL_CAPS_WITH_UNDERSCORES. Une simple recherche & remplacer dans un IDE ou un éditeur de texte suffit pour corriger lensemble de votre script.
GUESS_WORD = [] SECRET_WORD = random.choice(wordList) # lets randomize single word from the list LENGTH_WORD = len(SECRET_WORD) ALPHABET = "abcdefghijklmnopqrstuvwxyz" letter_storage = []
Docstring
Cest une bonne habitude dajouter une docstring à toutes les fonctions, classes et modules, à décrire pour dautres programmeurs à quoi sert le code en question. Jai fait cela pour la fonction utilitaire ci-dessus 2.
Tapez des indices
Depuis Python 3, vous pouvez maintenant utiliser tapez des conseils pour vos signatures de fonction et de méthode, et utilisez des outils danalyse de code statique. Cela rend également le code plus facile à lire pour les humains.
Code amélioré
Voici ce que jai proposé, en appliquant tout ce qui précède et en améliorant lespacement ( le vôtre avait trop de lignes vides partout). Il y a probablement dautres choses qui pourraient être améliorées, mais cela devrait être un bon début.
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()
Commentaires
- Je ne peux ‘ vous dire à quel point japprécie votre réponse! Je vais parcourir tous vos conseils et me mettre au défi avec eux, merci encore 🙂
- Pas de problème, je me suis amusé à le relire aussi! Jespère que vous en publierez dautres à lavenir =)