Problème dans un programme

Fermé
Skeuly - 8 août 2020 à 01:12
 Skeuly - 9 août 2020 à 01:12
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")

Configuration: Windows / Chrome 84.0.4147.105

1 réponse

quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024 347
8 août 2020 à 01:18
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 ?
1
Bonjour,

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")



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
0
quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024 347 > 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.
0
Skeuly > quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Derniè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]'.

Pourquoi?
0
Skeuly > Skeuly
8 août 2020 à 20:48
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
0
quent217 Messages postés 421 Date d'inscription vendredi 25 septembre 2015 Statut Membre Dernière intervention 1 mars 2024 347 > 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
scores[joueur] = argent_actu
0