Ressources pour labyrinthe
- Exemple de code d'IHM:
# les packages, modules et fonctions nécessaires
from tkinter import Button, Tk, Canvas
import time
# un labyrithe
lab1 = [
[1, 1, 1, 1, 1, 1, 1],
[2, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 0, 1],
[1, 0, 1, 0, 0, 0, 1],
[1, 0, 1, 0, 1, 0, 1],
[1, 0, 0, 0, 1, 0, 1],
[1, 1, 1, 1, 1, 3, 1]
]
# exemple de fonction qui gère un événement clavier ici "aller horizontalement vers la gauche"
# le déplacement <=> changement de colonne dans la matrice
def touche_l(evt):
# accès aux coordonnées actuelle du cercle et au labyrinthe
global x, y, lab1
# si case à gauche possible ou si case de départ ou arrivée:
if (y-1) >=0 and (lab1[x][y-1] == 0 or lab1[x][y-1] == 3 or lab1[x][y-1] == 2 ):
# on passe à colonne précédente
y-=1
# on redessine le cercle
c.coords(cercle, y*50, x*50, 50 + y*50 , 50+x*50)
def touche_d(evt):
# à compléter
def touche_r(evt):
# à compléter
def touche_u(evt):
# à compléter
# dimensions canevas = dimension matrice x 50px
nb_ligne = len(lab1)
nb_col = len(lab1[0])
largeur_canevas = nb_col * 50
hauteur_canevas = nb_ligne * 50
# création fenêtre non redimensionnable
fen = Tk()
fen.geometry("{}x{}".format(largeur_canevas + 100 , hauteur_canevas + 100))
fen.title("labyrinte")
fen.resizable(width=False, height=False)
# canevas de largeur_canevas pixels par hauteur_canevas pixels
c = Canvas(fen, width="{}".format(largeur_canevas), height="{}".format(hauteur_canevas), bg='white')
# positionnement canvas dans fenêtre
c.grid(row=1, column=1, rowspan=nb_ligne, columnspan=nb_col, sticky='NW')
# dessin grille
for x in range(nb_col):
#traits verticaux noirs
c.create_line(x*50, 2, x*50, largeur_canevas, width=1, fill='black')
for y in range(nb_ligne):
#traits horizontaux noirs
c.create_line( 2, y*50, hauteur_canevas, y*50, width=1, fill='black')
# création cercle rouge
coord_depart = (..., ....)
x = coord_depart[0]
y = coord_depart[1]
# dession du cercle rouge
cercle = c.create_oval(y*50, x*50, 50 + y*50 , 50+x*50, outline='red', fill='red' )
# évenements clavier à gérer
fen.bind('<Left>', touche_l)
fen.bind('<Right>', touche_r)
fen.bind('<Up>', touche_u)
fen.bind('<Down>', touche_d)
# prise en compte événement par windows
fen.mainloop()
- Principe animation sortie automatique du labyrinthe
La fonction animation est appelée lorsque l'on clique sur un bouton de l'interface graphique, cette fonction a accès à la liste result qui contient le chemin à parcourir, toutes les 200 ms, elle récupère l'élément suivant de la liste et redessine le cercle à cette coordonnée.
# liste renvoyée par la fonction solution (chemin pour sortir)
result = solution(lab1)
# dessin cercle au départ ( les coordonnées dépendent de la grille choisie ici des pas de 50px)
cercle = c.create_oval(result[0][1]*50, result[0][0]*50, 50 + result[0][1]*50 , 50+result[0][0]*50, outline='red', fill='red' )
# position dans la liste result (au départ premier élément de la liste)
pas = 0
# dessin du cercle aux nouvelles coordonnées toutes les 200 ms
# c'est une fonction recursive, il ne doit pas y avoir de while ou for dedans
def animation():
# accès aux données utiles
global result, c, cercle, pas
# s'il reste une position dans la liste du chemin à prendre
if pas < len(result):
#on redessine le cercle à la position courante
c.coords(cercle, result[pas][1]*50, result[pas][0]*50, 50+ result[pas][1]*50,50+result[pas][0]*50 )
# on passe à la position suivante dans le chemin à prendre
pas = pas + 1
# on rappelle la même fonction 200 ms plus tard = récursivité
fen.after(200,animation)
# la fonction animation est associée à un bouton de l'interface IHM positionné en ....
bouton = Button(fen, text="Sortir", command=animation)
bouton.grid(row=....., column=....)
Créé avec HelpNDoc Personal Edition: Créer de la documentation iPhone facilement