Problème dans un programme
Skeuly
-
Skeuly -
Skeuly -
Bonjour,
J'ai un petit problème dans un programme. Je suis très débutant (j'ai commencé sur openclassroom) . Je vous met les 3 fichiers en-dessous en espérant que quelqu'un est le courage de lire et de me corriger.
Les 3 fichiers sont dans le même dossier.
mon problème se trouve au niveau de la fonction "crediter_compte(scores)" après avoir rentrer le bon mdp(les autres branches de la fonction fonctionne plutôt bien).
En espérant vraiment que quelqu'un ai le courage de m'aider.
Si vous reconnaissez le code c'est parce que j'ai bousillé le mien (je n'ai pas compris l'habitude de travailler sur des copies) et j'ai repris carrément celui du site.
Merci d'avance à ceux qui m'aideront.
fichier : donnees.py
# Nombre de coups par partie
nb_coups = 8
# Nom du fichier stockant les scores
nom_fichier_scores = "scores"
# Liste des mots du pendu
liste_mots = [
"armoire",
"boucle",
"buisson",
"bureau",
"chaise",
"carton",
"couteau",
"fichier",
"garage",
"glace",
"journal",
"kiwi",
"lampe",
"liste",
"montagne",
"remise",
"sandale",
"taxi",
"vampire",
"volant",
]
fichier : fonctions.py
import os
import pickle
from random import choice
from donnees import *
# Gestion des scores
def recup_scores():
"""Cette fonction récupère les scores enregistrés si le fichier existe.
Dans tous les cas, on renvoie un dictionnaire,
soit l'objet dépicklé,
soit un dictionnaire vide.
On s'appuie sur nom_fichier_scores défini dans donnees.py"""
if os.path.exists(nom_fichier_scores): # Le fichier existe
# On le récupère
fichier_scores = open(nom_fichier_scores, "rb")
mon_depickler = pickle.Unpickler(fichier_scores)
scores = mon_depickler.load()
fichier_scores.close()
else: # Le fichier n'existe pas
scores = {}
return scores
def enregistrer_scores(scores):
"""Cette fonction se charge d'enregistrer les scores dans le fichier
nom_fichier_scores. Elle reçoit en paramètre le dictionnaire des scores
à enregistrer"""
fichier_scores = open(nom_fichier_scores, "wb") # On écrase les anciens scores
mon_pickler = pickle.Pickler(fichier_scores)
mon_pickler.dump(scores)
fichier_scores.close()
# Fonctions gérant les éléments saisis par l'utilisateur
def recup_nom_utilisateur():
"""Fonction chargée de récupérer le nom de l'utilisateur.
Le nom de l'utilisateur doit être composé de 4 caractères minimum,
chiffres et lettres exclusivement.
Si ce nom n'est pas valide, on appelle récursivement la fonction
pour en obtenir un nouveau"""
nom_utilisateur = input("Tapez votre nom: ")
# On met la première lettre en majuscule et les autres en minuscules
nom_utilisateur = nom_utilisateur.capitalize()
if not nom_utilisateur.isalnum() or len(nom_utilisateur)<4:
print("Ce nom est invalide.")
# On appelle de nouveau la fonction pour avoir un autre nom
return recup_nom_utilisateur()
else:
return nom_utilisateur
def recup_lettre():
lettre = input("Tapez une lettre: ")
lettre = lettre.lower()
if len(lettre)>1 or not lettre.isalpha():
print("Vous n'avez pas saisi une lettre valide.")
return recup_lettre()
else:
return lettre
# Fonctions du jeu de pendu
def choisir_mot():
"""Cette fonction renvoie le mot choisi dans la liste des mots
liste_mots.
On utilise la fonction choice du module random (voir l'aide)."""
return choice(liste_mots)
def recup_mot_masque(mot_complet, lettres_trouvees):
"""Cette fonction renvoie un mot masqué tout ou en partie, en fonction :
- du mot d'origine (type str)
- des lettres déjà trouvées (type list)
On renvoie le mot d'origine avec des * remplaçant les lettres que l'on
n'a pas encore trouvées."""
mot_masque = ""
for lettre in mot_complet:
if lettre in lettres_trouvees:
mot_masque += lettre
else:
mot_masque += "*"
return mot_masque
def crediter_compte(scores):
crediter = input("Voulez-vous créditer ce compte (o/n)?")
if crediter.lower() == "o":
mdp = input("...")
if mdp == "Sacrieur120502":
montant = input("Tapez le montant à créditer :")
try:
montant = int(montant)
except ValueError:
print("Vous n'avez pas saisi de nombre")
montant = 0
if montant < scores:
print("Vous n'avez pas assez d'argent pour effectuer ce retrait.")
return crediter_compte
scores += montant
print("Compte créditer.")
return scores
else:
print("Annulation.")
else:
print("Aucune créditation.")
fichier : ZCasino.py
import os
from random import randrange
from math import ceil
from donnees import *
from fonctions import *
scores = recup_scores()
joueur = recup_nom_utilisateur()
if joueur not in scores.keys():
scores[joueur] = 0
# Déclaration des variables de départ
continuer_partie = True
argent_actu = crediter_compte(scores[joueur])
print("Le montant actuel est de", argent_actu,".")
print("Vous vous installez à la table de roulette avec", scores[joueur], "$.")
while continuer_partie:
nombre_mise = -1
while nombre_mise < 0 or nombre_mise > 49:
nombre_mise = input("Tapez le nombre sur lequel vous voulez miser (entre 0 et 49) : ")
# On convertit le nombre misé
try:
nombre_mise = int(nombre_mise)
except ValueError:
print("Vous n'avez pas saisi de nombre")
nombre_mise = -1
continue
if nombre_mise < 0:
print("Ce nombre est négatif")
if nombre_mise > 49:
print("Ce nombre est supérieur à 49")
# À présent, on sélectionne la somme à miser sur le nombre
mise = 0
while mise <= 0 or mise > scores[joueur]:
mise = input("Tapez le montant de votre mise : ")
# On convertit la mise
try:
mise = int(mise)
except ValueError:
print("Vous n'avez pas saisi de nombre")
mise = -1
continue
if mise <= 0:
print("La mise saisie est négative ou nulle.")
if mise > scores[joueur]:
print("Vous ne pouvez miser autant, vous n'avez que", scores[joueur], "$")
numero_gagnant = randrange(50)
print("La roulette tourne... ... et s'arrête sur le numéro", numero_gagnant)
# On établit le gain du joueur
if numero_gagnant == nombre_mise:
print("Félicitations ! Vous obtenez", mise * 3, "$ !")
scores[joueur] += mise * 3
elif numero_gagnant % 2 == nombre_mise % 2: # ils sont de la même couleur
mise = ceil(mise * 0.25)
print("Vous avez misé sur la bonne couleur. Vous obtenez", mise, "$")
scores[joueur] += mise
else:
print("Désolé l'ami, c'est pas pour cette fois. Vous perdez votre mise.")
scores[joueur] -= mise
# On interrompt la partie si le joueur est ruiné
if scores[joueur] <= 0:
print("Vous êtes ruiné ! C'est la fin de la partie.")
continuer_partie = False
else:
# On affiche l'argent du joueur
print("Vous avez à présent", scores[joueur], "$")
quitter = input("Souhaitez-vous quitter le casino (o/n) ? ")
if quitter == "o" or quitter == "O":
print("Vous quittez le casino avec vos gains.")
continuer_partie = False
enregistrer_scores(scores)
print("Au revoir!!!")
os.system("pause")
J'ai un petit problème dans un programme. Je suis très débutant (j'ai commencé sur openclassroom) . Je vous met les 3 fichiers en-dessous en espérant que quelqu'un est le courage de lire et de me corriger.
Les 3 fichiers sont dans le même dossier.
mon problème se trouve au niveau de la fonction "crediter_compte(scores)" après avoir rentrer le bon mdp(les autres branches de la fonction fonctionne plutôt bien).
En espérant vraiment que quelqu'un ai le courage de m'aider.
Si vous reconnaissez le code c'est parce que j'ai bousillé le mien (je n'ai pas compris l'habitude de travailler sur des copies) et j'ai repris carrément celui du site.
Merci d'avance à ceux qui m'aideront.
fichier : donnees.py
# Nombre de coups par partie
nb_coups = 8
# Nom du fichier stockant les scores
nom_fichier_scores = "scores"
# Liste des mots du pendu
liste_mots = [
"armoire",
"boucle",
"buisson",
"bureau",
"chaise",
"carton",
"couteau",
"fichier",
"garage",
"glace",
"journal",
"kiwi",
"lampe",
"liste",
"montagne",
"remise",
"sandale",
"taxi",
"vampire",
"volant",
]
fichier : fonctions.py
import os
import pickle
from random import choice
from donnees import *
# Gestion des scores
def recup_scores():
"""Cette fonction récupère les scores enregistrés si le fichier existe.
Dans tous les cas, on renvoie un dictionnaire,
soit l'objet dépicklé,
soit un dictionnaire vide.
On s'appuie sur nom_fichier_scores défini dans donnees.py"""
if os.path.exists(nom_fichier_scores): # Le fichier existe
# On le récupère
fichier_scores = open(nom_fichier_scores, "rb")
mon_depickler = pickle.Unpickler(fichier_scores)
scores = mon_depickler.load()
fichier_scores.close()
else: # Le fichier n'existe pas
scores = {}
return scores
def enregistrer_scores(scores):
"""Cette fonction se charge d'enregistrer les scores dans le fichier
nom_fichier_scores. Elle reçoit en paramètre le dictionnaire des scores
à enregistrer"""
fichier_scores = open(nom_fichier_scores, "wb") # On écrase les anciens scores
mon_pickler = pickle.Pickler(fichier_scores)
mon_pickler.dump(scores)
fichier_scores.close()
# Fonctions gérant les éléments saisis par l'utilisateur
def recup_nom_utilisateur():
"""Fonction chargée de récupérer le nom de l'utilisateur.
Le nom de l'utilisateur doit être composé de 4 caractères minimum,
chiffres et lettres exclusivement.
Si ce nom n'est pas valide, on appelle récursivement la fonction
pour en obtenir un nouveau"""
nom_utilisateur = input("Tapez votre nom: ")
# On met la première lettre en majuscule et les autres en minuscules
nom_utilisateur = nom_utilisateur.capitalize()
if not nom_utilisateur.isalnum() or len(nom_utilisateur)<4:
print("Ce nom est invalide.")
# On appelle de nouveau la fonction pour avoir un autre nom
return recup_nom_utilisateur()
else:
return nom_utilisateur
def recup_lettre():
lettre = input("Tapez une lettre: ")
lettre = lettre.lower()
if len(lettre)>1 or not lettre.isalpha():
print("Vous n'avez pas saisi une lettre valide.")
return recup_lettre()
else:
return lettre
# Fonctions du jeu de pendu
def choisir_mot():
"""Cette fonction renvoie le mot choisi dans la liste des mots
liste_mots.
On utilise la fonction choice du module random (voir l'aide)."""
return choice(liste_mots)
def recup_mot_masque(mot_complet, lettres_trouvees):
"""Cette fonction renvoie un mot masqué tout ou en partie, en fonction :
- du mot d'origine (type str)
- des lettres déjà trouvées (type list)
On renvoie le mot d'origine avec des * remplaçant les lettres que l'on
n'a pas encore trouvées."""
mot_masque = ""
for lettre in mot_complet:
if lettre in lettres_trouvees:
mot_masque += lettre
else:
mot_masque += "*"
return mot_masque
def crediter_compte(scores):
crediter = input("Voulez-vous créditer ce compte (o/n)?")
if crediter.lower() == "o":
mdp = input("...")
if mdp == "Sacrieur120502":
montant = input("Tapez le montant à créditer :")
try:
montant = int(montant)
except ValueError:
print("Vous n'avez pas saisi de nombre")
montant = 0
if montant < scores:
print("Vous n'avez pas assez d'argent pour effectuer ce retrait.")
return crediter_compte
scores += montant
print("Compte créditer.")
return scores
else:
print("Annulation.")
else:
print("Aucune créditation.")
fichier : ZCasino.py
import os
from random import randrange
from math import ceil
from donnees import *
from fonctions import *
scores = recup_scores()
joueur = recup_nom_utilisateur()
if joueur not in scores.keys():
scores[joueur] = 0
# Déclaration des variables de départ
continuer_partie = True
argent_actu = crediter_compte(scores[joueur])
print("Le montant actuel est de", argent_actu,".")
print("Vous vous installez à la table de roulette avec", scores[joueur], "$.")
while continuer_partie:
nombre_mise = -1
while nombre_mise < 0 or nombre_mise > 49:
nombre_mise = input("Tapez le nombre sur lequel vous voulez miser (entre 0 et 49) : ")
# On convertit le nombre misé
try:
nombre_mise = int(nombre_mise)
except ValueError:
print("Vous n'avez pas saisi de nombre")
nombre_mise = -1
continue
if nombre_mise < 0:
print("Ce nombre est négatif")
if nombre_mise > 49:
print("Ce nombre est supérieur à 49")
# À présent, on sélectionne la somme à miser sur le nombre
mise = 0
while mise <= 0 or mise > scores[joueur]:
mise = input("Tapez le montant de votre mise : ")
# On convertit la mise
try:
mise = int(mise)
except ValueError:
print("Vous n'avez pas saisi de nombre")
mise = -1
continue
if mise <= 0:
print("La mise saisie est négative ou nulle.")
if mise > scores[joueur]:
print("Vous ne pouvez miser autant, vous n'avez que", scores[joueur], "$")
numero_gagnant = randrange(50)
print("La roulette tourne... ... et s'arrête sur le numéro", numero_gagnant)
# On établit le gain du joueur
if numero_gagnant == nombre_mise:
print("Félicitations ! Vous obtenez", mise * 3, "$ !")
scores[joueur] += mise * 3
elif numero_gagnant % 2 == nombre_mise % 2: # ils sont de la même couleur
mise = ceil(mise * 0.25)
print("Vous avez misé sur la bonne couleur. Vous obtenez", mise, "$")
scores[joueur] += mise
else:
print("Désolé l'ami, c'est pas pour cette fois. Vous perdez votre mise.")
scores[joueur] -= mise
# On interrompt la partie si le joueur est ruiné
if scores[joueur] <= 0:
print("Vous êtes ruiné ! C'est la fin de la partie.")
continuer_partie = False
else:
# On affiche l'argent du joueur
print("Vous avez à présent", scores[joueur], "$")
quitter = input("Souhaitez-vous quitter le casino (o/n) ? ")
if quitter == "o" or quitter == "O":
print("Vous quittez le casino avec vos gains.")
continuer_partie = False
enregistrer_scores(scores)
print("Au revoir!!!")
os.system("pause")
Configuration: Windows / Chrome 84.0.4147.105
A voir également:
- Problème dans un programme
- Programme demarrage windows - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Mettre en veille un programme - Guide
- Forcer la fermeture d'un programme - Guide
- Message programmé iphone - Guide
1 réponse
Bonjour,
merci d'utiliser les balises de codes car sans les indentations on ne pourra pas executer votre code. Explications ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Pouvez-vous expliquer ce qui vous pose problème exactement ? Qu'est ce qui ne va pas avec la fonction crediter_compte ? Quel est le résultat attendu ?
merci d'utiliser les balises de codes car sans les indentations on ne pourra pas executer votre code. Explications ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Pouvez-vous expliquer ce qui vous pose problème exactement ? Qu'est ce qui ne va pas avec la fonction crediter_compte ? Quel est le résultat attendu ?
fichier : donnees.py
fichier : fonctions.py
fichier : ZCasino.py
Ce code a pour but de créer un jeu d'argent (roulette) et je voudrais stocker le compte de chaque joueur dans un fichier "scores".
La fonction crediter_compte a pour but de modifier la valeur du compte du joueur actuel.
Lorsque que la fonction se lance et que je rentre dans 'créditer' une lettre différente de "o", cela m'affiche bien "Aucune créditation".
Lorsque je rentre "o" puis un mauvais 'mdp', la fonction m'affiche bien "Annulation".
Mais lorsque je rentre le bon 'mdp' puis un 'montant', la fenêtre du programme se ferme.
Merci d'avance
Lorsque je lance votre programme et que je rentre les informations indiquées, j'obtiens ceci :
La fenêtre ne se ferme pas et le programme ne s'arrête pas.
Cependant, si votre fenetre se ferme, je suspecte que c'est parce que votre programme se termine suite à une erreur. Je vous conseille de ne pas lancer le programme en double cliquant dessus, mais en ouvrant l'invite de commande dans le bon dossier puis en tapant le nom du fichier. Vous pourrez ainsi obtenir des informations sur l'erreur qui est survenue.
Mais maintenant un autre problème se pose : On tape le montant à créditer puis cela affiche "Le montant actuel est de 50"
Mais par la suite c'est écrit "Vous vous installez à la table de roulette avec 0$" alors que dans la fonction je change bien la variable 'scores[joueur]'.
Pourquoi?
Mais je ne comprends pas pourquoi ça e fonctionne pas avec 'scores[joueur]'.
Peux-tu m'expliquer s'il te plaît
Pour régler le problème il faut donc modifier la variable scores en dehors de la fonction en faisant