Projet pendu

On réfléchit à notre projet pendu …

Découpage fonctionnel :

cm 2019-10-16 NSI réflexion pendu_1cm 2019-10-16 NSI réflexion pendu_2

Version imprimable (en pdf) :

Version un chouïa plus jolie :

cm 2019-10-16 NSI pendu

On a codé en corrigé du fake test cette fonction :

def mot_affiche(mot):
    """
        qui attend en argument une chaîne de caractères mot,
        renvoie une chaîne de caractères avec
            la même première lettre que mot,
            la même dernière lettre que mot,
            des tirets entre les deux pour avoir la même longueur que mot.
        Exemple, avec mot = "ausgezeichnet":
        la fonction renvoie la chaîne :  "a-----------t"
    """

    # premier caractère : le même
    reponse = mot[0]

    # des tirets
    for i in range(len(mot) - 2) :
        reponse += '-'

    # dernière lettre
    reponse += mot[-1]

    return reponse

    # ou seulement
    #return mot[0] + '-' * (len(mot) - 2) + mot[-1]

La structure du programme est donc :

from time import sleep
from random import choice

def mot_affiche(mot):

def affiche_penalite(nb_essais_faux) :

def choix_mot():

def teste(mot, lettre):

def nouveau_mot_affiche(soluce, mot, lettre) :

def jeu():

jeu()

A programmer pendant les vacances studieuses… 😀

Bonnes vacances et bon courage !

 

92 réflexions au sujet de « Projet pendu »

  1. Bonjour, j’ai un problème avec ma variable du nombre d’essai faux que je n’arrive pas à modifier depuis la fonction du test de la lettre. J’ai pourtant essayé de la mettre en argument de la fonction mais ça ne fonctionne toujours pas.

    • Bonjour, bonne question.
      Cette fonction reçoit en paramètres :
      \circ soluce le mot solution,
      \circ mot le mot réponse à modifier,
      \circ lettre la lettre qu’on a trouvée à remplacer.
      Je préconise de créer lettre par lettre le nouveau mot, appelons le reponse.
      A l’image de la fonction mot_affiche, on pose la première lettre :

      reponse = mot[0]

      Notez bien que reponse = soluce[0] l’aurait fait aussi 😉
      Ensuite on parcourt avec une boucle le mot soluce, par exemple avec une boucle for et on fait un test :
      \circ si soluce[i] == lettre, on rajoute (on concatène) lettre à reponse,
      \circ sinon, on rajoute ce qu’on avait dans mot à cet endroit là (à l’indice i).
      Reste à rajouter après la boucle la dernière lettre et renvoyer reponse.
      Bon courage !

  2. Bonjour,
    Dans la fonction « affiche pénalité », elle attend un argument « rang », que signifie « rang »
    Merci pour votre réponse et bonne après midi

  3. Bonjour !
    J’ai ce morceau de code qui devrait me permettre de couper le motchoix et de le mettre dans une liste. Malheuresement, il ne le coupe pas mais le met juste dans ma liste. HELP plzz :

    def teste(motchoix, lettre):
        listemot = []
        listelettre = []
        listemot.append (motchoix)
        for i in range (len(listemot)):
            listelettre.append (listemot [i])
        listelettre.append (lettre)
        return listelettre

    Merci et bonne fin de journée !

    • Bonjour,
      Effectivement, votre fonction donne

      >>> teste("Marchant",'?')
      ['Marchant', '?']
      >>> 

      En fait listemot est inutile. C’est motchoix qui est un string, donc une chaîne de caractères, donc un peu une liste de caractères !
      Je propose une évolution, qui fait autre chose, mais pas forcément finalisée.

      def teste2(motchoix, lettre):
          listelettre = []
          for c in motchoix:
              listelettre.append (c)
          # pourquoi cette ligne suivante ?
          listelettre.append (lettre)
          return listelettre

      Ce qui donne

      >>> teste2("Marchant",'?')
      ['M', 'a', 'r', 'c', 'h', 'a', 'n', 't', '?']
      >>> 

      N’hésitez pas à poser d’autres questions.
      Notez juste ceci :

      >>> 'a' in "Marchant"
      True
      >>> 'e' in "Marchant"
      False
      >>> 
  4. Bonjour Monsieur !
    J’espère que vous passez de bonne vacances, en classe vous avez mis que la fonction  »affiche_penalite » attendais en argument  »rang » , cet argument est-il le nombre d’essais ?
    Bonne fin de vacances ! 🙂

      • Ben je ne sais pas trop… J’ai déjà reçu des programmes où ça donnait ça, mais ce n’est qu’un exemple :

        Quelle lettre suggérez-vous ? y
        
        Mathonom-e
        
         _______
          |/    |
          |
          |
          |
          |
          |
         _|___
        
        Quelle lettre suggérez-vous ? z
        
        Mathonom-e
        
         _______
          |/    |
          |    (_)
          |
          |
          |
          |
         _|___
        
        Quelle lettre suggérez-vous ? i
        
        Bravo !
        
        Mathonomie
        
        Gagné en  9  essais ! Avec  2  erreurs !
        >>> 
  5. Bonsoir, c’est encore moi !
    Je recois un message d’eurreur car j’ai un argument de type ‘NoneType’ . Qu’est ce que c’est ?
    merci de votre réponse !

  6. Bonjour, devinez qui c’est ?
    C’est Tom !
    Voici le code avec le problème :
    (listelettre est bien définie plus haut)

    def nouveau_mot_affiche(reponse, motchoix, lettre) :
        listelettre = teste(motchoix)
        print (reponse)
        if lettre in listelettre:
            print ('cest bon !!!')
        
        else:
            listelettre.append (lettre)
            print ('cest pas bon !!!')

    C’est un début de code donc motchoix n’est pas utilisé ici, c’est juste que la fonction renvoie ‘NoType’

    Bonne fin de nuit !

    • Bonjour,
      Alors votre fonction ne renvoie rien, donc elle est forcément de type None c’est le cas pour toutes les fonctions qui font autre chose que des affichages (des print) : elle doivent renvoyer (return) quelque chose !
      Alors nouveau_mot_affiche doit renvoyer une chaine de caractère : nouveau_mot_affiche("M--ch--t", "Marchant", 'a') renvoie "Ma-cha-t", on est bien d’accord ?
      Donc elle est du style :

      def nouveau_mot_affiche(reponse, soluce, lettre):
          mot = reponse[0]
          for ... :
              if ... :
                  ...
              else :
                  ...
              return mot

      Sinon , votre ligne 2 n’a pas de sens : teste attend deux arguments, soluce et lettre, d’une part.
      D’autre part teste renvoie un booléen, donc True ou False, et certainement pas une liste qu’on pourrait mettre dans listelettre

      Enfin si listelettre est juste une liste des lettres de soluce (c’est qui motchoix ?), alors listelettre ne sert à rien car on peut très bien écrire

      def encouragements(truc) :
          print(truc[1:-1])
          if 'a' in truc[1:-1]:
              return("Bon courage !")
          
      chose = encouragements("Marchant")
      
      print(chose)

      Testez-le !

  7. Bonjour, je suis entrain de corriger mon code mais je n’ai pas tout à fait saisi comment fonctionne la fonction affiche_penalite. S’agit-il seulement d’un compteur ou bien encore autre chose ?

      • J’ai aussi un autre problème, lorsque je trouves une lettre et que j’ai alors par exmple bo–o-r, si j’essai « n » qui est aussi dans le mot, j’obtiens b-n—r au lieu de bon-o-r. Je suis allée voir dans ma fonction nouveau_mot_affiche mais je ne trouves pas comment y remédier.

        • A chaque fois, il faut faire évoluer le mot affiché qui est chez nous reponse.

          Donc ta fonction mot_affiche appelée une seule fois au début du jeu a une valeur de retour (genre b------r) stockée dans la variable reponse avec un appel du genre reponse = mot_affiche(soluce).

          Ensuite on rentre dans le jeu proprement dit, qui est implémenté avec une boucle while.

          Dans cette boucle, à chaque bonne réponse nouvelle, on fait évoluer le mot qui va s’afficher avec
          reponse = nouveau_mot_affiche(soluce, reponse, lettre)

          « Euh, Marchant, dans ton squelette, c’est
          nouveau_mot_affiche(soluce, mot, lettre) ? »

          « Ah, oui, mais c’est bien la chaîne contenue dans reponse dont il faut passer la valeur en paramètre et récupérer dans reponse le nouveau mot ! »

          Même si dans la définition de la fonction (dans son entête) , le deuxième paramètre est « mot », ce mot sera alors initialisé à l’appel de la fonction par la valeur contenue dans reponse lors de l’appel
          reponse = nouveau_mot_affiche(soluce, reponse, lettre)
          … et il est alors indispensable que ta fonction renvoie (return) quelque chose (la nouvelle chaîne de caractère à afficher) : c’est celle là qui constituera notre nouvelle reponse !

          Bon, à force d’expliquer, ça devient illisible, je m’arrête là… Bon courage !

    • Bonjour,
      La fonction s’appelle « affiche_penalite » et comme son nom l’indique, elle ne fait qu’afficher la pénalité, donc illustrer avec des print le nombre d’essais faux.

      Elle reçoit donc en paramètre le nombre d’essais faux. Si c’est un, elle commence la potence, si c’est deux, elle fait la potence mais aussi le pendu…

      En gros, affiche_penalite(1) fait un truc comme ça :

      _______
        |/    |
        |
        |
        |
        |
        |
       _|___

      Et, par exemple, affiche_penalite(2) fait un truc comme ça :

       _______
        |/    |
        |    (_)
        |
        |
        |
        |
       _|___

      C’est tout. Donc suivant les cas, un affichage différent.
      On peut le gérer avec une structure conditionnelle if … elif … elif … else ou avec une liste de chaînes de caractères…

  8. Bonjour,
    J’ai un petit problème à propos du pendue,
    dans ma fonction jeu j’appelle j’appel choix_mot() qui fait un choice d’un liste « mot » (soluce = choice(mot)) . Toute seule la fonction fonctionne mais quand j’utilise la fonction affiche_mot(soluce)
    cela me dit que soluce n’est pas définie .
    Pourriez -vous m’aider a ce propos ?
    Merci d’avance

          • def jeu():
                choix_mot()
                affiche_mot(soluce)
                ...
            
            def choix_mot():
                mot=["Tracteur","Fraise","Girafe","Armoire"]
                soluce = choice(mot)
                return soluce
            
            def affiche_mot(mot):
                reponse = soluce[0]
                for i in range(len(soluce)-2):
                    reponse += "-"
                reponse += soluce[-1]
                return reponse
            • Ahhh, bonsoir, alors…

              Le mot choisi a été renvoyé par choix_mot et récupéré dans jeu sous… rien
              Trois corrections indispensables :
              1) récupérer le mot choisi renvoyé par choix_mot
              2) récupérer le affiche_mot(soluce) aussi dans une variable reponse
              Ta fonction jeu devient

              def jeu():
                  soluce = choix_mot()
                  reponse = affiche_mot(soluce)
                  ...

              Ainsi soluce continent dans la fonction jeu le mot à trouver et reponse contient le mot avec des tirets qui évolue pendant le jeu.
              3) tu envoies bien soluce en paramètre à affiche_mot avec le code ci-dessus.
              Mais tu définis affiche_mot avec

              def affiche_mot(mot)
                  ...

              Le mot que tu as envoyé est alors contenu dans mot, c'est donc mot[0] et (len(mot) - 2) et mot[-1] dans cette fonction affiche_mot !
              Ou tu changes ça ou tu changes le nom du paramètre def affiche_mot(soluce) :
              L'un ou l'autre !

              Bon courage !

  9. Bonjour !
    J’ai un problème avec mon code et en particulier avec ma fonction jeu(). Elle appelle en premier ma fonction choix_mot(), mais quand je lui demande de return mon mot, elle m’affiche ‘0’, qui est la chaine de caractère que j’ai défini pour mot, en dehors de toute fonction. En gros, j’ai l’impression que mon choix_mot() se fait un peu zapper dans mon code, je ne sais pas vraiment comment faire pour qu’il ne se fasse pas oublier, merci d’avance pour votre réponse!

  10. Bonsoir,
    Je me suis un petit peut remotivé donc voici mon code:

    def nouveau_mot_affiche(reponse, motchoix, lettre) :
    t = teste(motchoix, lettre)
    if t == True:
    for i in range(len(motchoix)):
    if lettre == motchoix[i]:
    reponse[i] = (motchoix[i])
    elif t == False:
    print (‘Mauvaise lettre ! ‘)
    return reponse

    Le problème survient quand je lance le programme et que t = True, ce message d’erreur apparait :
    ‘str’ object does not support item assignment
    j’ai tout essayé mais je suis bloqué. Merci de m’aider et bonne fin de soirée

  11. Bonjour,
    je n’ai pas bien compris comment remplir la fonction nouveaux mot affiche,
    il doit remplacer la lettre trouvé à la place du tiret ?
    cordialement

  12. Bonjoooour !

    J’aurai besoin d’aide pour la boucle while : on doit tester « tant que pas gagné », mais comment sait-on quand on a gagné ?

    Ma question n’est pas trop compréhensive mais je ne sais pas quoi écrire pour cette boucle while…

    Merci d’avance !

    • En fait, quand a-t-on gagné ?
      \rightarrow quand reponse est la même chaîne que soluce.
      Donc on continue tant que (while) reponse n’est pas la même chaîne que soluce
      … et qu’on n’a pas dépassé le nombre de pénalités autorisé !
      Donc une structure while ... and ... :
      Bon courage !

      • Bonjour,

        J’ai encore et toujours un problème avec cette partie ; j’ai ma boucle while (pour l’instant j’ai laissé tomber les pénalités et je me concentre uniquement sur mes lettres). J’ai donc « tant que soluce n’est pas égal à reponse », ça c’est cool et le jeu marche ! Mais lorsque le mot est trouvé, je n’arrive pas à sortir de la boucle… Comment faire ?

        NB :
        print(reponse) m’affiche : [‘p’, ‘i’, ‘k’, ‘a’, ‘c’, ‘h’, ‘u’]
        print(soluce) m’affiche : pikachu
        Peut être que le problème vient d’ici ?

        Merci pour votre aide ^^

  13. Re bonjoooour !

    J’ai un soucis au niveau de la fonction nouveau_mot_affiche, ma fonction remplace bien les tirets par la lettre donnée mais elle remplace également les anciennes lettres déjà trouvées

    Exemple pour le mot « Pikachu »
    Quelle lettre veux-tu jouer ?k
    Bravo
    p-k—-u
    Quelle lettre veux-tu jouer ?c
    Bravo
    p—c–u
    Quelle lettre veux-tu jouer ?i
    Bravo
    pi—–u
    Quelle lettre veux-tu jouer ?

    Comment faire ?

    Merci de votre aide

  14. Bonsoir Monsieur,
    Je sais pas trop ce qui m’arrive mais j’ai eu un élan de courage et j’ai décidé de représenter le pendu sur la Shell mais j’ai un petit soucis… Je n’arrive pas à la faire apparaître, car quand je n’arrive pas a faire rentrer la potence dans mon print et cela m’affiche print (« ————–
    |
    |
    |
    |
    |
    |
    |
    |
    /|\
    / | \
    / | \

    Est-ce qu’il existe une fonction qui peut englober tout ?
    En espérant que vous ne dormiez pas et que vous trouviez le courage de me répondre !
    Bonne soirée et à bientôt !

    • Bon après 50min de dur labeur (et de musique dans les oreilles pour ne pas casser mon ordinateur !) voilà le résultat :
      [code language = "python"]print(" ---|---------------")
      print(" | / |")
      print(" | / |")
      print(" |/ / \ ")
      print(" | \ /")
      print(" | __|__")
      print(" | |")
      print(" | |")
      print(" | / \ ")
      print(" | / \ ")
      print(" /|\ ")
      print(" / | \ ")
      print(" / | \ ")[\code]

      Même si je suis bien au courant que c'est certainement pas le plus optimisé, il est fonctionnel et j'ai envie de dire que c'est le principal !
      Je vais pouvoir dormir en paix et avec de la fierté ce soir...
      Passez une bonne nuit et à mercredi !

  15. Bonjour,
    J’ai un problème dans ma fonction  » def teste(mot, lettre):  » si la lettre est juste il affiche false et si la lettre est faux aussi ( dans les deux cas sa affiche false ) , je sais pas que faire .

    Merci d’avance !

      • def teste(mot, lettre):
            if lettre  in mot[1:-1]:
                print("La lettre appartient  au mot")
                return True
            else:
                nb_essais_faux = 0
                if lettre not in mot[1:-1]:
                    nb_essais_faux += 1
                print("La lettre n'appartient pas au mot")
                return False
        • Attention SPOIL
          Alors deux choses :
          1) Est-ce que quand tu l’appelles, tu envoies

          if teste(soluce, lettre) :

          ou

          if teste(reponse, lettre) :

          ou pire

          if teste(mot, lettre) :

          … ?
          Parce que c’est bien avec soluce (soit le mot à trouver complet) qu’il faut l’envoyer…
          2) Ta variable nb_essais_faux ne sert à rien dans la fonction teste car tu ne la renvoies pas et du coup elle n’existera plus dans ta fonction principale jeu()
          Il faudrait plutôt la gérer dans jeu() un peu comme ça :

          Attention SPOIL

          if teste(soluce, lettre) :
              print("Bien joué !")
              reponse = nouveau_mot_affiche(soluce, reponse, lettre)
          else :
              nb_essais_faux += 1
              affiche_penalite(nb_essais_faux)
  16. A ceux qui viennent de me poser une question via MBN :

    Attention spoil !

    Avant tout, votre fonction jeu() doit être structurée autour d’une structure « tant que pas gagné et pas perdu » :

    def jeu():
        soluce = # appel d'une fonction de choix. soluce est alors le mot complet à trouver
        reponse = mot_affiche(soluce) # reponse est alors première lettre, dernière lettre, tirets entre
        lettre_testees=[]  # liste vide au début
        nb_essais_faux = 0 # initialisation avant de jouer
        while ... : # tant qu'on a pas gagné et pas perdu
            # affichage du mot tel qu'il est
            # affichage des lettres déjà testées 
            # saisie de lettre 
            if lettre in lettre_testees :
                continue
            lettre_testees.append(lettre)
            # et là le code déjà spoilé
            if teste(soluce, lettre) :
                print("Bien joué !")
                reponse = nouveau_mot_affiche(soluce, reponse, lettre)
            else :
                nb_essais_faux += 1
                affiche_penalite(nb_essais_faux)
            sleep(1)
        # on est sorti du while
        if ... : # si gagné 
            print("C'est gagné !")
        else :
            print("C'est perdu !")
        print("Le mot était",soluce)
    
    jeu()
  17. Bonjour monsieur,
    Je n’arrive pas à faire ma fonction nb_d’essais_faux. Pouvez vous m’aidez svp?
    (J’ai la suite du programme presque fini mais j’ai dû revenir sur cette fonction car je n’y arrivais pas)
    Merci pour votre aide!

    • Regarde le code spoilé ci-dessus, tu vois que nb_essais_faux n’est pas une fonction ( ce n’est pas nb_essais_faux()) et donc que c’est une variable !
      On l’initialise à zéro (voir ligne 5 dans le code spoilé ci-dessus) et ensuite on l’incrémente en lui ajoutant un si c’est faux, voir ligne 18.
      Après la fonction appelée ligne 19 affiche_penalite(nb_essais_faux) ne fait qu’afficher la pénalité soit … dessiner le pendu ! … en fonction de la valeur de nb_essais_faux, qu’on lui envoie.
      Bon courage !

  18. J’aimerais ajouté « Quelle lettre proposez-vous ? » mais je ne sais pas dans quelle fonction et à quel endroit il doit apparaitre. Merci d’avance.

  19. Voila ma fonction, mais je rencontre des difficultés à la finaliser… Aidez-moi svpp ;(

    def affiche_penalite(nb_essais_faux) :
    
        while reponse == soluce:
            if lettre in mot[1:-1]:
                lettre = reponse
            
            elif nb_essais_faux == 1 :
                 print(" ---|---------------")
            elif nb_essais_faux == 2:
                print(" | / |")
            elif nb_essais_faux == 3:
                print(" | / |")
            elif nb_essais_faux == 4:
                print(" |/ / \ ")
            elif nb_essais_faux == 5:
                print(" | \ /")
            elif nb_essais_faux == 6:
                print(" | __|__")
            elif nb_essais_faux == 7:
                print(" | |")
            elif nb_essais_faux == 8:
                print(" | |")
            elif nb_essais_faux == 9:
                print(" | / \ ")
            elif nb_essais_faux == 10:
                print(" | / \ ")
            elif nb_essais_faux == 11:
                print(" /|\ ")
            elif nb_essais_faux == 12:
                print(" / | \ ")
            elif nb_essais_faux == 13:
                print(" /  |  \ ")
        
    
        print ("Vous avez", nb_essais_faux,"fautes")

N'hésitez-pas à poser une question, ou faire avancer le schmilblick

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.