Pendu python

Fermé
_juan75 - Modifié le 2 nov. 2021 à 15:12
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021 - 8 nov. 2021 à 21:06
Bonjour,
J'ai un problème de python, comme tout bon débutant je fais un jeu du pendu mais j'ai quelques problèmes :
Tout d'abord quand on lance mon programme :
1- La fonction "vie" marche parfaitement, elle demande le niveau souhaiter et s'actualise en fonction,
2- Quand on nous demande d'entrer une lettre et qu'on la rentre par exemple "a" avec le mot "clavier", et bien sa met "--a----", donc sa marche mais ensuite il y a deux cas de figures (qui sont tout les deux des problèmes):
a) Donc on rentre une deuxième lettre qui EST dans le mot, par exemple "c", le code va mettre "c------" et supprimer le "a".
b) Deuxième cas de figure on rentre une lettre qui N'EST PAS dans le mot par exemple "z" , le code va mettre "-------" et supprimer le mot d'avant .
3- lorsque on met une mauvaise lettre, il affiche une diminution de trois unité sur le score au lieu d'une, comme si la fonction tourné trois fois ???? , alors pour l'instant j'ai rajouter un " + 3".

Désolé pour ce gros pavé et merci de m'orienté.
(Essayer de lancer le programme pour voir les problèmes)

# debut du jeu

from random import randint
def liste_mots():
liste=["nsi","math","ordinateur"]
return liste


def difficulte():
vie = 12
v = 0
while v != 1 and v != 2 and v != 3:
v = int(input("quelle niveau : 1,2 ou 3 ?"))
if v == 1:
vie=12
print('niveau 1 ->',vie,'vie')
elif v == 2:
vie=6
print('niveau 2 ->', vie, 'vies')
elif v == 3:
vie = 3
print('niveau 3 ->', vie, 'vies')
return vie



#Mot de départ avec tiret

def tiret_mot(mot):
n = len(mot)
res=''
for i in range (n):
res = res + "-"
return res

#Tirage du mot

def choix_mot(liste):
return (liste[randint(0,len(liste)-1)])


def tour_de_jeu(lettre, mot_a_tir, mot_initial,score):
mot_a_tir = ""
while score > 0:
for i in mot_initial:
if i in lettre:
mot_a_tir = mot_a_tir + lettre
else:
mot_a_tir = mot_a_tir + "-"
score = score -1
print("il vous restes",score + 3,"vies")
return mot_a_tir

# fonction jeu :

def jeu():
mot_a_trouver = choix_mot(liste_mots())
score = difficulte()
mot_a_tiret = tiret_mot(mot_a_trouver)
while score > 0:
lettre = input("proposez une lettre :")
print(tour_de_jeu(lettre,mot_a_tiret,mot_a_trouver,score))
if score == 0 and mot_a_tiret != mot_a_trouver:
print("perdu !")
elif score >= 0 and mot_a_tiret == mot_a_trouver:
print("Bien joué !")


print(jeu())

13 réponses

yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 Ambassadeur 1 554
Modifié le 2 nov. 2021 à 15:59
bonjour,
avant tout:
- utilise les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
- ajoute des commentaires pour expliquer à quoi servent tes fonctions
- ajoute des print() dans ton code pour comprendre ce qu'il fait.
0
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
2 nov. 2021 à 16:01
Merci,
désolé je sais pas dutout comment utiliser les "balises" pour mettre du code.
J'ai déjà utiliser des print() pour tester mes fonctions je les ai juste enlever pour que se soit plus claire
0
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554
2 nov. 2021 à 16:04
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

ce sera plus clair avec les commentaires, avec les print(), et avec ce qu'affichent les print().
0
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
Modifié le 2 nov. 2021 à 16:26
# debut du jeu

from random import randint

#C est la liste de mot qu on établie

def liste_mots():
    liste=["nsi","math","ordinateur"]
    return liste
#print(liste_mots())


#C est la fonction qui demande le niveau souhaité(donc le nombre de vies), et qui établie le #nombre de vies en fonction de la réponse

def difficulte():
    vie = 12
    v = 0
    while v != 1 and v != 2 and v != 3:
        v = int(input("quelle niveau : 1,2 ou 3 ?"))
    if v == 1:
        vie=12
        print('niveau 1 ->',vie,'vie')
    elif v == 2:
        vie=6
        print('niveau 2 ->', vie, 'vies')
    elif v == 3:
        vie = 3
        print('niveau 3 ->', vie, 'vies')
    return vie
