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

Python Discussion :

comment faire pour rejouer [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut comment faire pour rejouer
    bonjour a tous je suis en terminal S en spécialité ISN et je dois faire un programme pour la fon de l'année. Mais le problème avec mon programme c'est que lorsqu'on la terminé on peut refaire les graphisme pour rejouer mais on ne peux pas rejouer si vous pouviez m'aider parce que la je désespère un peu merci voila mon programme (pour les images vous n'avez qu'a en crée 5 au nom indiquer de format 150*300

    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    #############################################################IMPORTATION################################################################
     
    from tkinter import*
    from tkinter.messagebox import *
     
    #############################################################DEFINITION#################################################################
     
    def regle() :
        showinfo("Règle","Le principe de se casse tête est de transferer les blocs se trouvant dans la première colonne sur la troisième dans le même ordre. "
                 "On ne peut déplacé qu'un seul bloc a la fois et mettre un bloc plus petit sur un plus grand mais pas l'inverse. "
                 "A vous de jouez.", default = 'ok') 
    def jouer() :
     
        global valeur
     
        Can1.delete(ALL)
        valeur=0
     
        # création des lignes et des colonnes du tableau
        for i in range( nbColonnes+1 ):
            Can1.create_line( x0+cc*i, y0, x0+cc*i, y0 + nbLignes*cl )
     
        for i in range( nbLignes+1 ):
            Can1.create_line( x0, y0+cl*i, x0+nbColonnes*cc , y0+cl*i )
     
        fenetre.update()
     
        # création des images dans le tableau    
        Can1.create_image(182,107,image = C1)
     
        Can1.create_image(182,257,image = C2)
     
        Can1.create_image(182,407,image = C3)
     
        Can1.create_image(182,557,image = C4)
     
        Can1.create_image(182,707.5,image = C5)
     
     
    def caseClicG(event):
     
        global valeur
     
        # détermine les coordonnées du clic dans x et y
        x, y = event.x, event.y
     
        # calcule la ligne et la colonne correspondant au clic
        colonne = int((x-x0)/cc)
        ligne = int((y-y0)/cl)+1
     
        print(ligne,colonne)
     
        # modifie la valeur de la case dans le tableau
        if tableau[ligne][colonne] != 0 and tableau[ligne-1][colonne] == 0 and valeur == 0:
            valeur = tableau[ligne][colonne]
     
            print("valeur : ", valeur)
     
            tableau[ligne][colonne] = 0
     
            print(ligne,colonne)
     
            # créer un rectangle blanc pour faire disparaitrre l'image
            Can1.create_rectangle((colonne*300)+x0,(ligne*150)+y0,(colonne+1)*300+x0,(ligne-1)*150+y0, fill = 'white')
        else :
            showinfo('ATTENTION', 'VOUS NE POUVEZ PAS EFFECTUER CE MOUVEMENT')
     
        print (tableau)
     
     
    def caseClicD(event):
     
        global valeur
     
        # détermine les coordonnées du clic dans x et y
        x, y = event.x, event.y
     
        # calcule la ligne et la colonne correspondant au clic
        colonne = int((x-x0)/cc)
        ligne = int((y-y0)/cl)+1
     
        print(ligne,colonne)
     
        # modifie la valeur de la case dans le tableau
        if tableau[ligne][colonne] == 0 and  tableau[ligne+1][colonne] != 0 and tableau[ligne+1][colonne] > valeur :
           tableau[ligne][colonne] = valeur
     
           # créer l'image correspondant a la valeur dans le tableau de la fenêtre tkinter
           if valeur == 1 :
               Can1.create_image((colonne*300)+150+x0,((ligne-1)*150)+75+y0, image = C1)
     
           if valeur == 2 :
               Can1.create_image((colonne*300)+150+x0,((ligne-1)*150)+75+y0, image = C2)           
     
           if valeur == 3 :
               Can1.create_image((colonne*300)+150+x0,((ligne-1)*150)+75+y0, image = C3)           
     
           if valeur == 4 :
               Can1.create_image((colonne*300)+150+x0,((ligne-1)*150)+75+y0, image = C4)           
     
           if valeur == 5 :
               Can1.create_image((colonne*300)+150+x0,((ligne-1)*150)+75+y0, image = C5)
           valeur = 0
     
        else :
            showinfo('ATTENTION', 'VOUS NE POUVEZ PAS EFFECTUER CE MOUVEMENT', default = 'ok')
        print (tableau)
     
        if tableau == [[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 0, 4], [0, 0, 5], [9, 9, 9]] :
            showinfo('FELICITATION', 'VOUS AVEZ REUSSI SE CASSE TÊTE. SI VOUS VOULEZ REESSAYE APPUYER SUR JOUER SINON APPUYER SUR QUITTER', default = 'ok')
     
    ##########################################################VARIABLES####################################################################        
     
    valeur = 0
     
    nbLignes = 5	      # nb de lignes
     
    nbColonnes = 3	      # nb de colonnes
     
    cl = 150	      # hauteur d'une case
     
    cc= 300               # lageur d'une case
     
    x0, y0 = 32, 32       # coordonnées du point en haut à gauche de la grille
     
    tableau = [[0, 0, 0], # une ligne au dessus pour faire croire qu'il n'y a rien sur la pile
               [1, 0, 0],
               [2, 0, 0],
               [3, 0, 0],
               [4, 0, 0],
               [5, 0, 0],
               [9, 9, 9]] # une ligne au dessous pour faire croire qu'il y a une image
     
    print (tableau)
     
    ###########################################################CANVAS######################################################################
     
    fenetre = Tk()
     
     
    Can1 = Canvas( fenetre, height = 800, width = 1000, bg = "white" )
    Can1.pack( side = LEFT )
     
     
    #importation des images
    C1 = PhotoImage ( file = "rouge_1.gif") # Premier carrée
     
    C2 = PhotoImage ( file = "rouge_2.gif") # Deuxième carrée
     
    C3 = PhotoImage ( file = "rouge_3.gif") # Troisième carrée
     
    C4 = PhotoImage ( file = "rouge_4.gif") # Quatrième carrée
     
    C5 = PhotoImage ( file = "rouge_5.gif") # Cinquième carrée
     
     
    texte1 = Label(fenetre, text='Clic gauche sélectionne et clic droit déplace')
    texte1.pack()
     
     
    Can1.bind("<Button-1>", caseClicG)
    Can1.bind("<Button-3>", caseClicD)
     
    quitter = Button( fenetre, text = "Quitter", command = fenetre.destroy )
    quitter.pack( side = BOTTOM )
     
    jouer = Button( fenetre, text = "Jouer", command = jouer )
    jouer.pack( side = BOTTOM )
     
    regle = Button( fenetre, text = "Règle", command = regle )
    regle.pack( side = BOTTOM )
     
     
    Can1.pack()
     
    fenetre.mainloop()

  2. #2
    Membre chevronné
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 485
    Points : 2 151
    Points
    2 151
    Par défaut
    Cédric,

    Je te conseil de dissocier la manipulation de ta structure "tableau" et de sa représentation graphique.
    C'est à dire, que tu as une seul fonction qui rafraîchi l'ensemble du plateau: les 3 colonnes ainsi que les 5 cubes (-1 éventuellement le cube à jouer que tu pourrais alors afficher en bas à droite)

    Tes deux fonctions caseClicG et caseClicD ne doivent alors que changer les valeur de cette variables et rappeler alors ta fonction de rafraîchissement graphique.
    Ainsi, ta fonction "jouer" se limite à (re)initialiser ton tableau et de l'afficher comme les autres fonctions.

    Imagine que si du voulais faire le même jeux, très rapidement, sans graphique en affichant le plateau en mode console avec des "print" et des "input": tes fonctions de manipulation de "tableau" et l'analyse "autorisé"/"gagné" sont les mêmes, seul change la façon d'afficher et de questionner le joueur.
    A la limite, essaye de mettre tout ce qui a un lien à manipuler "tableau" dans un module python et tout ce qui est lié à l'interface graphique dans un autre.

    Autres petits conseils pour rendre ton petit jeu mieux fait:
    =>Fait attention au nommage de tes variables.
    Tu n'est pas en cours de math, tu es limité à 255 caractère alors évite les variables à 1 lettre.
    Utilise des noms de variables (comme pour tes fonctions) aussi explicite que possible pour comprendre quoi elle contiens (ou à quoi elle sert).
    Le truc c'est de ne pas a avoir besoin de commentaire pour comprendre ton code.
    exemple: renomme tes variables "tableau" par "plateau_de_jeu" et "valeur" par "cube_selectionne".
    =>Le clique droit n'est pas intuitif.
    Tu doit pouvoir utiliser que le click gauche en vérifiant si un cube est déjà sélectionné (valeur de "valeur" non nulle).
    =>La boite de dialogue "VOUS NE POUVEZ PAS EFFECTUER CE MOUVEMENT" est pénible
    Privilégie un message fixe sur le coté ou un zone de statuts.
    => et pourquoi ne pas demander au joueur qu'une colonne (et pas une case précis): le programme choisi automatiquement alors la case la plus haute à jouer.

    Dernier conseil: demande à des proches de jouer pour avoir des retours sur le jeu
    Si tu le fais en plus jolie et attractif, c'est encore mieux, non

    Sinon, je trouve que tu as fait un travail pas trop mal déjà.
    De la graine de développeur que nous avons là

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    merci bien Laurent 1973 je vais essayé sa demain et je vous redirez si cela à fonctionner ou pas

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour, Laurent désolé mais je n'arrive pas a appliquer les conseil que vous m'avez donné pour que je puisse rejouez car je ne les comprends pas très bien pouvez me les coder à partir du programme ci-dessous s'il vous plaît

    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
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    #############################################################IMPORTATION################################################################
     
    from tkinter import*
    from tkinter.messagebox import *
     
    #############################################################DEFINITION#################################################################
     
    def regle() :
        showinfo("Règle","Le principe de se casse tête est de transferer les blocs se trouvant dans la première colonne sur la troisième dans le même ordre. "
                 "On ne peut déplacé qu'un seul bloc a la fois et mettre un bloc plus petit sur un plus grand mais pas l'inverse. "
                 "A vous de jouez.", default = 'ok')
     
     
    def jouer() :
     
        global valeur
     
        Can1.delete(ALL)
        valeur = 0
     
        # création des lignes et des colonnes du tableau
        for i in range( nbColonnes+1 ):
            Can1.create_line( x0+cc*i, y0, x0+cc*i, y0 + nbLignes*cl )
     
        for i in range( nbLignes+1 ):
            Can1.create_line( x0, y0+cl*i, x0+nbColonnes*cc , y0+cl*i )
     
        # création des images dans le tableau    
        Can1.create_image(182,107,image = C1)
     
        Can1.create_image(182,257,image = C2)
     
        Can1.create_image(182,407,image = C3)
     
        Can1.create_image(182,557,image = C4)
     
        Can1.create_image(182,707.5,image = C5)
     
        fenetre.update()
     
     
    def quitter() :
        fenetre.destroy
     
     
    def caseClicG(event):
     
        global valeur
     
        # détermine les coordonnées du clic dans x et y
        x, y = event.x, event.y
     
        # calcule la ligne et la colonne correspondant au clic
        colonne = int((x-x0)/cc)
        ligne = int((y-y0)/cl)+1
     
        print(ligne,colonne)
     
        # modifie la valeur de la case dans le tableau
        if tableau[ligne][colonne] != 0 and tableau[ligne-1][colonne] == 0 and valeur == 0:
            valeur = tableau[ligne][colonne]
     
            print("valeur : ", valeur)
     
            tableau[ligne][colonne] = 0
     
            print(ligne,colonne)
     
            # créer un rectangle blanc pour faire disparaitrre l'image
            Can1.create_rectangle((colonne*300)+x0,(ligne*150)+y0,(colonne+1)*300+x0,(ligne-1)*150+y0, fill = 'white')
        else :
            showinfo('ATTENTION', 'VOUS NE POUVEZ PAS EFFECTUER CE MOUVEMENT')
     
        print (tableau)
     
     
    def caseClicD(event):
     
        global valeur
     
        # détermine les coordonnées du clic dans x et y
        x, y = event.x, event.y
     
        # calcule la ligne et la colonne correspondant au clic
        colonne = int((x-x0)/cc)
        ligne = int((y-y0)/cl)+1
     
        print(ligne,colonne)
     
        # modifie la valeur de la case dans le tableau
        if tableau[ligne][colonne] == 0 and  tableau[ligne+1][colonne] != 0 and tableau[ligne+1][colonne] > valeur :
           tableau[ligne][colonne] = valeur
     
           # créer l'image correspondant a la valeur dans le tableau de la fenêtre tkinter
           if valeur == 1 :
               Can1.create_image((colonne*300)+150+x0,((ligne-1)*150)+75+y0, image = C1)
     
           if valeur == 2 :
               Can1.create_image((colonne*300)+150+x0,((ligne-1)*150)+75+y0, image = C2)           
     
           if valeur == 3 :
               Can1.create_image((colonne*300)+150+x0,((ligne-1)*150)+75+y0, image = C3)           
     
           if valeur == 4 :
               Can1.create_image((colonne*300)+150+x0,((ligne-1)*150)+75+y0, image = C4)           
     
           if valeur == 5 :
               Can1.create_image((colonne*300)+150+x0,((ligne-1)*150)+75+y0, image = C5)
           valeur = 0
     
        else :
            showinfo('ATTENTION', 'VOUS NE POUVEZ PAS EFFECTUER CE MOUVEMENT', default = 'ok')
        print (tableau)
     
        if tableau == [[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 0, 4], [0, 0, 5], [9, 9, 9]] :
            askyesno('FELICITATION', 'VOUS AVEZ REUSSI SE CASSE TÊTE. VOULEZ-VOUS REJOUEZ ?', default = 'yes')
            if askyesno == True :
                jouer()
            if askyesno == False:
                fenetre.destroy
     
    ##########################################################VARIABLES####################################################################        
     
    valeur = 0
     
    nbLignes = 5	      # nb de lignes
     
    nbColonnes = 3	      # nb de colonnes
     
    cl = 150	      # hauteur d'une case
     
    cc= 300               # lageur d'une case
     
    x0, y0 = 32, 32       # coordonnées du point en haut à gauche de la grille
     
    tableau = [[0, 0, 0], # une ligne au dessus pour faire croire qu'il n'y a rien sur la pile
               [1, 0, 0],
               [2, 0, 0],
               [3, 0, 0],
               [4, 0, 0],
               [5, 0, 0],
               [9, 9, 9]] # une ligne au dessous pour faire croire qu'il y a une image
     
    print (tableau)
     
    ###########################################################CANVAS######################################################################
     
    fenetre = Tk()
     
     
    Can1 = Canvas( fenetre, height = 800, width = 1000, bg = "white" )
    Can1.pack( side = LEFT )
     
     
    #importation des images
    C1 = PhotoImage ( file = "rouge_1.gif") # Premier carrée
     
    C2 = PhotoImage ( file = "rouge_2.gif") # Deuxième carrée
     
    C3 = PhotoImage ( file = "rouge_3.gif") # Troisième carrée
     
    C4 = PhotoImage ( file = "rouge_4.gif") # Quatrième carrée
     
    C5 = PhotoImage ( file = "rouge_5.gif") # Cinquième carrée
     
     
    texte1 = Label(fenetre, text='Clic gauche sélectionne et clic droit déplace')
    texte1.pack()
     
     
    Can1.bind("<Button-1>", caseClicG)
    Can1.bind("<Button-3>", caseClicD)
     
    quitter = Button( fenetre, text = "Quitter", command = fenetre.destroy )
    quitter.pack( side = BOTTOM )
     
    jouer = Button( fenetre, text = "Jouer", command = jouer )
    jouer.pack( side = BOTTOM )
     
    regle = Button( fenetre, text = "Règle", command = regle )
    regle.pack( side = BOTTOM )
     
     
    Can1.pack()
     
    fenetre.mainloop()

  5. #5
    Membre chevronné
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 485
    Points : 2 151
    Points
    2 151
    Par défaut
    Si tu regardes bien ton code, tu as deux notion qui ne sont pas bien synchroniser: le contenu de ton tableau "tableau" et la représentation graphique de celui-ci.

    Je t'invite a construire ton code en trois partie, ce sera plus simple pour t'y retrouver:

    1 - La déclaration de toutes tes variables et structures de données: "tableau", "valeur", ...

    2 - Un série de fonctions qui manipule ces données sans graphisme: initialiser les données, sélectionner le cube untel, poser le cube dans la case unetelle, contenu de la case x,y, N° du cube déjà sélectionné ....

    3 - Un série de fonction de manipulation graphique qui ne doit utiliser que les fonctions précédentes, jamais les variables directement.

    => Pour ta fonction "rejouer", elle doit alors réinitialiser les données et afficher le plateau ainsi recréé et pour ça tu as déjà une fonction de 2 et une de 3 pour le faire.

    Cette façon faire, est une notion de séparation du rôle de chacun: si tu veux changer la façon de stoker tes données (renommé les variables par exemple), tu peux le faire sans toucher à tes fonctions graphiques et vice versa.

    Tu as des collègues à toi (http://www.developpez.net/forums/d15...-parties-code/) qui ont développé leur jeu dans ce sens du départ.
    Bon leur souci, c'est faire le cheminement inverse: intégrer l'ensemble dans un programme commun.
    N’hésitez pas à en discuter ensemble, entre lycéen vous trouverez peut être la solution

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment faire pour qu'une application soit toujours visible ?
    Par goldbar dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/03/2004, 14h35
  2. Réponses: 7
    Dernier message: 13/12/2003, 14h09
  3. comment faire pour developper des prog en win32
    Par rhodan51 dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 09/11/2003, 19h39
  4. Comment faire pour mettre l'ecran en veille ?
    Par March' dans le forum MFC
    Réponses: 6
    Dernier message: 29/08/2002, 14h25
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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