Jeu de dames sur tkinter

Signaler
-
Messages postés
946
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
27 février 2021
-
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

Messages postés
1053
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
28 février 2021
87
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.
j'assigne déjà les cases censé être verte, malheureusement, c'est l'affichage qui ne fonctionne pas ^^'
Messages postés
946
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
27 février 2021
102
Bonjour,

merci de copier/coller ici ton code complet avec les balises de code
mode d'emploi:
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Visuellement, ça doit ressembler à ceci (avec la coloration syntaxique), et pas à ce que tu as affiché :

def test():
    print('test')

test()
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()
Messages postés
946
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
27 février 2021
102
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 ...