IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Python Jeu de la boule AIDE


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2018
    Messages : 11
    Points : 4
    Points
    4
    Par défaut Python Jeu de la boule AIDE
    Bonjour , je suis en terminale SSI et je dois faire un programme Python (C'est la première fois que j'apprend à coder) l’énoncé est :

    On dispose de 100€, on mise une somme au choix sur un nombre entre 1 et 9.
    Un nombre entre 1 et 9 est tiré au hasard. Si on obtient le numéro gagnant, la mise est multipliée par 7 et revient au joueur ( en plus de sa mise) sinon la mise est perdue.

    J'ai réussi à faire ce programme je me suis donc lancé le défi de lui faire une interface. Et c'est là ou je rencontre un problème. L'interface s'affiche et tout fonctionne mais, je ne parviens pas a faire rejouer le programme plusieurs fois d'affilé jusqu'à ce que le joueur n'ai plus d'argent ou qu'il veuille quitter le jeu. J'ai essayé de faire rejouer la fonction "jeu" quand le joueur clique sur rejouer mais ça ne marche pas. Excusez moi pour tous les items/variables qui ont des noms mal organisés.


    Le programme que j'ai écrit pour le jeu sans interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    import random
     
    continuer=1
    argent=100
     
    while argent!=0:
        print("Tu as ",argent,"€ de disponible.")
        mise=int(input("Combien veux-tu miser ?"))
        while mise>argent or mise<1:
            mise=int(input("Combien veux-tu miser ?"))
        choix=int(input("Choisis un chiffre entre 1 et 9 ?"))
        while choix>10 or choix<0:
            choix=int(input("Choisis un chiffre entre 1 et 9 ?"))
        r=random.randrange(1,10)
     
        if choix==r:
            argent=mise*7+mise+argent
            print("BRAVO ! Il te reste :",argent,"€")
            print("Le chiffre gagnant était :",r)
            while continuer!="oui" or continuer!="non":
                continuer=str(input("Veux tu rejouer ? Oui ou Non ?"))
                if continuer=="oui":
                    print("C'est reparti pour un tour !")
                    break
                else:
                    if continuer=="non":
                        print("Au revoir, tu repars avec ",argent,"€.")
                        argent=0
                        break
     
        else:
            argent=argent-mise
            print("Tu as perdu",mise,"€",)
            print("Il te reste ",argent,"€ dans ton porte monnaie.")
            print("Le chiffre gagnant était :",r)
            while continuer!="oui" or continuer!="non":
                continuer=str(input("Veux tu rejouer ? Oui ou Non ?"))
                if continuer=="oui":
                    print("C'est reparti pour un tour !")
                    break
                else:
                    if continuer=="non":
                        print("Au revoir, tu repars avec",argent,"€.")
                        argent=0
                        break
    _________________________________________________________________

    Le programme avec interface mais qui ne fonctionne qu'une seule fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    import random
    from tkinter import *
     
    root = Tk()
     
    root.title('Jeu de Casino')
     
     
    #Item 1 est la mise
    mise_box = IntVar()
    mise_txt =Label(root, text="Votre mise :")
    mise_txt.grid(row=0,sticky=E)
    mise_box = Spinbox(root, state='readonly', from_= 1, to = 100, width = 5)
    mise_box.grid(row = 0, column = 1)
     
    #Item 2 est le nombre sur lequel on mise
    item_2 = IntVar()
    chiffre_txt=Label(root, text="Votre chiffre :")
    chiffre_txt.grid(row=1,sticky=E)
    chiffre_box = Spinbox(root, state='readonly' , from_= 1, to = 9, width = 5)
    chiffre_box.grid(row = 1, column = 1)
     
    StockArgent=100
     
    #Fonction jeu = fait tourner le programme pour les valeurs choisies
    def jeu():
        r=str(random.randrange(1,10))
        print(r)
        #On met la valeur choisie de 1 à 100 dans mise
        mise = int(mise_box.get())
     
        #On met la valeur choisie du chiffre de 1 à 9 dans choix
        choix = chiffre_box.get()
     
        #Récapitule ce qu'on vient de faire
        Resultat= "Tu as misé " + str(mise) + "€ sur le numero " + str(choix) + "!"
        txt.insert(0.0,Resultat)
        txt.configure(state='disabled')
     
        argent=StockArgent
        #Calculs
        if choix==r:
            argent=mise*7+mise+argent
            #Rend le text editable
            txt.configure(state='normal')
            txt.insert(3.0,"\nBRAVO ! Il te reste :"+str(argent)+"€"+"\nLe chiffre gagnant était :"+ str(r) + "!")
            #Rend le txt ineditable
            txt.configure(state='disabled')
            bouton_confirmer.config(state="disabled")
            rejouer()
        else:
            argent=argent-mise
            txt.configure(state='normal')
            txt.insert(3.0,"\nTu as perdu "+str(mise)+"€"+"\nIl te reste "+str(argent)+"€ dans ton porte monnaie."+"\nLe chiffre gagnant était :"+str(r))
            txt.configure(state='disabled')
            bouton_confirmer.config(state="disabled")
            rejouer()
     
     
    #Veux quitter le jeu
    def rejouer_non():
        root.destroy()
     
     
    def rejouer_oui():
        #Reset mise_box
        txt.configure(state='normal')
        txt.delete(0.0,'end')
     
        mise_box = Spinbox(root, state='readonly', from_= 1, to = 100, width = 5)
        mise_box.grid(row = 0, column = 1)
     
        #Reset chiffre_box
        chiffre_box = Spinbox(root, state='readonly' , from_= 1, to = 9, width = 5)
        chiffre_box.grid(row = 1, column = 1)
     
        bouton_confirmer.config(state="normal")
     
        bouton_oui.destroy()
        bouton_non.destroy()
        rejouer_box.destroy()
     
     
    def rejouer():
        #Text Veux tu rejouer...
        rejouer_box =Label(root, text="Voulez-vous rejouer ?")
        rejouer_box.grid(row=7,columnspan=3)
     
        #Bouton pour demander si on veut rejouer ici: Oui
        bouton_oui = Button(root, text = 'Oui', width = 10, command =rejouer_oui)
        bouton_oui.grid(row = 8, column= 1,sticky=E)
     
        #Bouton pour demander si on veut rejouer ici: Non
        bouton_non = Button(root, text = 'Non', width = 10, command =rejouer_non)
        bouton_non.grid(row = 8, column=2,sticky=W)
     
     
    #Bouton Confirmer pour faire tourner le programme
    bouton_confirmer = Button(root, text = 'Confirmer', width = 20, command =jeu)
    bouton_confirmer.grid(row = 1, column = 2)
     
    #Boite de réponses
    txt=Text(root, width=40, height=4, wrap=WORD)
    txt.grid(row=2, columnspan=3, sticky=W)
     
     
    root.mainloop()


    Merci d'avance

    _____________________________________________________________________

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Salut,

    Citation Envoyé par Revilome Voir le message
    Le programme avec interface mais qui ne fonctionne qu'une seule fois
    Il ne fonctionne qu'une fois ou il plante lorsqu'on lui demande de rejouer?
    Car, rejouer_oui devrait planter à bouton_oui.destroy() avec un message d'erreur explicite que vous devriez connaître si vous avez un peu étudié fonctions et portée des variables.

    Citation Envoyé par Revilome Voir le message
    J'ai réussi à faire ce programme je me suis donc lancé le défi de lui faire une interface. Et c'est là ou je rencontre un problème.
    Vous vous rendez compte que vous partez d'un programme séquentiel dans lequel il n'y a aucune fonction à un programmation qui vous oblige à utiliser des fonctions d'une façon assez particulière et où vous avez un "état global" du programme qui va devoir changer suivant les actions de l'utilisateur.
    C'est compliqué et pas étonnant que çà ne fonctionne pas. Le vrai défi est d'avoir la patience d'ouvrir un tuto pour apprendre ce style de programmation là.

    - W

  3. #3
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Salut.

    Python propose diverses syntaxes pour le formatage de texte afin d'éviter des concanténations à rallonge et transtypages de variables comme tu as fait (voir str.format).

    Plusieurs problèmes dans ton script :

    - Tu ne vérifies pas si le joueur a assez d'argent avant d'accepter la mise, voir pour modifier le to du spinbox si argent inférieur à 100.
    - Pourquoi recréer des spinbox dans ta fonction rejouer_oui (elles ne servent à rien) ?
    - Tu ne mets pas à jour l'argent du joueur après qu'il a joué.
    - Attention à bien distinguer variables locales et globales, bouton_oui, bouton_non, rejouer_box n'existent pas dans ta fonction rejouer_oui, elles ont été déclarées dans ta fonction rejouer et sont donc locales à celle-ci, et par conséquent n'existeront plus dès la sortie de cette fonction, après son exécution donc.

    Plutôt que de créer tes boutons et label pour rejouer dans ta fonction rejouer, crée les dans l'espace global de ton script en state hidden, dès lors il suffira simplement de changer le state de ces 3 widgets en normal dans ta fonction rejouer, et en hidden dans ta fonction rejouer_oui.

  4. #4
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2018
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Il ne fonctionne qu'une fois ou il plante lorsqu'on lui demande de rejouer?
    Car, rejouer_oui devrait planter à bouton_oui.destroy() avec un message d'erreur explicite que vous devriez connaître si vous avez un peu étudié fonctions et portée des variables.



    Vous vous rendez compte que vous partez d'un programme séquentiel dans lequel il n'y a aucune fonction à un programmation qui vous oblige à utiliser des fonctions d'une façon assez particulière et où vous avez un "état global" du programme qui va devoir changer suivant les actions de l'utilisateur.
    C'est compliqué et pas étonnant que çà ne fonctionne pas. Le vrai défi est d'avoir la patience d'ouvrir un tuto pour apprendre ce style de programmation là.

    - W
    Merci de votre réponse,

    Il plante lorsqu'on lui demande de rejouer, j'ai essaye, comme je vous l'ai dis de rappeler la fonction jeu mais en faisant ceci ça ne marche pas donc je cherche une autre solution pour pouvoir rappeler cette fonction et ainsi rejouer. Mais le problème c'est que je n'ai aucune base sur python et en programmation (Je n'ai fait que 2h de python au lycée pour l'instant, nous avons pas encore abordé le sujet de tkinter ni des fonctions). Et le programme avec l'interface est fait de beaucoup de petite parti de tutos que j'ai suivis.

    Donc d’après vous, pour espérer finir mon programme faut il que je regarde des tutos sur les fonctions et les interfaces ?
    Et est-ce trop compliqué comme programme pour un débutant ?

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 292
    Points : 36 788
    Points
    36 788
    Par défaut
    Salut,

    Citation Envoyé par Revilome Voir le message
    Donc d’après vous, pour espérer finir mon programme faut il que je regarde des tutos sur les fonctions et les interfaces ?
    Et est-ce trop compliqué comme programme pour un débutant ?
    Si vous ne savez pas encore ce qu'est une fonction et la portée des variables, c'est sans espoir.
    Après vous avez de bons tutos qui expliquent tout çà. Le Swinnen est notre préféré. Il aborde tkinter au chapitre 10, çà fait des tas de choses à apprendre et maîtriser avant.

    - W

  6. #6
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2018
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Salut.

    Python propose diverses syntaxes pour le formatage de texte afin d'éviter des concanténations à rallonge et transtypages de variables comme tu as fait (voir str.format).

    Plusieurs problèmes dans ton script :

    - Tu ne vérifies pas si le joueur a assez d'argent avant d'accepter la mise, voir pour modifier le to du spinbox si argent inférieur à 100.
    - Pourquoi recréer des spinbox dans ta fonction rejouer_oui (elles ne servent à rien) ?
    - Tu ne mets pas à jour l'argent du joueur après qu'il a joué.
    - Attention à bien distinguer variables locales et globales, bouton_oui, bouton_non, rejouer_box n'existent pas dans ta fonction rejouer_oui, elles ont été déclarées dans ta fonction rejouer et sont donc locales à celle-ci, et par conséquent n'existeront plus dès la sortie de cette fonction, après son exécution donc.

    Plutôt que de créer tes boutons et label pour rejouer dans ta fonction rejouer, crée les dans l'espace global de ton script en state hidden, dès lors il suffira simplement de changer le state de ces 3 widgets en normal dans ta fonction rejouer, et en hidden dans ta fonction rejouer_oui.
    Salut,

    Merci de m'avoir listé toutes les erreurs!

    - Tu ne vérifies pas si le joueur a assez d'argent avant d'accepter la mise, voir pour modifier le to du spinbox si argent inférieur à 100.
    Le programme pour changer le to du spinbox peut il être mit dans un espace local si les spinboxs sont dans l'espace globale? (Je

    - Pourquoi recréer des spinbox dans ta fonction rejouer_oui (elles ne servent à rien) ?
    C’était pour les réinitialisées mais ça ne fonctionne pas, savez vous comment les réinitialisées ?

    - Tu ne mets pas à jour l'argent du joueur après qu'il a joué.
    Je n'arrive pas a définir une variable dans l'espace globale et quelle soit utilisable dans une fonction
    Cela affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnboundLocalError: local variable 'argent' referenced before assignment
    alors que argent a été défini au dessus de la fonction.

    - Attention à bien distinguer variables locales et globales, bouton_oui, bouton_non, rejouer_box n'existent pas dans ta fonction rejouer_oui, elles ont été déclarées dans ta fonction rejouer et sont donc locales à celle-ci, et par conséquent n'existeront plus dès la sortie de cette fonction, après son exécution donc.
    Ah cela explique plusieurs de mes problèmes! Mais pas pourquoi les certaines variables globales ne sont pas utilisables dans des fonction.

    Plutôt que de créer tes boutons et label pour rejouer dans ta fonction rejouer, crée les dans l'espace global de ton script en state hidden, dès lors il suffira simplement de changer le state de ces 3 widgets en normal dans ta fonction rejouer, et en hidden dans ta fonction rejouer_oui.
    Ah oui ok, donc le state hidden cache juste le bouton/label.


    Merci encore pour toutes ces informations, je vais essayer de faire ce que vous m'avez dit.

  7. #7
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2018
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Si vous ne savez pas encore ce qu'est une fonction et la portée des variables, c'est sans espoir.
    Après vous avez de bons tutos qui expliquent tout çà. Le Swinnen est notre préféré. Il aborde tkinter au chapitre 10, çà fait des tas de choses à apprendre et maîtriser avant.

    - W
    D'accord merci, j'irais voir.

  8. #8
    Membre confirmé

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Points : 503
    Points
    503
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Revilome Voir le message
    Ah cela explique plusieurs de mes problèmes! Mais pas pourquoi les certaines variables globales ne sont pas utilisables dans des fonction
    Ce qu'il faut retenir, c'est que pour modifier une variable de type int, ou str depuis l'intérieur d'une fonction, il faut utiliser l'instruction global de python dans ta fonction sur cette variable, pour les autres types de variables, list, tuple, dictionnaire, set, objets divers, ce n'est pas utile, puisque ce sont des « conteneurs ».

  9. #9
    Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2018
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2018
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par bistouille Voir le message
    Ce qu'il faut retenir, c'est que pour modifier une variable de type int, ou str depuis l'intérieur d'une fonction, il faut utiliser l'instruction global de python dans ta fonction sur cette variable, pour les autres types de variables, list, tuple, dictionnaire, set, objets divers, ce n'est pas utile, puisque ce sont des « conteneurs ».
    Ah d'accord, merci, j'apprends beaucoup de choses grâce a toi!

Discussions similaires

  1. nouveau sur python qui a besoin d'aide
    Par bittersweetog dans le forum Général Python
    Réponses: 8
    Dernier message: 08/02/2018, 07h39
  2. Besoin d'aide code jeu du pendu python
    Par Dirty_Monkey dans le forum Programmation multimédia/Jeux
    Réponses: 1
    Dernier message: 12/05/2016, 20h54
  3. Aide programmation Python; Jeu de blackjack
    Par toniobuteau dans le forum Général Python
    Réponses: 1
    Dernier message: 03/10/2012, 06h21
  4. Aide jeu sur Python
    Par david803 dans le forum Débuter
    Réponses: 0
    Dernier message: 01/12/2011, 19h49
  5. [AC-2007] Supprimer un jeu d'enregistrements à l'aide d'une boucle For
    Par lakhdar16 dans le forum VBA Access
    Réponses: 3
    Dernier message: 18/10/2011, 12h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo