Labyrinthes

É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 0

  • p1(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ée

  • On la met en bleu

  • voisines <--- la liste de ses voisines non déjà visitées

  • Si voisines n'est pas une liste vide

    • current <--- l'une d'entre elles

    • p1 <--- 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 dans current

    • Sinon : il n'y a pas de solution

MéthodeMise en œuvre

Il nous faudra une méthode de la classe Cell pour obtenir la liste des voisines d'une case :

La voici :

1
     def getOptions(self):
2
        '''
3
        renvoie la liste des indices des case voisines avec un mur ouvert
4
        '''
5
        options=[]
6
        if self.walls[0]==False:
7
            options.append(self.index(self.i,self.j-1))
8
        if self.walls[1]==False:
9
            options.append(self.index(self.i+1,self.j))
10
        if self.walls[2]==False:
11
            options.append(self.index(self.i,self.j+1))
12
        if self.walls[3]==False:
13
            options.append(self.index(self.i-1,self.j))
14
        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.

1
    noFill()
2
    stroke(247,183,17)
3
    strokeWeight(2)
4
    beginShape()
5
    for k in range(len(p1.L)):
6
        vertex(p1.L[k].i*w+w/2,p1.L[k].j*w+w/2)
7
    endShape()

SimulationLe draw

Il vous reste à finir le programme en complétant le draw

1
def draw():
2
    '''
3
    fonction qui boucle (par defaut 60 fois/seconde)
4
    '''
5
    global current,next
6
    background(51)
7
    for i in range(len(grid)):
8
        grid[i].show()
9
    entree.highlight()
10
    sortie.highlight()
11
    # recherche du chemin (dfs)
12
13
14
    # à compléter
15
16
17
    # dessiner le chemin
18
    noFill()
19
    stroke(247,183,17)
20
    strokeWeight(2)
21
    beginShape()
22
    for k in range(len(p1.L)):
23
        vertex(p1.L[k].i*w+w/2,p1.L[k].j*w+w/2)
24
    endShape()
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Stéphan Van Zuijlen Licence de documentation libre GNURéalisé avec Scenari (nouvelle fenêtre)