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. 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
    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. j'assigne déjà les cases censé être verte, malheureusement, c'est l'affichage qui ne fonctionne pas ^^'
        1
        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