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
# 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")
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
Configuration: Windows / Chrome 84.0.4147.105
quent217
Messages postés421Date d'inscriptionvendredi 25 septembre 2015StatutMembreDernière intervention 1 mars 2024347
>
Skeuly
Modifié le 8 août 2020 à 17:54
Je n'arrives pas à reproduire votre problème.
Lorsque je lance votre programme et que je rentre les informations indiquées, j'obtiens ceci :
Tapez votre nom: quent217 Voulez-vous créditer ce compte (o/n)?o ...Sacrieur120502 Tapez le montant à créditer :50 Compte créditer. Le montant actuel est de 50 . Vous vous installez à la table de roulette avec 0 $. Tapez le nombre sur lequel vous voulez miser (entre 0 et 49) :
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.
Skeuly
>
quent217
Messages postés421Date d'inscriptionvendredi 25 septembre 2015StatutMembreDernière intervention 1 mars 2024 8 août 2020 à 20:24
Merci maintenant le programme continu.
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]'.
J'ai pu trouver la solution en remplaçant tout les 'scores[joueur]' après la fonction 'crediter_compte' par des 'argent_actu'.
Mais je ne comprends pas pourquoi ça e fonctionne pas avec 'scores[joueur]'.
Peux-tu m'expliquer s'il te plaît
quent217
Messages postés421Date d'inscriptionvendredi 25 septembre 2015StatutMembreDernière intervention 1 mars 2024347
>
Skeuly
8 août 2020 à 22:23
Lorsque vous modifiez la variable scores dans la fonction crediter_compte, ça la modifie uniquement localement. Ça ne modifie pas la variable qui été donné en paramètre dans le code principale.
Pour régler le problème il faut donc modifier la variable scores en dehors de la fonction en faisant
8 août 2020 à 16:52
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
Modifié le 8 août 2020 à 17:54
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.
8 août 2020 à 20:24
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?
8 août 2020 à 20:48
Mais je ne comprends pas pourquoi ça e fonctionne pas avec 'scores[joueur]'.
Peux-tu m'expliquer s'il te plaît
8 août 2020 à 22:23
Pour régler le problème il faut donc modifier la variable scores en dehors de la fonction en faisant