#print(difficulte())



#cette fonction transforme le mot choisie dans la liste en mot a tiret 

def tiret_mot(mot):
    n = len(mot)
    res=''
    for i in range (n):
        res = res + "-"
    return res
#print(tiret_mot())


#cette fonction tire un mot au hasard un mot dans la liste

def choix_mot(liste):
    return (liste[randint(0,len(liste)-1)])
#print(choix_mot())


#Cette fonction prend l état du jeu à un moment donné et renvoie
# - le nouveau nombre de vies
# - le nouveau mot à tiret (éventuellement modifié si l on a trouvé une nouvelle lettre)
#-Et le nouveau score ( en principe )

def tour_de_jeu(lettre, mot_a_tir, mot_initial,score):
    mot_a_tir = ""
    while score > 0:
        for i in mot_initial:
            if i in lettre:
                mot_a_tir = mot_a_tir + lettre
            else:
                mot_a_tir = mot_a_tir + "-"
                score = score -1
        print("il vous restes",score + 3,"vies")
        return mot_a_tir
#print(tour_de_jeu("a",----,"jean",10))


#C est la fonction principal, c est la ou on va demander une lettre à l utilisateur, et ou on va mettre la fonction tour_de_jeu.

def jeu():
    mot_a_trouver = choix_mot(liste_mots())
    score = difficulte()
    mot_a_tiret = tiret_mot(mot_a_trouver)
    while score > 0:
        lettre = input("proposez une lettre :")
        print(tour_de_jeu(lettre,mot_a_tiret,mot_a_trouver,score))
        if score == 0 and mot_a_tiret != mot_a_trouver:
            print("perdu !")
        elif score >= 0 and mot_a_tiret == mot_a_trouver:
            print("Bien joué !")

print(jeu())
0
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554
2 nov. 2021 à 17:17
as-tu ajouté assez de print() pour comprendre ce qui se passe?
0
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
2 nov. 2021 à 17:23
oui oui je comprend très bien ce qui ce passe,
le problème c'est vraiment ce que j'ai expliqué au début
0
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554
2 nov. 2021 à 17:26
Ajoute des print() pour comprendre pourquoi ton code ne fait pas ce que tu imagines qu'il devrait faire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
2 nov. 2021 à 17:42
à chaque ligne tu veux dire parce que j'ai essayé déjà pour chaque fonction mais sa m'avance pas beaucoup.
0
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554
Modifié le 2 nov. 2021 à 18:12
suffisamment pour que tu comprennes ce qui ne marche pas.

à ton avis que fait ce programme?
def ajoutun(x):
    x=x+1
    print(x)
x=0
ajoutun(x)
ajoutun(x)
ajoutun(x)
0
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
3 nov. 2021 à 18:47
normalement :
1
2
3
0
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554
4 nov. 2021 à 08:55
maintenant, teste.
0
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
5 nov. 2021 à 09:46
ah non effectivement ça print :

1
1
1
1

et donc de quel fonction est liée ce problèmes ?
0
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554
5 nov. 2021 à 09:56
ajoute des print() pour comprendre le comportement de ce petit programme.
0
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
5 nov. 2021 à 09:55
j'ai un peu modifié le programme.

# debut du jeu

from random import randint

#C'est la liste de mot qu on établie

def liste_mots():
    liste=["nsi","math","ordinateur"]
    return liste
#print(liste_mots())


#C'est la fonction qui demande le niveau souhaité(donc le nombre de vies), et qui établie le nombre de vies en fonction de la réponse

def difficulte():
    vie = 12
    v = 0
    while v != 1 and v != 2 and v != 3:
        v = int(input("quelle niveau : 1,2 ou 3 ?"))
    if v == 1:
        vie=12
        print('niveau 1 ->',vie,'vie')
    elif v == 2:
        vie=6
        print('niveau 2 ->', vie, 'vies')
    elif v == 3:
        vie = 3
        print('niveau 3 ->', vie, 'vies')
    return vie
#print(difficulte())



#cette fonction transforme le mot choisie dans la liste en mot a tiret

