Pour dessiner un labyrinthe, on propose la méthode suivante :
- On dessine un grand rectangle qui délimitera le labyrinthe.
- On trace alors une verticale au hasard dans le rectangle en décidant d'une porte au hasard :
- Dans chacune des zones ainsi définies, on trace maintenant une horizontale au hasard (en choisissant une
porte au hasard).
- Pour chacune des 4 zones, on retourne au point 2.
Pour se donner un critère d'arrêt simple, on peut imaginer ne tracer des murs que sur des droites d'équation x = k avec k entier (pour les verticales) et y = k avec k entier (pour les horizontales). Le processus s'arrête lorsqu'une salle obtenue est un couloir de longueur 1.
- documentation tortue
- un code
- avec une entrée et une sortie
On trouvera la doc sur le module turtle ici.
Un code possible. Il ne vous reste qu'à créer une entrée et une sortie.
import turtle as tl
from random import randint
unite = 20
def rectangle(xbg, ybg, xhd, yhd) :
"""
(xbg,ybg) : coordonnées du coin inférieur gauche du rectangle.
(xhd, yhd) : coordonnées du coin supérieur droit.
"""
tl.penup()
tl.setposition(xbg * unite, ybg * unite)
tl.pendown()
tl.setposition(xbg * unite, yhd * unite)
tl.setposition(xhd * unite, yhd * unite)
tl.setposition(xhd * unite, ybg * unite)
tl.setposition(xbg * unite, ybg * unite)
tl.penup()
def verticale(x, yd, yf) :
porte = randint(yd,yf-1)
tl.penup()
tl.setposition(x * unite, yd * unite)
tl.pendown()
tl.setposition(x * unite, porte * unite)
tl.penup()
tl.setposition(x * unite, (porte+1) * unite)
tl.pendown()
tl.setposition(x * unite, yf * unite)
def horizontale(y, xd, xf) :
porte = randint(xd,xf-1)
tl.penup()
tl.setposition(xd * unite, y * unite)
tl.pendown()
tl.setposition(porte * unite, y * unite)
tl.penup()
tl.setposition((porte+1) * unite, y * unite)
tl.pendown()
tl.setposition(xf * unite, y * unite)
def dedale(xbg, ybg, xhd, yhd, direction = 'v') :
"""
(xbg,ybg) : coordonnées du coin inférieur gauche du rectangle.
(xhd, yhd) : coordonnées du coin supérieur droit.
"""
if direction == 'v' and xhd - xbg > 1 :
x = randint(xbg+1,xhd-1)
verticale(x, ybg, yhd)
dedale(xbg, ybg, x, yhd, 'h')
dedale(x, ybg, xhd, yhd, 'h')
elif yhd - ybg > 1 :
y = randint(ybg+1,yhd-1)
horizontale(y, xbg, xhd)
dedale(xbg, ybg, xhd, y, 'v')
dedale(xbg, y, xhd, yhd, 'v')
llx, lly = 0, 0
urx, ury = 20, 20
tl.setworldcoordinates((llx-1)*unite, (lly-1) *unite, (urx+1) * unite, (ury+1) * unite)
tl.hideturtle()
tl.speed(0)
tl.pencolor('green')
rectangle(llx, lly, urx, ury)
dedale(llx, lly, urx, ury)
tl.exitonclick()
from turtle import *
from random import randint
unite = 20
def rectangle(xbg, ybg, xhd, yhd) :
"""
(xbg,ybg) : coordonnées du coin inférieur gauche du rectangle.
(xhd, yhd) : coordonnées du coin supérieur droit.
Création d'une porte et d'une entrée choisie au hasard
sur le mur nord et le mur sud.
"""
porte1 = randint(xbg, xhd-1)
penup()
setposition(xbg * unite, ybg * unite)
pendown()
goto(xbg * unite, yhd * unite)
goto(porte1 * unite, yhd * unite)
penup()
goto((porte1+1) * unite, yhd * unite)
pendown()
goto(xhd * unite, yhd * unite)
goto(xhd * unite, ybg * unite)
porte2 = randint(xbg+1, xhd)
goto( porte2 * unite, ybg * unite)
penup()
goto( (porte2-1) * unite, ybg * unite)
pendown()
goto(xbg * unite, ybg * unite)
penup()
def verticale(x, yd, yf) :
porte = randint(yd,yf-1)
penup()
setposition(x * unite, yd * unite)
pendown()
setposition(x * unite, porte * unite)
penup()
setposition(x * unite, (porte+1) * unite)
pendown()
setposition(x * unite, yf * unite)
def horizontale(y, xd, xf) :
porte = randint(xd,xf-1)
penup()
setposition(xd * unite, y * unite)
pendown()
setposition(porte * unite, y * unite)
penup()
setposition((porte+1) * unite, y * unite)
pendown()
setposition(xf * unite, y * unite)
def dedale(xbg, ybg, xhd, yhd, direction = 'v') :
"""
(xbg,ybg) : coordonnées du coin inférieur gauche du rectangle.
(xhd, yhd) : coordonnées du coin supérieur droit.
"""
if direction == 'v' and xhd - xbg > 1 :
x = randint(xbg+1,xhd-1)
verticale(x, ybg, yhd)
dedale(xbg, ybg, x, yhd, 'h')
dedale(x, ybg, xhd, yhd, 'h')
elif yhd - ybg > 1 :
y = randint(ybg+1,yhd-1)
horizontale(y, xbg, xhd)
dedale(xbg, ybg, xhd, y, 'v')
dedale(xbg, y, xhd, yhd, 'v')
llx, lly = 0, 0
urx, ury = 20, 20
setworldcoordinates((llx-1)*unite, (lly-1) *unite, (urx+1) * unite, (ury+1) * unite)
hideturtle()
delay(0)
pencolor('green')
rectangle(llx, lly, urx, ury)
dedale(llx, lly, urx, ury)
exitonclick()