Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jeu morpion

Tkinter

Sujet résolu
    6 avril 2011 à 12:40:36

    Bonjour,

    Je me suis lancé dans la réalisation d'un jeu de morpion dont voici le code:
    # -*-coding:Latin-1 -*
    from tkinter import *
    
    class Morpion(Tk):
        def __init__(self):
            Tk.__init__(self)
            self.title("Morpion")
            
            self.label_j1 = Label(self, text="Joueur 1", bg = "green")
            self.label_j2 = Label(self, text="Joueur 2")
            self.label_j1.pack(padx =20, side =LEFT)
            self.label_j2.pack(padx =20, side =RIGHT)
            
            self.can = Canvas(self, width = 300, height = 300, bg = "ivory", bd =1, relief =SUNKEN)
            self.can.pack(padx = 5, pady = 5)
            self.tracer_plateau()
            
            self.bind("<Button-1>", self.analyser_position_clic)
            
            self.b1 = Button(self, text='Recommencer', command=self.recommencer)
            self.b1.pack(pady = 5)
            
            self.grille = [0] * 9
            self.joueur = 1
            
        def tracer_plateau(self):
            self.can.create_line(105, 10, 105, 290, width = 10)
            self.can.create_line(205, 10, 205, 290, width = 10)
            self.can.create_line(10, 105, 290, 105, width = 10)
            self.can.create_line(10, 205, 290, 205, width = 10)
        
        def recommencer(self):
            self.can.delete(ALL)
            self.tracer_plateau()
            self.grille = [0] * 9
            
        def tracer_croix(self, x, y):
            self.can.create_line(x-35, y-35, x+35, y+35, width = 5, fill = "blue")
            self.can.create_line(x-35, y+35, x+35, y-35, width = 5, fill = "blue")
    
        def tracer_rond(self, x, y):
            self.can.create_oval(x - 35, y - 35, x + 35, y + 35, fill = "red")
            self.can.create_oval(x - 30, y - 30, x+30, y+30, fill = "ivory")
        
        def alterner_joueurs(self):
            if self.joueur == 1:
                self.joueur = 2
            else:
                self.joueur = 1
            
        def analyser_position_clic(self, event):
            #Detection de la position de la souris dans le Canvas en fonction des cases
            # 0 | 1 | 2
            # - + - + -
            # 3 | 4 | 5
            # - + - + -
            # 6 | 7 | 8
            
            if self.grille[0] == 0:
                if event.x > 0 and event.x < 100:
                    if event.y > 0 and event.y < 100:
                        i = 0
                        self.x = 55
                        self.y = 55
                    if event.y > 100 and event.y < 200:
                        i = 3
                        self.x = 55
                        self.y = 155
                    if event.y > 200 and event.y < 300:
                        i = 6
                        self.x = 55
                        self.y = 255
                elif event.x > 100 and event.x < 200:
                    if event.y > 0 and event.y < 100:
                        i = 1
                        self.x = 155
                        self.y = 55
                    if event.y > 100 and event.y < 200:
                        i = 4
                        self.x = 155
                        self.y = 155
                    if event.y > 200 and event.y < 300:
                        i = 7
                        self.x = 155
                        self.y = 255
                elif event.x > 200 and event.x < 300:
                    if event.y > 0 and event.y < 100:
                        i = 2
                        self.x = 255
                        self.y = 55
                    if event.y > 100 and event.y < 200:
                        i = 5
                        self.x = 255
                        self.y = 155
                    if event.y > 200 and event.y < 300:
                        i = 8
                        self.x = 255
                        self.y = 255
            
            if self.grille[i] is 0:
                if self.joueur is 1:
                    self.grille[i] = 1
                    self.tracer_croix(self.x, self.y)
                else:
                    self.grille[i] = 2
                    self.tracer_rond(self.x, self.y)
                    
                self.alterner_joueurs()
                
    if __name__ == "__main__":
        fenetre = Morpion()
        fenetre.resizable(width=False, height=False)
        
        fenetre.mainloop()
    


    Le problème: j’obtiens l'erreur suivante a la ligne 100:
    UnboundLocalError: local variable 'i' referenced before assignment

    Cette erreur ne se produit que pour la première case de ma grille de jeu. En gros dès que la case 0 est remplie, à l'appel suivant de la fonction analyser_position_clic() j'obtiens l'erreur.

    Merci de votre aide
    • Partager sur Facebook
    • Partager sur Twitter
      6 avril 2011 à 12:46:46

      soit c'est mal indenté, soit faut donner une valeur par defaut à 'i'.
      si la condition de la ligne 59 "self.grille[0] == 0:" n'est pas vérifiée, alors 'i' n'est pas initialisé.
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        6 avril 2011 à 13:02:31

        En donnant une valeur par défaut a i je n'ai plus d'erreur qui s'affiche, mais après avoir cliqué sur la case 0, il ne se passe plus rien quand je clique sur les autres cases.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          6 avril 2011 à 13:06:09

          Sachant que cette condition
          if self.grille[0] == 0:
          
          n'est pas vrai, il va rechercher la condition suivante où i n'est pas initialisé.
          • Partager sur Facebook
          • Partager sur Twitter
            6 avril 2011 à 13:18:32

            Même si je fait ça, je ne peut plus remplir mes cases au tour d'après.
            if self.grille[0] == 0:
            ...
            else:
                return
            
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              6 avril 2011 à 13:43:56

              J'ai essayé un peu d'analyser ton code et si j'ai bien compris self.grille te permet de savoir si une case est remplie et par qui, c'est ça?
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                6 avril 2011 à 14:00:01

                En fait self.joueur qui a la valeur 1 ou 2 doit être affecté à self.grille

                self.grille[i] = self.joueur
                


                Il faut maintenant le placer au bon endroit.

                J'ai pas testé, mais je dirais un truc de ce style

                if event.x > 0 and event.x < 100:
                            if event.y > 0 and event.y < 100:
                                i = 0
                                self.grille[i] = self.joueur
                                self.x = 55
                                self.y = 55
                


                Là où j'ai un doute c'est sur le placement de ces lignes de code, peut-être faudra-t-il les rectifier supprimer

                if self.joueur is 1:
                        self.grille[i] = 1
                        self.tracer_croix(self.x, self.y)
                    else:
                        self.grille[i] = 2
                        self.tracer_rond(self.x, self.y)
                                
                        self.alterner_joueurs()
                


                Edit :

                Bon j'ai repris ton code,j'ai fais des copier-coller pour ne pas me prendre la tête dans des modifs, mais sache qu'il y a de la factorisation dans l'air, même tu pourrais recréer une fonction pour certains points.

                # -*-coding:Latin-1 -*
                from tkinter import *
                
                <secret>class Morpion(Tk):
                    def __init__(self):
                        Tk.__init__(self)
                        self.title("Morpion")
                        
                        self.label_j1 = Label(self, text="Joueur 1", bg = "green")
                        self.label_j2 = Label(self, text="Joueur 2")
                        self.label_j1.pack(padx =20, side =LEFT)
                        self.label_j2.pack(padx =20, side =RIGHT)
                        
                        self.can = Canvas(self, width = 300, height = 300, bg = "ivory", bd =1, relief =SUNKEN)
                        self.can.pack(padx = 5, pady = 5)
                        self.tracer_plateau()
                        
                        self.bind("<Button-1>", self.analyser_position_clic)
                        
                        self.b1 = Button(self, text='Recommencer', command=self.recommencer)
                        self.b1.pack(pady = 5)
                        
                        self.grille = [0] * 9
                        self.joueur = 1
                        
                    def tracer_plateau(self):
                        self.can.create_line(105, 10, 105, 290, width = 10)
                        self.can.create_line(205, 10, 205, 290, width = 10)
                        self.can.create_line(10, 105, 290, 105, width = 10)
                        self.can.create_line(10, 205, 290, 205, width = 10)
                    
                    def recommencer(self):
                        self.can.delete(ALL)
                        self.tracer_plateau()
                        self.grille = [0] * 9
                        
                    def tracer_croix(self, x, y):
                        self.can.create_line(x-35, y-35, x+35, y+35, width = 5, fill = "blue")
                        self.can.create_line(x-35, y+35, x+35, y-35, width = 5, fill = "blue")
                
                    def tracer_rond(self, x, y):
                        self.can.create_oval(x - 35, y - 35, x + 35, y + 35, fill = "red")
                        self.can.create_oval(x - 30, y - 30, x+30, y+30, fill = "ivory")
                    
                    def alterner_joueurs(self):
                        if self.joueur == 1:
                            self.joueur = 2
                        else:
                            self.joueur = 1
                        
                    def analyser_position_clic(self, event):
                        #Detection de la position de la souris dans le Canvas en fonction des cases
                        # 0 | 1 | 2
                        # - + - + -
                        # 3 | 4 | 5
                        # - + - + -
                        # 6 | 7 | 8
                        
                        
                        if event.x > 0 and event.x < 100:
                            if event.y > 0 and event.y < 100:
                                i = 0
                                self.grille[i] = self.joueur
                                self.x = 55
                                self.y = 55
                                if self.joueur == 1:
                                    self.tracer_croix(self.x, self.y)
                                else:
                                    self.tracer_rond(self.x, self.y)
                                self.alterner_joueurs()
                            if event.y > 100 and event.y < 200:
                                i = 3
                                self.grille[i] = self.joueur
                                self.x = 55
                                self.y = 155
                                if self.joueur == 1:
                                    self.tracer_croix(self.x, self.y)
                                else:
                                    self.tracer_rond(self.x, self.y)
                                self.alterner_joueurs()
                            if event.y > 200 and event.y < 300:
                                i = 6
                                self.grille[i] = self.joueur
                                self.x = 55
                                self.y = 255
                                if self.joueur == 1:
                                    self.tracer_croix(self.x, self.y)
                                else:
                                    self.tracer_rond(self.x, self.y)
                                self.alterner_joueurs()
                        elif event.x > 100 and event.x < 200:
                            if event.y > 0 and event.y < 100:
                                i = 1
                                self.grille[i] = self.joueur
                                self.x = 155
                                self.y = 55
                                if self.joueur == 1:
                                    self.tracer_croix(self.x, self.y)
                                else:
                                    self.tracer_rond(self.x, self.y)
                                self.alterner_joueurs()
                            if event.y > 100 and event.y < 200:
                                i = 4
                                self.grille[i] = self.joueur
                                self.x = 155
                                self.y = 155
                                if self.joueur == 1:
                                    self.tracer_croix(self.x, self.y)
                                else:
                                    self.tracer_rond(self.x, self.y)
                                self.alterner_joueurs()
                            if event.y > 200 and event.y < 300:
                                i = 7
                                self.grille[i] = self.joueur
                                self.x = 155
                                self.y = 255
                                if self.joueur == 1:
                                    self.tracer_croix(self.x, self.y)
                                else:
                                    self.tracer_rond(self.x, self.y)
                                self.alterner_joueurs()
                        elif event.x > 200 and event.x < 300:
                            if event.y > 0 and event.y < 100:
                                i = 2
                                self.grille[i] = self.joueur
                                self.x = 255
                                self.y = 55
                                if self.joueur == 1:
                                    self.tracer_croix(self.x, self.y)
                                else:
                                    self.tracer_rond(self.x, self.y)
                                self.alterner_joueurs()
                            if event.y > 100 and event.y < 200:
                                i = 5
                                self.grille[i] = self.joueur
                                self.x = 255
                                self.y = 155
                                if self.joueur == 1:
                                    self.tracer_croix(self.x, self.y)
                                else:
                                    self.tracer_rond(self.x, self.y)
                                self.alterner_joueurs()
                            if event.y > 200 and event.y < 300:
                                i = 8
                                self.grille[i] = self.joueur
                                self.x = 255
                                self.y = 255
                                if self.joueur == 1:
                                    self.tracer_croix(self.x, self.y)
                                else:
                                    self.tracer_rond(self.x, self.y)
                                self.alterner_joueurs()
                
                if __name__ == "__main__":
                    fenetre = Morpion()
                    fenetre.resizable(width=False, height=False)
                    
                    fenetre.mainloop()
                
                • Partager sur Facebook
                • Partager sur Twitter

                Jeu morpion

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown