:: Enseignements :: Master :: M1 :: 2014-2015 :: Design Pattern ::
[LOGO]

a-maze-ing




Exercice 1 - Retours sur vos rendus ...

Exercice 2 - Labyrinthe

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 ((2x1+1 + 2x2+1) / 2, (2y1+1 + 2y2+1) / 2) que l'on peut simplifié en (x1 + x2 + 1, y1 + y2 + 1), cf ligne 32 du fichier Maze.java.

  1. Dans le but de trouver les différentes erreurs, nous allons dans un premier temps essayer de décomposer la première partie de la méthode generateMaze, l'initialisation du Set notVisited en extrayant le code d'initialsation dans une méthode.
    Créer une méthode notVisitedSet, vous pouvez pour cela utiliser votre IDE (Refactor > Extract Method...).
    Puis écrire des tests vérifiant que les pièces créées ont les valeurs correctes.
    Quelle est le problème de ce code ? Le code de Room est-il aussi correct ?
    Corriger le code !, attention, on ne vous demande pas de remplacer le code par un nouveau code mais bien de corriger le code existant.
  2. Appliquer la même démarche à la méthode pickANeighbor.
  3. Enfin, si vous ne l'avez pas déjà vu, la classe Room a aussi un problème, qu'elles sont les opérations à tester dans ce cas ?
    Implanter les tests correspondant, trouver le bug et corrigez-le.

Exercice 3 - Récapitulatif