On réfléchit à notre projet pendu …
Découpage fonctionnel :
Version imprimable (en pdf) :
Version un chouïa plus jolie :
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 !
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,
Alors on peut programmer ça de plein de manières différentes, mais dans notre canevas actuel, la fonction teste() renvoie uniquement True ou False, donc renvoie seulement un booléen.
Je te propose donc un if teste(mot, lettre): suivi d’un else : dans lequel tu ferais ton incrémentation de nb_essais_faux. Le if … else est représenté par le losange dans lequel j’ai écrit si « bonne lettre ».
C’est clair ? N’hésite pas TryHarder du Pendu 😉
Merci. Ca fonctionne mieux maintenant et mon pendu est enfin finalisé 😃.
Bravo ! Envoie ton code par mail stp à « christophe point marchant arobase ac tiret strasbourg point fr » 😀
(Remplacer
tiret par –
point par .
arobase par @
évidemment 😉 )
Bonjour,
J’ai un problème avec la fonction nouveau mot, j’arrive pas à remplacer les tirets par des lettres
Bonjour, bonne question.
soluce le mot solution,
mot le mot réponse à modifier,
lettre la lettre qu’on a trouvée à remplacer.
Cette fonction reçoit en paramètres :
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 :
Notez bien que reponse = soluce[0] l’aurait fait aussi 😉
si soluce[i] == lettre, on rajoute (on concatène) lettre à reponse,
sinon, on rajoute ce qu’on avait dans mot à cet endroit là (à l’indice i).
Ensuite on parcourt avec une boucle le mot soluce, par exemple avec une boucle for et on fait un test :
Reste à rajouter après la boucle la dernière lettre et renvoyer reponse.
Bon courage !
Bonjour,
Merci, ça marche, seulement les lettres ne sont pas alignées mais elles sont une par ligne
Tu as bien fait une concaténation ? Publie le bout de code correspondant ou envoie le à « christophe point marchant arobase ac tiret strasbourg point fr » (Remplacer
tiret par –
point par .
arobase par @
évidemment 😉 )
Alors, j’ai reçu ton mail, dans le quel tu envoies :
Alors…
print
!Commence par
reponse = mot[0]
et remplace ton
print
par unreponse +=
if ...
, je mettrais unelse :
Bon courage !
A la fin ne pas oublier le
return reponse
!Bonjour, ça marche merci, néanmoins je n’ai pas compris votre explication sur le nombre d’essai faux
Personne n’est parfait 😉
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
Bonsoir,
Ah oui, au début j’avais une variable
rang
pour compter les erreurs, je l’ai maintenant remplacée parnb_essais_faux
, c’est plus clair.Du coup j’ai changé dans le squelette, merci !
Merci et bonne fin de vacances !
Bonjour !
Dans votre programme du pendu, que signifie « print » ?
Je suis perdue…
Bonsoir,
Euh… je ne sais pas où tu le vois, maisprint
est une fonction qui affiche quelque chose passé en argument dans la console.Par exemple, le programme
produit dans la console :
AAAAAHHHHH !
Je viens de comprendre ta question !!! (Enfin je crois…) Tu as vu ma réponse au commentaire mais pas le programme dont je parle (il était dans un mail) 😀
Alors… je mets le programme dont je parle dans ma réponse, ok !!!
Merci beaucoup pour votre réponse et bonne fin de vacance
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 :
Merci et bonne fin de journée !
Bonjour,
Effectivement, votre fonction donne
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.
Ce qui donne
N’hésitez pas à poser d’autres questions.
Notez juste ceci :
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 ! 🙂
Bonjour !
Absolument ! J’ai d’ailleurs déjà répondu à cette question là :
https://mathonomie.com/2019/10/17/projet-pendu/#comment-6094
Re Bonjour,
Si l’on dessine les traits pour le pendu, la potence doit-elle être deja affiché ?
Merci d’avance pour votre réponse !
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 :
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 !
Re-
Une fonction qui ne retourne rien renvoie
None
.Tu utilise la valeur de retour d’une fonction qui ne renvoie rien ?
Donne le bout de code.
Bonjour, devinez qui c’est ?
C’est Tom !
Voici le code avec le problème :
(listelettre est bien définie plus haut)
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 (desprint
) : 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 :
Sinon , votre ligne 2 n’a pas de sens :
teste
attend deux arguments,soluce
etlettre
, d’une part.D’autre part
teste
renvoie un booléen, doncTrue
ouFalse
, et certainement pas une liste qu’on pourrait mettre danslistelettre
Enfin si
listelettre
est juste une liste des lettres desoluce
(c’est quimotchoix
?), alorslistelettre
ne sert à rien car on peut très bien écrireTestez-le !
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 ?
Merci d’avance
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 (genreb------r
) stockée dans la variablereponse
avec un appel du genrereponse = 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
», cemot
sera alors initialisé à l’appel de la fonction par la valeur contenue dansreponse
lors de l’appelreponse = 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 nouvellereponse
!Bon, à force d’expliquer, ça devient illisible, je m’arrête là… Bon courage !
🙂
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…
En effet j’avais mal saisi le fonctionnement attendu de cette fonction. J’ai pu améliorer cela.
Merci !
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
Bonjour,
Ta fonction
choix_mot()
fait-elle bien unreturn
du mot choisi ou juste unprint
?Bonjour,
Oui, la fonction choix_mot() fait un return de soluce
Tu peux poster ici le bout de code correspondant ainsi que la fonction choix_mot ?
Ahhh, bonsoir, alors…
Le mot choisi a été renvoyé par
choix_mot
et récupéré dansjeu
sous… rienTrois corrections indispensables :
1) récupérer le mot choisi renvoyé par
choix_mot
2) récupérer le
affiche_mot(soluce)
aussi dans une variablereponse
Ta fonction
jeu
devientAinsi
soluce
continent dans la fonctionjeu
le mot à trouver etreponse
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
Le mot que tu as envoyé est alors contenu dans
mot
, c'est doncmot[0]
et(len(mot) - 2)
etmot[-1]
dans cette fonctionaffiche_mot
!Ou tu changes ça ou tu changes le nom du paramètre
def affiche_mot(soluce) :
L'un ou l'autre !
Bon courage !
Merci beaucoup pour l’aide !
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!
Bonsoir,
Dur de répondre sans voir du code, même « en carton » 😉
Envoie du code ou inspire-toi de ce que je viens de répondre ici :
https://mathonomie.com/2019/10/17/projet-pendu/#comment-6164
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
Bonjour !
Pas de panique, step by step.
D’ailleurs, c’est step by step qu’il faut construire réponse.
Je l’explique ici.
Tu ne peux pas changer une lettre de réponse, tu dois reconstruire la chaîne de caractère en testant pour chaque position i si il faut garder reponse[i] ou mettre lettre.
Bon courage !
Je vais essayer merci !
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
Bonne journée*
Bonsoir,
Je réponds à ces questions dans les commentaires. Merci de relire avant de poser une question déjà traitée !
Alors, comme je suis magnanime, on en parle par exemple par là !
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é ?
quand
reponse
est la même chaîne quesoluce
.Donc on continue tant que (
while
)reponse
n’est pas la même chaîne quesoluce
…… et qu’on n’a pas dépassé le nombre de pénalités autorisé !
Donc une structure
while ... and ... :
Bon courage !
D’accord merci beaucoup ^^
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 ^^
Bonjour,
Ah ben oui,
reponse
est une liste chez toi etsoluce
une chaîne de caractères.marchera peut-être… mais mon commentaire arrive peut-être un peu tard !
Confirmation :
Merci beaucoup pour votre aide, je vais essayer de revoir ça rapidement
(J’ai créé une fonction qui permet de faire ce changement, j’ai créé une variable à laquelle j’ajoute à chaque fois la lettre et enfin bref cela me crée une chaîne de caractères. Dois-je la laisser ou remodifier le tout ?
Merci encore ^^
Je ne vais quand-même pas passer à côté de tes efforts louables que je lirai avec plaisir !
D’accord merci beaucoup pour vos réponses ^^
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
Bonsoir,
Peut-être des éléments de réponse ici ?
Je vais essayer avec ça, merci beaucoup 🙂
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 !
Bonjour,
Ça valait bien une mise en forme 😉
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 !
Bonjour, balance du code !
Attention SPOIL
Alors deux choses :
1) Est-ce que quand tu l’appelles, tu envoies
ou
ou pire
… ?
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 fonctionteste
car tu ne la renvoies pas et du coup elle n’existera plus dans ta fonction principalejeu()
Il faudrait plutôt la gérer dans
jeu()
un peu comme ça :Attention SPOIL
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 » :
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 pasnb_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 denb_essais_faux
, qu’on lui envoie.Bon courage !
Ahhhh d’accooord tout s’éclaire enfin 😂 Merci!
Bonsoir, pouvez- vous me donner des pistes pour la fonction affiche_penalité() svpppp?
Elle ne fait que dessiner un pendu, comme ici ou là.
D’ailleurs, tout est déjà expliqué ici.
Bien le bonsoir et bon courage !
Bonsoir,
je ne parviens pas à faire les traits pour le pendu. (à vrai dire j’aimerai des pistes pour commencer dès le début de cette fonction car la mienne ne donne pas grand chose).Can you help me plzzz?
Comment fait-on pour réaliser la potence ?
Bonsoir…
Ben, suivre les dessins déjà présents dans ces commentaires, faits de slashs « / », d’antislashs « \ », de « pipes » « | » (AltGr 6), de tirets du bas ou underscores « _ »… Du courage et des
print()
.c’est fait! J’espère que tout fonctionnera comme il faut. Merci et bonne soirée!
Je croise les doigts !
J’aimerais ajouté « Quelle lettre proposez-vous ? » mais je ne sais pas dans quelle fonction et à quel endroit il doit apparaitre. Merci d’avance.
Ah ça c’est dans «
jeu()
» dans le «input
» par exemple, à la ligne 9 de ce gros « spoil ».Bonsoir !
Voila ma fonction, mais je rencontre des difficultés à la finaliser… Aidez-moi svpp ;(
Bonsoir, j’ai mis en forme mais je laisse les autres contributeurs répondre.
Je dis juste que 13 essais faux, c’est beaucoup !
Et les lignes 3 à 5 n’ont rien à faire dans «
affiche_penalite
»😭 MES camarades de classe pouvaient m’aidez SIL VOUPLAIS 😫😢
Bonjour,
Je rentre tard cette nuit et partage ce matin ton désarroi.
Où est la « communauté ISN / NSI » ?
Toujours personne ? ☹️
Franchement, je n’ai pas mieux que ça :
https://mathonomie.com/2019/10/17/projet-pendu/#comment-6155
Mais en gros dans une version, il y aurait des tests à faire donc des if… elif … else comme dans ton code pour afficher (avec des print) des dessins différents de pendus plus ou moins pendus…
Bon courage !