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()