Le but de cet exercice est de corriger un programme de création
de labyrithe qui malheureusement ne marche pas.
Dans le but de découvrir et corriger les divers bugs du code ci-dessous,
nous effectueront plusieurs refactoring pour décomposer le code
en fonction plus simple puis nous testeront chaque fonction en isolation.
Une fois un bug trouvé grâce à un test, il vous sera demandé de corriger
le code et de vérifier que le code est maintenant correct grâce aux tests.
Pour afficher le labyrinthe, le programme utilise la bibliothèque
CanvasArea que nous avons vu précédemment.
Le code ci-dessus utilise l'algorithme appelé "recursive backtracker" (le plus simple)
pour générer le labyrinthe. Cet algorithme est décrit par cet article
wikipedia.
Attention, le code en Python fourni en fin d'article ne correspond pas à cet algorithme
(ni à aucun autre décrit dans la page d'ailleurs ??)
Le labyrinthe est composé d'une grille de booléen representant auusi bien des pièces du labyrinthe
que des murs du labyrinthe. Une pièce est entouré de quatre murs
W W = wall
W R W R = room
W
donc pour un labyrithe ayant 4 pièces en largeur et 2 pièces en longeur, la grille sera la suivante
W W W W W W W W W
W R W R W R W R W
W W W W W W W W W
W R W R W R W R W
W W W W W W W W W
Comme il y a un mur autour de chaque pièce, la taille de la grille s'obtient en appliquant la formule
2 * width + 1 (resp.
2 * height + 1) donc dans l'exemple la grille a 4 pièces par 2 pièces,
elle a donc pour taille (
4 * 2 + 1,
2 * 2 + 1) c-a-d (9, 5).
Grace à cette convention, il n'est pas nécessaire de stocker le type de case,
les positions en
2x+1 et
2y+1 sur la grille contiennent des pièces, le reste contient des murs.
De plus, il est facile de calculer les coordonées d'un mur entre deux pièces adjacentes, il suffit de faire la moyenne
des deux coordonnées de chaque pièce.
L'implantation utilise la classe
Room pour représenter une pièce, avec la première pièce commenceant en (0,0)
donc un système de coordonnée prenant en compte uniquement les pièces et pas les murs.
Dans ce cas, passée du système de coordonée d'une
Room à celui de la grille il faut appliquer (2x+1, 2y+1)
et un mur entre deux pièces adjancentes est ((2x
1+1 + 2x
2+1) / 2, (2y
1+1 + 2y
2+1) / 2)
que l'on peut simplifié en (x
1 + x
2 + 1, y
1 + y
2 + 1),
cf ligne 32 du fichier Maze.java.