from tkinter import *
import random
from time import sleep
fen = Tk()
fen.title('Labyrinthe parfait')
pas = 20
larg = 30
haut = 20
canvas=Canvas(fen, width=larg*pas+6, height=haut*pas+6, bg='white')
canvas.pack()
def ligne(x1, y1, x2, y2, c):
canvas.create_line(x1*pas+3, y1*pas+3, x2*pas+3, y2*pas+3, fill=c, width=3)
def melange(t):
for i in range(1, len(t)):
j = randint(0, i)
t[i], t[j] = t[j], t[i]
# on dessine tous les murs
for x in range(larg+1):
ligne(x, 0, x, haut, 'black')
for y in range(haut+1):
ligne(0, y, larg, y, 'black')
# on met tous les murs dans un tableau
horizontal, vertical = True, False
murs = []
for x in range(larg):
for y in range(haut):
if x < larg - 1:
murs.append((x, y, horizontal))
if y < haut - 1:
murs.append((x, y, vertical))
# et on mélange ce tableau
random.shuffle(murs)
print("il y a", len(murs), "murs")
n = larg * haut # il y a n cases
link = [i for i in range(n)]
# principe : en suivant link, on trouve un représentant de la classe de i
def repr(i):
"""donne le représentant de la classe de i"""
if link[i] == i: return i
r = repr(link[i])
link[i] = r
return r
# on parcourt tous les murs et on les ouvre lorsque les cases correspondantes
# ne sont pas encore reliées par un chemin
for x, y, h in murs:
c = x * haut + y
s = c + (haut if h else 1)
if repr(c) == repr(s): continue
link[repr(c)] = repr(s)
if h:
x1, y1, x2, y2 = x+1, y, x+1, y+1
else:
x1, y1, x2, y2 = x, y+1, x+1, y+1
ligne(x1, y1, x2, y2, 'white')
fen.update()
sleep(0.005)
print("à vous de jouer !")
fen.mainloop()