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