Étape 4 : Résolution du labyrinthe
Le principe
Il faut imaginer ce labyrinthe comme un graphe, où chaque sommet est une case reliée à ses voisines par l’absence de murs entre elles.
Chaque case possède entre 1 et 3 voisines avec les quelles elle est reliée.
On fait un parcours en profondeur de ce graphe en utilisant la boucle draw()
Dans le setup()
current
<-- la case 0p1
(une pile) <---current
Dans le draw()
( qui est une boucle )
On met en bleu l'entrée et la sortie
On note
current
comme visitéeOn la met en bleu
voisines
<--- la liste de ses voisines non déjà visitéesSi
voisines
n'est pas une liste videcurrent
<--- l'une d'entre ellesp1
<---current
Si
current
est la sortie :p1
<---current
On la note comme visitée
On a terminé (la pile
p1
contient le chemin)
Sinon :
Si la pile n'est pas vide :
On dépile
p1
danscurrent
Sinon : il n'y a pas de solution
Méthode : Mise en œuvre
Il nous faudra une méthode de la classe Cell pour obtenir la liste des voisines d'une case :
La voici :
def getOptions(self):
'''
renvoie la liste des indices des case voisines avec un mur ouvert
'''
options=[]
if self.walls[0]==False:
options.append(self.index(self.i,self.j-1))
if self.walls[1]==False:
options.append(self.index(self.i+1,self.j))
if self.walls[2]==False:
options.append(self.index(self.i,self.j+1))
if self.walls[3]==False:
options.append(self.index(self.i-1,self.j))
return options
À faire : Expliquer le fonctionnement de cette méthode
Voici ce qu'il faudra rajouter à la fin du draw
pour que le chemin se dessine au fur et à mesure.
noFill()
stroke(247,183,17)
strokeWeight(2)
beginShape()
for k in range(len(p1.L)):
vertex(p1.L[k].i*w+w/2,p1.L[k].j*w+w/2)
endShape()
Simulation : Le draw
Il vous reste à finir le programme en complétant le draw
def draw():
'''
fonction qui boucle (par defaut 60 fois/seconde)
'''
global current,next
background(51)
for i in range(len(grid)):
grid[i].show()
entree.highlight()
sortie.highlight()
# recherche du chemin (dfs)
# à compléter
# dessiner le chemin
noFill()
stroke(247,183,17)
strokeWeight(2)
beginShape()
for k in range(len(p1.L)):
vertex(p1.L[k].i*w+w/2,p1.L[k].j*w+w/2)
endShape()