Categories
Apprentissage Python

Deuxième TP, deuxième casse-tête !

Bonjour à tous ! 🙂

Voilà 3 jours que je travaille sur mon deuxième TP (quel casse-tête!) : le jeu du Pendu…
Et je vous avouerais que j’ai fait face à de nombreuses difficultés !

Après avoir bien visualisé mon code, puis commencé la rédaction simplifiée, je me suis lancée dans l’écriture complète du programme.
J’ai réalisé beaucoup d’essais pour réussir à faire fonctionner mon jeu.
Et notamment pour trouver comment :

Afficher le mot sous forme de mot mystère (avec des étoiles)

J’ai d’abord mis le mot sélectionné sous forme de liste en utilisant la recherche dans une chaîne de caractères :

mon_mot = [ lettre for lettre in m]

Ici, la liste – que j’ai nommée « mon_mot » – va être créée en prenant le mot « m » lettre après lettre et en ajoutant chaque caractère comme un objet de la liste.

Sur le même principe, j’ai créé le mot mystère comme étant une liste où chaque objet (lettre) de « mon_mot » est remplacé par une étoile.

mystere = [" * " for lettre in mon_mot]

Bonus : pour un affichage sans les crochets caractéristiques de la liste, j’ai utilisé le paramètre « en liste » lors de l’exécution de « print » :

print(*mystere)
Trouver la lettre demandée dans le mot (surtout quand il y a plusieurs fois la même lettre !)

Ici, j’ai créé une boucle de recherche dans toute la liste pour que toutes les lettres identiques puissent être trouvées.

J’ai d’abord demandé de compter le nombre de lettres identiques dans le mot :

compte_lettre = m.count(choix_lettre)

Puis j’ai mis comme paramètre d’arrêt de la boucle sur ce nombre :

i=0
while i != compte_lettre :
    rech_lettre = mon_mot.index(choix_lettre)
    mon_mot[rech_lettre] = "*"
    mystere[rech_lettre] = choix_lettre
    i += 1
Arrêter le programme lorsque le mot est trouvé

Ce point fut plus compliqué à démêler, car j’arrivais à finir le mot sans que le programme passe ensuite au calcul des scores…

Dans un premier temps, il faut arrêter la recherche de lettre.
Pour ça, il faut qu’à chaque lettre trouvée la longueur du mot « m » diminue.
Et j’ai mis une condition « if » sur cette longueur qui doit être strictement inférieure à 1 (si c’est à 0, après avoir trouvé toutes les lettres, le programme me demande encore une lettre !) :

long = len(m)
compte_lettre = m.count(choix_lettre)
if long > 1 :
    # recherche et remplacement de la lettre - voir au dessus #
    long = long - compte_lettre

La fin de la condition « if » ainsi créée permet ensuite de sortir du programme en ayant trouvé le mot. Et pour arrêter complètement la boucle, j’ai utilisé la fonction « break » :

else :
    print("\nBravo, vous avez trouvé le mot mystere : ", m )
    break

Casse-tête résolu ! 🙂
J’ai donc sorti un programme permettant de jouer au Pendu, dont voici le code :

# -*-coding:Latin-1 -*

# ************* Programme du jeu du Pendu ***************
import os
import random

print("Bienvenue dans le jeu du Pendu ! \n")

pseudo = input("Quel est votre nom ? ")  #*** joueur
score = 0   #*** score nul pour débuter
print("\nL'ordinateur va choisir aléatoirement un mot à découvrir.\n\
      Vous avez 8 chances pour y arriver ! \n\
      C'est parti...")
mot_mystere = ["vision", "bateau", "chouette", "bonjour", "amour", "festival"]
no_mot = random.randrange(6) # **** recherche aléatoire du mot dans liste données
m=mot_mystere[no_mot]
long = len(m)
print("\nLe mot mystère comporte ", long, " lettres à trouver :")
mon_mot = [ lettre for lettre in m]   # *** extraire le mot sous forme de liste par lettre
mystere = [" * " for lettre in mon_mot]   # *** remplace les lettres par une *
print(*mystere)
print("\nA vous de le trouver ! ")
essai = 8
while essai > 0 :
    choix_lettre = input("\nTapez une lettre :   ")
    choix_lettre = choix_lettre.lower()  # *** mettre la mettre en minuscule
    compte_lettre = m.count(choix_lettre)
    try :
        rech_lettre = mon_mot.index(choix_lettre)   # *** recherche la lettre dans le mot
    except ValueError :  # *** si la lettre n'est pas dans le mot
        try :
            choix_lettre != int(choix_lettre)  # *** vérifie que ce n'est pas un nombre
        except ValueError :
            print("Cette lettre n'est pas dans le mot mystère")
            essai = essai -1
            print("Il vous reste ", essai, " coups")
            coup_rest = essai
        else :
            print("Etes vous sûr de votre frappe ?")
    else :  
        if long > 1 :
            i=0
            while i != compte_lettre :   # *** si lettre ds mot, remplacer *
                rech_lettre = mon_mot.index(choix_lettre)
                mon_mot[rech_lettre] = "*"
                mystere[rech_lettre] = choix_lettre
                i += 1
            long = long - compte_lettre
        else :  # *** mot entièrement trouvé
            print("\nBravo, vous avez trouvé le mot mystere : ", m )
            break
        print(*mystere)
        print("Il vous reste ", essai, " coups")
# *** calcul du score
score = score + coup_rest
if coup_rest == 0 :  # *** mention spéciale si le mot n'a pas été trouvé
    print("\nVous avez perdu ! Le mot mystère était : ", m)
print("\n", pseudo, " , votre score est de : ", score, " points")

os.system("pause")   # met en pause le système Windows

Pour mémoire, voici le lien de l’énoncé : https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/232565-tp-realisez-un-bon-vieux-pendu


Je vous vois venir…
Vous allez me dire :  » c’est bien beau tout ça, mais tu n’as pas réalisé le TP exactement comme demandé dans le cours ! »
Exact !
Tout simplement parce que je voulais vous proposer un début de solution à ce casse-tête avant de continuer à bosser dessus… Car je dois faire des recherches plus approfondies sur la lecture/écriture dans un fichier !


La suite dans un prochain post ! 😉

Spread the love

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.