Écriture d’un jeu du pendu
Dans ce tutoriel, nous aborderons l’écriture d’un jeu assez connu : le pendu. Pour rappel, le jeu du pendu consiste à trouver, lettre par lettre, un mot qui n’est pas révélé au joueur, et ce avec un nombre limité d’essais. Il est généralement accompagné d’un petit dessin mais nous nous limiterons à du texte ici pour des raisons de simplicité.
Attention : ce tutoriel présuppose que vous avez déjà des connaissances basiques en programmation (notion de variable, de boucle, etc).
Le meilleur moyen d’écrire un programme rapidement et efficacement est de l’écrire étape par étape, de manière modulaire.
Ici, on veut faire un jeu du pendu.
Commençons d’abord par le plus important : les mots. Pour faire un pendu, il faut une liste de mots et un mot choisi au hasard.
mots = [ "BONJOUR", "ORDINATEUR", "CLAVIER", "SOURIS", "CHEVAL", "OISEAU", "CHIEN" ] mot = choix(mots)
Le code ci-dessus crée une liste de mots puis choisit un mot au hasard à l’aide de la fonction choix
.
Ensuite, on veut afficher une version « vide » du mot au départ, ou en d’autres termes afficher des _ à la place des lettres.
saisi = ["_"] * taille(mot)
Le code ci-dessus crée une liste contenant un tiret-bas puis la « multiplie » par la longueur du mot. Ici, cela va donner une liste contenant autant d’éléments que de lettres dans le mot, et où chaque élément est un tiret-bas. On se servira de cette liste pour stocker l’état actuel de la partie.
Il faut également stocker le nombre d’essais restants.
essais = 10
Jusqu’ici, ça donne ça :
mots = [ "BONJOUR", "ORDINATEUR", "CLAVIER", "SOURIS", "CHEVAL", "OISEAU", "CHIEN" ] mot = choix(mots) saisi = ["_"] * taille(mot) essais = 10
Maintenant, on va commencer le code du jeu. Le jeu consiste en une répétition d’actions :
- Afficher le mot « actuel » et le nombre d’essais restants
- Demander une lettre
- Vérifier si la lettre est bonne
- Répéter
En code, cela donne ceci :
while True: # afficher le mot # demander une lettre # vérifier la lettre
Procédons étape par étape. D’abord, afficher le mot et le nombre d’essais :
print(" ".join(saisi))
Le code " ".join(...)
permet d’afficher tous les éléments, séparés par des espaces.
print("%d essais restants" % essais)
Le %d
indique qu’il faut insérer ici le nombre d’essais.
Ensuite, on veut demander une lettre.
lettre = input("? ")
Le programme affichera un point d’interrogation puis demandera à l’utilisateur de saisir une lettre.
Pour terminer, on doit vérifier si la lettre est ou non dans le mot à trouver. Pour cela, on va vérifier, pour chaque lettre du mot, si celle-ci est identique à la lettre saisie par l’utilisation, auquel cas on remplace le _ par la lettre en question.
for i in range(taille(mot)): if mot[i] == lettre: saisi[i] = lettre
Voici le code actuel de la boucle :
while True: print(" ".join(saisi)) print("%d essais restants" % essais) lettre = input("? ") for i in range(taille(mot)): if mot[i] == lettre: saisi[i] = lettre
On se rapproche du but, mais il reste encore quelques problèmes à régler :
- Il faut que le jeu s’arrête si on dépasse les 10 essais ou si on trouve le mot
- Il faut que ça fonctionne peu importe si l’utilisateur écrit en majuscules ou en minuscules
- Il faut que ça affiche le mot si l’utilisateur perd
Procédons dans l’ordre. D’abord, arrêter le jeu si on dépasse les 10 essais, et afficher le mot.
while True: if essais <= 0: print("Vous avez perdu !") print("Le mot était : " + mot) break ...
break
sert à sortir de la boucle while
.
Il faut aussi enlever 1 au nombre d’essais restants, mais si et seulement si l’utilisateur entre une lettre qui n’est pas dans le mot.
while True: ... if lettre not in mot: essais -= 1
Le code est assez explicite, not in
signifie littéralement « pas dans » en anglais. Si la lettre n’est pas dans le mot, c’est une faute.
Ensuite, il faut arrêter le jeu si on a trouvé le mot.
while True: ... if saisi == list(mot): print("Vous avez gagné !") break ...
Ici, saisi
est une liste tandis que mot
est une chaîne de caractères, il faut donc convertir l’un ou l’autre (on ne peut comparer deux objets que s’ils sont du même type).
On veut aussi ignorer la casse de l’entrée (pour que ça marche avec les majuscules et les minuscules). Vu que nos mots sont en majuscule, on n’a qu’à convertir ce que l’utilisateur tape en majuscules :
while True: ... lettre = maju(input("? ")) ...
Et on ajoute ceci pour mettre de l’espacement entre chaque tour :
while True: ... print(" ")
Voici à quoi ressemble le code final :
mots = [ "BONJOUR", "ORDINATEUR", "CLAVIER", "SOURIS", "CHEVAL", "OISEAU", "CHIEN" ] mot = choix(mots) saisi = ["_"] * taille(mot) essais = 10 while True: if essais <= 0: print("Vous avez perdu !") print("Le mot était : " + mot) break print(" ".join(saisi)) if saisi == list(mot): print("Vous avez gagné !") break print("%d essais restants" % essais) lettre = maju(input("? ")) for i in range(taille(mot)): if mot[i] == lettre: saisi[i] = lettre if lettre not in mot: essais -= 1 print(" ")
Voici un exemple de partie :
_ _ _ _ _ _ 10 essais restants ? a _ _ _ _ A _ 10 essais restants ? l _ _ _ _ A L 10 essais restants ? i _ _ _ _ A L 9 essais restants ? c C _ _ _ A L 9 essais restants ? r C _ _ _ A L 8 essais restants ? t C _ _ _ A L 7 essais restants ? h C H _ _ A L 7 essais restants ? v C H _ V A L 7 essais restants ? e C H E V A L Vous avez gagné ! fin de l'exécution [0:00:51.610575]
Laisser un commentaire