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