Juego de damas en tkinter

CalioPur -  
Phil_1857 Mensajes publicados 1883 Fecha de registro   Estado Miembro Última intervención   -
Je vais te donner une piste pour que les cases diagonales autour du pion cliqué deviennent vertes.

Problème probable:
- Tu calcules les indices x et y à partir de event.x et event.y en utilisant les divisions par HEIGHT/10 et WIDTH/10 de manière inversée. Cela peut donner des coordonnées incorrectes et échouer les conditions pour colorier les cases voisines.
- Tu mélanges les indices x et y quand tu accèdes plateau[x][y] vs plateau[i][j] lors du dessin, ce qui peut faire des erreurs d’orientation.

Idées et corrections suggérées:
- Utilise une conversion cohérente entre coordonnées pixel et indices de plateau: row et col. Par exemple, row = int(event.y // (HEIGHT/10)); col = int(event.x // (WIDTH/10)).
- Accède au plateau en utilisant plateau[row][col], puis protège les bornes lorsque tu regardes les diagonales (row±1, col±1).
- Assure-toi que tu appelles la fonction placerLesPions après avoir modifié le plateau, ou rafraîchis le canevas pour voir les couleurs.

Exemple de correction minimale (à insérer dans ton code):
- Modification de souris et options avec cohérence
- Remplacements:
- Dans souris: row et col plutôt que x,y
def souris(event):
global cnv
row = int(event.y // (HEIGHT/10))
col = int(event.x // (WIDTH/10))
options(row, col)

- Dans options(row, col):
def options(row, col):
global cnv, plateau
if 0 <= row < 10 and 0 <= col < 10:
if plateau[row][col] in (1, 2):
# Efface les anciennes marques si nécessaire, puis marque les diagonales
for dr, dc in ((1,1),(1,-1),(-1,1),(-1,-1)):
r = row + dr
c = col + dc
if 0 <= r < 10 and 0 <= c < 10 and plateau[r][c] == 0:
plateau[r][c] = 5
# Rafraîchir l'affichage des cases marquées
placerLesPions(cnv, plateau)
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='')

Note:
- Si tu veux que les diagonales apparaissent tout juste autour du pion cliqué, assure-toi que plateau[r][c] est bien initialisé à 0 et que placerLesPions et le rafraîchissement ne suppriment pas tes marques 5. Tu peux aussi gérer une couche distincte de dessin ou nettoyer les marques avant chaque nouvel affichage.

Si tu veux, copie-colle ici les messages d’erreur ou décris ce qui s’affiche après ces ajustements et je te donne une version prête à exécuter pas à pas.

5 respuestas

  1. dachiasse Mensajes publicados 1932 Estado Miembro 153
     
    Hola,

    No he tocado tkinter desde hace un tiempo, pero, en algoritmos, podrías intentar crear una función que devuelva una lista de casillas para teñir de verde. La función tomaría la casilla clickeada como parámetro de entrada, luego calculas las casillas añadiendo/quitas una valor entero n a i y j y en cada paso válido añades la casilla a la lista final siempre que el resultado no sea inferior a 0 (la primera casilla en [0][0]) ni superior a N ([N][N] siendo la última casilla).

    Luego, en una función de actualización de la visualización, recuperas el retorno de la primera función como parámetros de entrada.
    1
  2. CalioPur
     
    Ya asigno las casillas que se suponía debían ser verdes, desgraciadamente es la visualización lo que no funciona ^^
    1
  3. Phil_1857 Mensajes publicados 1883 Fecha de registro   Estado Miembro Última intervención   169
     
    Para hacer las cosas más limpias y homogéneas, incluso puedes crear el dibujo del tablero dentro de una función:
     # -*- coding:Latin-1 -*- from tkinter import* WIDTH=400 HEIGHT=400 tablero=[[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 tablero[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(tablero): for i in range (10): for j in range (10): if tablero[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 tablero[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 tablero if tablero[x][y]==1 or tablero[x][y]==2: if tablero[x+1][y+1]==0: tablero[x+1][y+1]=5 if tablero[x+1][y-1]==0: tablero[x+1][y-1]=5 if tablero[x-1][y+1]==0: tablero[x-1][y+1]=5 if tablero[x-1][y-1]==0: tablero[x-1][y-1]=5 for j in range(10): for i in range (10): print(tablero[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(tablero) my_root.mainloop() 


    Aparte de eso, tu código imprime un damero y el contenido de la tabla cuando se hace clic en una casilla, pero no busca la diagonal para pintarla en verde ...

    Además, lo que resulta confuso cuando quieres ubicar las coordenadas de las casillas es que en la variable tablero, las 1 (las negras) están en la parte superior y las 2 (las blancas) abajo
    y gráficamente, las negras están a la izquierda y las blancas a la derecha

    Y luego, en lugar de usar todos esos números mágicos, haría esto:

    BLACK = 1 WHITE = 2


    y más adelante :

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


    etc ...
    1