Jeu de dames sur tkinter

Bonjour, je veux faire un jeu de dames avec tkinter, j'en suis au tout début et je veux faire en sorte que les cases en diagonales du pion cliqué soit vertes, mais ça ne marche pas. pouvez vous m'aider ? voici mon code :

from tkinter import*

WIDTH=400
HEIGHT=400
plateau=[[1,0,1,0,1,0,1,0,1,0],
[0,1,0,1,0,1,0,1,0,1],
[1,0,1,0,1,0,1,0,1,0],
[0,1,0,1,0,1,0,1,0,1],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[2,0,2,0,2,0,2,0,2,0],
[0,2,0,2,0,2,0,2,0,2],
[2,0,2,0,2,0,2,0,2,0],
[0,2,0,2,0,2,0,2,0,2]]

def placerLesPions(cnv,plateau):
for i in range (10):
for j in range (10):
if plateau[i][j]==1:
cnv.create_oval((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='black', outline='')
elif plateau[i][j]==2:
cnv.create_oval((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='bisque', outline='')

def souris(event):
global cnv
#print("x", event.x, end=" ")
#print("y", event.y)
x=int(event.x//(HEIGHT/10))
y=int(event.y//(WIDTH/10))
options(x,y)

def options(x,y):
global cnv
global plateau

if plateau[x][y]==1 or plateau[x][y]==2:
if plateau[x+1][y+1]==0:
plateau[x+1][y+1]=5
if plateau[x+1][y-1]==0:
plateau[x+1][y-1]=5
if plateau[x-1][y+1]==0:
plateau[x-1][y+1]=5
if plateau[x-1][y-1]==0:
plateau[x-1][y-1]=5
for j in range(10):
for i in range (10):
print(plateau[i][j], end=' ')
print()
print()

# Le constructeur Tk

my_root=Tk()
cnv=Canvas(my_root, width=WIDTH, height=HEIGHT, background='papaya whip')
cnv.pack()
for i in range (10):
for j in range (10):
if i==0 or i%2==0:
if j==0 or j%2==0:
cnv.create_rectangle((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='sienna4', outline='')
if i%2==1:
if j%2==1:
cnv.create_rectangle((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='sienna4', outline='')
for i in range (10):
for j in range (10):
if plateau[i][j]==5:
cnv.create_rectangle((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='lime green', outline='')

placerLesPions(cnv,plateau)

cnv.bind("<Button-1>", souris)
my_root.update

my_root.mainloop()


Configuration: Windows / Firefox 85.0

5 réponses

  1. Salut,

    Je n'ai plus fait de tkinter depuis un moment, mais, en algorithmique, tu pourrais essayer de créer une fonction qui retourne une liste de cases à verdir. La fonction prendrait la case cliquée en paramètres d'entrée, puis tu calcules les cases en ajoutant/retirant une valeur entière n à i et j et à chaque étape valide tu ajoutes la case dans la liste finale tant que le résultat n'est pas inférieur à 0 (première case en [0][0]) ni supérieur à N ([N][N] étant la dernière case).

    Ensuite, dans une fonction de mise à jour de l'affichage, tu récupères le retour de la première fonction en tant que paramètres d'entrée.
    1
    1. j'assigne déjà les cases censé être verte, malheureusement, c'est l'affichage qui ne fonctionne pas ^^'
      1
      1. pardon, je savais pas comment faire, le voici :

        from tkinter import*
        
        WIDTH=400
        HEIGHT=400
        plateau=[[1,0,1,0,1,0,1,0,1,0],
                 [0,1,0,1,0,1,0,1,0,1],
                 [1,0,1,0,1,0,1,0,1,0],
                 [0,1,0,1,0,1,0,1,0,1],
                 [0,0,0,0,0,0,0,0,0,0],
                 [0,0,0,0,0,0,0,0,0,0],
                 [2,0,2,0,2,0,2,0,2,0],
                 [0,2,0,2,0,2,0,2,0,2],
                 [2,0,2,0,2,0,2,0,2,0],
                 [0,2,0,2,0,2,0,2,0,2]]
        
        def placerLesPions(cnv,plateau):
            for i in range (10):
                for j in range (10):
                    if plateau[i][j]==1:
                      cnv.create_oval((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='black', outline='')
                    elif plateau[i][j]==2:
                      cnv.create_oval((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='bisque', outline='')
        
                    
        def souris(event):
            global cnv
            #print("x", event.x, end=" ")
            #print("y", event.y)
            x=int(event.x//(HEIGHT/10))
            y=int(event.y//(WIDTH/10))
            options(x,y)
        
        def options(x,y):
          global cnv
          global plateau
        
          if plateau[x][y]==1 or plateau[x][y]==2:
            if plateau[x+1][y+1]==0:
              plateau[x+1][y+1]=5
            if plateau[x+1][y-1]==0:
              plateau[x+1][y-1]=5
            if plateau[x-1][y+1]==0:
              plateau[x-1][y+1]=5
            if plateau[x-1][y-1]==0:
              plateau[x-1][y-1]=5
          for j in range(10):
            for i in range (10):
              print(plateau[i][j], end=' ')
            print()
          print()
            
        
        
        # Le constructeur Tk
        
        my_root=Tk()
        cnv=Canvas(my_root, width=WIDTH, height=HEIGHT, background='papaya whip')
        cnv.pack()
        for i in range (10):
            for j in range (10):
                if i==0 or i%2==0:
                    if j==0 or j%2==0:
                        cnv.create_rectangle((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='sienna4', outline='')
                if i%2==1:
                    if j%2==1:
                        cnv.create_rectangle((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='sienna4', outline='')
        for i in range (10):
            for j in range (10):
              if plateau[i][j]==5:
                cnv.create_rectangle((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='lime green', outline='')
            
        placerLesPions(cnv,plateau)
        
        cnv.bind("<Button-1>", souris)
        my_root.update


        my_root.mainloop()
        1
        1. Pour faire plus propre et plus homogène, tu peux même créer le dessin du plateau dans une fonction:
          # -*- coding:Latin-1 -*-
          
          from tkinter import*
          
          WIDTH=400
          HEIGHT=400
          plateau=[[1,0,1,0,1,0,1,0,1,0],
                   [0,1,0,1,0,1,0,1,0,1],
                   [1,0,1,0,1,0,1,0,1,0],
                   [0,1,0,1,0,1,0,1,0,1],
                   [0,0,0,0,0,0,0,0,0,0],
                   [0,0,0,0,0,0,0,0,0,0],
                   [2,0,2,0,2,0,2,0,2,0],
                   [0,2,0,2,0,2,0,2,0,2],
                   [2,0,2,0,2,0,2,0,2,0],
                   [0,2,0,2,0,2,0,2,0,2]]
          
          def creer_plateau():
              for i in range (10):
                  for j in range (10):
                      if i==0 or i%2==0:
                          if j==0 or j%2==0:
                              cnv.create_rectangle((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='sienna4', outline='')
                      if i%2==1:
                          if j%2==1:
                              cnv.create_rectangle((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='sienna4', outline='')
              for i in range (10):
                  for j in range (10):
                    if plateau[i][j]==5:
                      cnv.create_rectangle((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='lime green', outline='')
          
          def placerLesPions(plateau):
              for i in range (10):
                  for j in range (10):
                      if plateau[i][j]==1:
                        cnv.create_oval((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='black', outline='')
                      elif plateau[i][j]==2:
                        cnv.create_oval((i*(WIDTH/10),j*(HEIGHT/10),(i*(WIDTH/10)+(WIDTH/10)),(j*(HEIGHT/10)+(HEIGHT/10))), fill='bisque', outline='')
          
          def souris(event):
              global cnv
          
              x=int(event.x//(HEIGHT/10))
              y=int(event.y//(WIDTH/10))
              options(x,y)
          
          def options(x,y):
            global cnv
            global plateau
          
            if plateau[x][y]==1 or plateau[x][y]==2:
              if plateau[x+1][y+1]==0:
                plateau[x+1][y+1]=5
              if plateau[x+1][y-1]==0:
                plateau[x+1][y-1]=5
              if plateau[x-1][y+1]==0:
                plateau[x-1][y+1]=5
              if plateau[x-1][y-1]==0:
                plateau[x-1][y-1]=5
          
            for j in range(10):
              for i in range (10):
                print(plateau[i][j], end=' ')
              print()
            print()
          
          my_root=Tk()
          cnv=Canvas(my_root, width=WIDTH, height=HEIGHT, background='papaya whip')
          cnv.pack()
          cnv.bind("<Button-1>", souris)
          
          creer_plateau()
          placerLesPions(plateau)
          
          my_root.mainloop()
          


          A part ça, ton code affiche un damier et imprime le contenu du tableau quand on clique une case, mais tu ne cherche pas la diagonale pour la peindre en vert ...

          De plus, ce qui est troublant quand on veut se retrouver dans les coordonnées des cases, c'est que dans la variable plateau, les 1 (donc les noirs) sont en haut et les 2 (donc les blancs) en bas
          et graphiquement, les noirs sont à gauche et les blancs à droite

          Et puis moi, au lieu d'utiliser tous ces nombres magiques, je ferais ça:

          BLACK = 1
          WHITE = 2


          et plus loin :

          if plateau[i][j]==BLACK:


          etc ...
          1