Yann Pellegrini

← Back to posts list

Un jeu du pendu en Python 2.7

Published on 14/03/2013 à 04:12:16 by Yann
Salut à tous, aujourd'hui je vous explique rapidement comment créer le classique jeu du pendu en Python, suite à un petit devoir d'ISN. :) Commençons par définir une variable contenant les mots qui seront choisis aléatoirement au lancement de la partie, et l'alphabet qui permettra de vérifier les entrées du joueur.
alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
mots = ['informatique', 'isn', 'nyancat']
Ensuite, il faut choisir un de ces mots aléatoirement. Pour se servir de l'aléatoire, vous devez placer la ligne suivante en haut de votre fichier :
import random
Puis, générer un index aléatoire entre 0 et 2, puisqu'ici mots[0] = 'informatique', mots[1] = 'isn' et mots[2] = 'nyancat'. On s'aide de la fonction len() pour connaître la limite, mais il faut la décrémenter de 1 car la longueur de mots est bien de 3 entrées, mais mots[3] n'existe pas.
index = random.randint(0, len(mots) - 1)
mot = mots[index]
mot = mot.upper()                 # On met le mot en majuscules, on travaillera uniquement en majuscules
On créé ainsi la variable mot (sans s) qui contient le mot à deviner. Nous avons besoin de connaitre la progression du joueur. Je vais la stocker dans un tableau, qui contiendra False pour les lettres a deviner et les lettres déjà trouvées. Donc au lancement on veut un tableau rempli de False de la longueur du mot. On initialise aussi les "vies" et le tableau des lettres déjà proposées.
progression = [False]*len(mot)
chances = 10
lettresProposees = []
On créé une fonction proposition() qui sera exécutée à chaque fois qu'on demandera une lettre au joueur et qui traitera sa demande.
def proposition():
    lettre = raw_input("Proposez une lettre")
À ce stade, on veut savoir si la lettre que le joueur a proposée est dans le mot, et si oui, à quels emplacements. On créé donc une fonction verifier(lettre). Ici, on initialise une variable resultat qui, sous la forme d'un tableau, contiendra tous les index auxquels la lettre proposée est présente dans le mot. On parcourt donc tout le tableau en quête de la lettre.
def verifier(lettre):
    resultat = []
    for i in range(len(mot)):
        if(mot[i] == lettre):
            resultat.append(i)
    return resultat
D'ici on peut revenir sur la fonction proposition().
def proposition():
    lettre = raw_input("Proposez une lettre")
    lettre = lettre.upper()                         #On la met en majuscule
    if not(lettre in alphabet):                     #La lettre est-elle dans l'alphabet ?
        print "Ceci n'est pas une lettre"
        proposition()                               #On redemande la lettre
        return                                      #On sort de la fonction
    if lettre in lettresProposees:                  #Lettre déjà proposée ?
        print "Vous avez déjà proposé cette lettre"
        proposition()
        return

    lettresProposees.append(lettre)                 #On ajoute la lettre aux lettres proposees

    resultat = verifier(lettre)                     
    ...etc...
Ici, j'ai ajouté toutes les vérifications préalables nécessaires avant de vérifier que la lettre est dans le mot. Le morceau de code "resultat = verifier(lettre)" va récupérer un tableau retourné par la fonction verifier(). Si la lettre n'est pas présente dans le mot, on aura resultat = []. Si, admettons, elle est présente à la première position, on aura resultat = [0] Si elle est présente à la première et a la troisième, resultat = [0, 2]. Et ensuite ? On regarde si résultat est vide. Si il l'est, on lui fera perdre une vie avec la très simple fonction qui suit. (j'ai mis global parce qu'il prenait la variable chances pour une variable locale, n'y faites pas attention mais ajoutez le bien, plus d'infos ici)
def perdreVie():
    global chances
    chances -= 1
    if(chances == 0):
        print "Vous avez perdu ! Le mot était " + mot                    # Dead-end, on ne demande plus de proposition après !
    else:
        proposition()
Sinon, nous allons parcourir resultat avec une boucle et remplacer dans progression les lettres trouvées. Si le mot était ISN, au fur et à mesure le tableau pourrait évoluer en [False, False, False] puis [False, 'S', 'N'] jusque ['I', 'S', 'N'].
def proposition():
    print progression
    lettre = raw_input("Proposez une lettre (" + str(chances) + " chances restantes)")
    lettre = lettre.upper()                         #On la met en majuscules
    if not(lettre in alphabet):                     #Lettre valide ?
        print "Ceci n'est pas une lettre"
        proposition()
        return
    if lettre in lettresProposees:                  #Lettre déjà proposée ?
        print "Vous avez déjà proposé cette lettre"
        proposition()
        return

    lettresProposees.append(lettre)                 #On ajoute la lettre aux lettres proposees
    resultat = verifier(lettre)
    if len(resultat) == 0:                          #Lettre n'est pas dans le mot
        print "La lettre " + lettre + " n'est pas dans le mot"
        perdreVie()
        return
    else:
        for i in range(len(resultat)):
            index = resultat[i]                     #Ou est cette lettre dans le mot ?
            progression[index] = lettre             #On met à jour la progression
        proposition()                               #C'est bien, on continue !
Ici, j'ai ajouté les chances restantes à la demande de la lettre avec str() car chances est un entier et on ne concatène pas les entiers avec les chaines de caractères en Python. Ensuite j'ajoute le traitement de la variable resultat. Au début de la fonction, j'affiche la progression. Il reste deux petites étapes. 1. Vérifier si le joueur a gagné
if not(False in progression):
            print "Le mot était bien " + mot + ", bravo"
            return
2. Afficher sous forme lisible la variable progression (pour cela on la transforme en chaine de caractères et on remplace les False par des underscore pour avoir un rendu genre "INFO_MA_IQUE")
def afficherProgression(progression):
    resultat = ""
    for i in range(len(progression)):
        if(progression[i] == False):
            resultat += "_"
        else:
            resultat += progression[i]
    return resultat
Et voici le code final ! On oublie pas de lancer le jeu en appelant proposition() en bas !
import random

alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
mots = ['informatique', 'isn', 'nyancat']

index = random.randint(0, len(mots) - 1)
mot = mots[index]
mot = mot.upper()                                   #On ne travaillera qu'avec des majuscules

progression = [False]*len(mot)
chances = 10
lettresProposees = []

def proposition():
    print afficherProgression(progression)
    lettre = raw_input("Proposez une lettre (" + str(chances) + " chances restantes)")
    lettre = lettre.upper()                         #On la met en majuscules
    if not(lettre in alphabet):                     #Lettre valide ?
        print "Ceci n'est pas une lettre"
        proposition()
        return
    if lettre in lettresProposees:                  #Lettre déjà proposée ?
        print "Vous avez déjà proposé cette lettre"
        proposition()
        return

    lettresProposees.append(lettre)                 #On ajoute la lettre aux lettres proposees
    resultat = verifier(lettre)
    if len(resultat) == 0:                          #Lettre n'est pas dans le mot
        print "La lettre " + lettre + " n'est pas dans le mot"
        perdreVie()
        return
    else:
        for i in range(len(resultat)):
            index = resultat[i]                     #Ou est cette lettre dans le mot ?
            progression[index] = lettre             #On met à jour la progression
        if not(False in progression):
            print "Le mot était bien " + mot + ", bravo"
            return
        proposition()                               #C'est bien, on continue !

def afficherProgression(progression):
    resultat = ""
    for i in range(len(progression)):
        if(progression[i] == False):
            resultat += "_"
        else:
            resultat += progression[i]
    return resultat

def perdreVie():
    global chances
    chances -= 1
    if chances == 0:
        print "Vous avez perdu ! Le mot était " + mot
    else:
        proposition()

def verifier(lettre):
    resultat = []
    for i in range(len(mot)):
        if(mot[i] == lettre):
            resultat.append(i)
    return resultat

proposition()
Merci d'avoir lu, et laissez un message si vous avez un problème avec le code :)

← Back to posts list