From ebada14a136f1f364870e385d14ffbd20d2e89d5 Mon Sep 17 00:00:00 2001 From: nojhan Date: Wed, 21 Mar 2012 22:47:15 +0100 Subject: [PATCH] le jeu du pendu est pour un joueur humain --- src/pendu_humain.py | 155 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 src/pendu_humain.py diff --git a/src/pendu_humain.py b/src/pendu_humain.py new file mode 100644 index 0000000..7b533fb --- /dev/null +++ b/src/pendu_humain.py @@ -0,0 +1,155 @@ +#encoding: utf-8 +import random +from urllib.request import urlopen + +BOARDS_PIC = [ +""" + ╒══╗ + │ ║ + ║ + ║ + ║ +════╩═ +""", +""" + ╒══╗ + │ ║ + ☹ ║ + ║ + ║ +════╩═ +""", +""" + ╒══╗ + │ ║ + ☹ ║ + │ ║ + ║ +════╩═ +""", +""" + ╒══╗ + │ ║ + ☹ ║ +/│ ║ + ║ +════╩═ +""", +""" + ╒══╗ + │ ║ + ☹ ║ +/│\ ║ + ║ +════╩═ +""", +""" + ╒══╗ + │ ║ + ☹ ║ +/│\ ║ +╱ ║ +════╩═ +""", +""" + ╒══╗ + │ ║ + ☹ ║ +/│\ ║ +╱ ╲ ║ +════╩═ +"""] + + +def download_dic( url ): + """ Télécharge une liste de mots """ + # Ouvre la page web, fait quelque chose avec puis la ferme automatiquement + with urlopen( url ) as page: + # Renvoie le contenu de la page, sous forme d'une liste de mots + return page.read().split() + + +def filter_wordsize( words, word_size = 3 ): + """ Décode en unicode chaque mot dans words + ssi la longueur du mot est celle demandée """ + return [w.decode("utf-8") for w in words if len(w) == word_size ] + + +def pick_word( words ): + """ Renvoi un mot choisi au hasard dans une liste """ + return words[ random.randrange( len(words) ) ] + + +def display( boards, partial_word, fails ): + """ Affiche l'état du pendu et le mot deviné """ + print( boards[fails] ) + print( "« " + partial_word + " »" ) + + +def process( letter, partial_word, secret_word ): + """ Insère les lettres devinées dans le mot en cours """ + for i in range(len(secret_word)): + if secret_word[i] == letter: + # En python, les chaines de caractères sont "immutable", + # c'est à dire qu'on ne peut pas écrire : + # partial_word[i] = letter + # Pour faire la même chose, il faut réaffecter un nouveau contenu à la variable. + # On concatène donc la partie à gauche de la lettre avec la partie à droite. + partial_word = partial_word[:i] + letter + partial_word[i+1:] + return partial_word + + +def play( secret_word ): + """ Boucle de jeu principale, renvoie vrai si le joueur a gagné """ + partial_word = "_" * len(secret_word) + fails = 0 + used_letter = "" + while fails < len( BOARDS_PIC ): + display( BOARDS_PIC, partial_word, fails ) + + print("À quelle lettre pensez-vous ?") + letter = input() + # Les majuscules étant considérés par python comme différentes des minuscules, + # on évite des problèmes en convertissant tout en minuscule. + letter = letter.lower() + + # Il est possible de soumettre le mot entier. + if letter == secret_word: + return True + + if letter in used_letter: + print("Vous avez déjà essayé les lettres suivantes :",used_letter) + # Aller directement à l'itération suivante, sans compter les ratés. + continue + else: + used_letter += letter + + if letter in secret_word: + partial_word = process( letter, partial_word, secret_word ) + else: + fails = fails + 1 + + # S'il n'y a pas de caractère "_" dans le mot, c'est qu'il y a victoire. + if "_" not in partial_word: + return True + + # On a épuisé tous les essais, c'est perdu. + return False + + +if __name__=="__main__": + word_size = 8 + words = filter_wordsize( download_dic( "http://nojhan.net/aapssfc/data/french_dictionary.utf8" ), word_size ) + print( len(words),"mots dans le dictionaire" ) + + secret_word = pick_word( words ) + #print( secret_word ) + + won = play( secret_word ) + + if won: + print("Gagné :-)") + else: + print("Perdu :-(") + print("Le mot était : ",secret_word ) +