def tiret_mot(mot):
    n = len(mot)
    res=''
    for i in range (n):
        res = res + "-"
    return res
#print(tiret_mot())


#cette fonction tire un mot au hasard un mot dans la liste

def choix_mot(liste):
    return (liste[randint(0,len(liste)-1)])
#print(choix_mot())


#Cette fonction prend l'état du jeu à un moment donné et renvoie
# - le nouveau nombre de vies
# - le nouveau mot à tiret (éventuellement modifié si l'on a trouvé une nouvelle lettre)
#-Et le nouveau score ( en principe )

def tour_de_jeu(lettre, mot_a_tir, mot_initial,score):
    mot_a_tir = ""
    for i in mot_initial:
        if i in lettre:
            mot_a_tir = mot_a_tir + lettre
            print("il vous restes", score, "vies")
            return mot_a_tir
        else:
            mot_a_tir = mot_a_tir + "-"
            score = score -1
            print("il vous restes",score,"vies")
            return mot_a_tir
#print(tour_de_jeu("a",----,"jean",10))


#C'est la fonction principal, c'est la ou on va demander une lettre à l'utilisateur, et ou on va mettre la fonction tour_de_jeu.

def jeu():
    mot_a_trouver = choix_mot(liste_mots())
    score = difficulte()
    mot_a_tiret = tiret_mot(mot_a_trouver)
    while score > 0:
        lettre = input("proposez une lettre :")
        print(tour_de_jeu(lettre,mot_a_tiret,mot_a_trouver,score))
    if score == 0 and mot_a_tiret != mot_a_trouver:
        print("perdu !")
    elif score >= 0 and mot_a_tiret == mot_a_trouver:
        print("Bien joué !")

print(jeu())
0
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554
5 nov. 2021 à 09:57
tout fonctionne bien maintenant?
0
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
Modifié le 5 nov. 2021 à 14:18
et bien non j'ai toujours le problème au niveau de la fonction tour_de_jeu

je l'ai extrait du programme pour la modifier plus facilement et pour avoir un meilleur angle de vue mais je n'arrive toujours pas à cerner le problème.
J'ai déjà essayer de changer les indentations...ect rien à faire avec mes connaissances.
Je pense qu'il faudrait créé une boucle dans la fonction tour_de_jeu ????

def tour_de_jeu(lettre, mot_a_tir, mot_initial,score):
    while score > 0:
        for i in mot_initial:
            if i in lettre:
                mot_a_tir = mot_a_tir + lettre
                print("il vous restes", score, "vies")
                return mot_a_tir
            else:
                mot_a_tir = mot_a_tir + "-"
                score = score -1
                print("il vous restes",score,"vies")
                return mot_a_tir
0
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
7 nov. 2021 à 17:02
J'ai résolu mon problèmes, mais j'ai encore un problème avec cette fonction qui se réinitialise à chaque tours :


def tour_de_jeu(lettre,mot_a_tir,mot_initial,score):
    new_mot = ""
    trouve = False
    for i in range(len(mot_initial)):
        if mot_initial[i]==lettre:
            new_mot=new_mot+lettre
            trouve = True
        else:
            new_mot = new_mot + mot_a_tir[i]
    if not(trouve):
        score = score -1
    print(new_mot,"il vous reste",score,"vies")
    return ""

#print(tour_de_jeu("a","----","Jean",4))
0
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554
7 nov. 2021 à 17:53
"qui se réinitialise"?
0
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
8 nov. 2021 à 00:27
Dès que l'on redemande une lettre, le mot et le score se réinitialise oui
0
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554
8 nov. 2021 à 08:56
as-tu suivi ma suggestion en #15? comprends-tu le soucis avec le petit programme que je t'ai suggéré d'analyser et de corriger?
0
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
8 nov. 2021 à 21:05
Ah d'accord donc enfaite quand ma fonction se lance puis se relance elle ne peut pas prendre en argument les modifications faites la première fois c'est ça ?
0
_juan75 Messages postés 12 Date d'inscription mardi 2 novembre 2021 Statut Membre Dernière intervention 8 novembre 2021
8 nov. 2021 à 21:06
et donc je devrai faire en sorte non pas de relancer la fonction à chaque fois, mais quelle tourne jusqu'au résultat souhaité ?
0