Le code fourni est commenté en utilisant la convention JavaDoc. Vous pouvez consulter la documentation générée à partir de ces commentaires.
En machine (et dans le paquet ocean
), l’océan est
modélisé par une matrice pleine dont chaque cellule correspond à une
case du labyrinthe. Les relations d’adjacence sont implicites, chaque
cellule ayant par convention 4 voisines : une à gauche (ouest), une en
dessous (sud), une à droite (est), une au dessus (nord). Ce modèle est
implémenté par l’énumération BasicDirections
(East, North, South, West), qui
implémente l’interface Direction
, et la classe
Coordinate
dans les
fichiers BasicDirections.java
et Coordinate.java
respectivement. L’énumération BasicDirections
définit les quatres directions en précisant pour chacune son opposée :
WEST
– EAST
et SOUTH
– NORTH
. Elle
fournit, entre autres, la méthode
public BasicDirections getOpposite()
),
qui permet de récupérer la direction opposée, e.g.
EAST.getOpposite()
renvoie WEST
.La classe Coordinate
fournit,
entre autres, les méthodes suivantes pour manipuler les cellules :
public boolean equals(Object o)
)
permet, comme d’habitude, de comparer deux cellules,Coordinate moveTo(Direction dir)
:
renvoie les coordonnées de la cellule voisine dans la direction
dir
.Afin de réaliser les parcours dans l’océan, on va associer des
marques à certaines cellules. Tout objet dont la classe
implémente l’interface Mark
(voir le fichier Mark.java
) peut servir de
marque. C’est le cas de la classe BasicDirections
,
mais aussi de la classe IntMark
(dans le fichier
IntMark.java
), qui
permet de marquer une cellule par un nombre entier. Initialement, les
cellules ne sont pas marquées.
La structure de l’océan est codée dans la classe Ocean
, fournie dans le
fichier Ocean.java
.
Cette classe fournit, entre autres, les méthodes ci-dessous.
boolean exploreUsing(Traversal traversal)
lance l’exploration de l’océan avec l’algorithme défini par
traversal
.true
lorsque Nemo est retrouvé. Vous
n’avez pas à vous en préoccuper, mais si vous voulez voir comment elle
est appelée, regardez les méthodes main()
que vous
trouverez dans les fichiers que vous allez modifier et dans FindNemo.java
(on verra la
classe Traversal
plus bas).Collection<Direction> directions()
)
renvoie une collection de toutes les directions. Cette méthode peut être
utile pour itérer sur les voisines d’une cellule dans ocean
par le moyen d’une boucle for
:for (Direction dir : ocean.directions()) {...}
dir
avec la méthode moveTo(Direction dir)
de la classe Coordinate
.boolean isWall(Coordinate c)
renvoie true
si c
est un mur,boolean isThereASharkAt(Coordinate c)
renvoie true
si c
contient un requin,boolean isNemoAt(Coordinate c)
renvoie true
si Nemo se trouve dans c
,boolean isMarked(Coordinate c)
renvoie true
si c
comporte une marque,boolean isValid(Coordinate c)
renvoie true
si c
est bien la coordonnée d’une
cellule de l’océan.Mark setMark(Coordinate c, Mark mark)
pose la marque mark
dans la cellule c
,Mark setMark(Coordinate c, int mark)
pose une marque de valeur mark
dans la cellule
c
,Mark setMark(Coordinate c)
pose la marque par défaut dans la cellule c
.La classe Ocean
fournit également une méthode Mark getMark(Coordinate c)
pour récupérer les marques posées, mais vous n’aurez pas à vous en
servir. Utilisez plutôt les méthodes ciblées, getDirection(...)
et getInteger(...)
,
fournies par la classe Traversal
(voir plus
bas).
Par exemple, pour un ocean
et une cellule c
donnés,
c
représente un mur avec
if (ocean.isWall(c)) { ... }
,c
la marque de valeur 10 en faisant un
appel ocean.setMark(c, 10)
,c
la marque path
— avec
ocean.setMark(c, path)
.L’affichage de l’océan est codé dans le packet graphics
,
dans les classes OceanCanvas
(pour
la partie générique) et BasicOceanCanvas
(pour la partie spécique au maillage carré). Vous n’avez pas à vous
préoccuper de ces classes. Toutefois, vous pouvez exécuter BasicOceanCanvas
si vous le désirez : cela affichera simplement l’image en début d’énoncé
dans une fenêtre. Comme pour la méthode exploreUsing(...)
,
vous pouvez voir l’utilisation de cette classe dans les méthodes
main(...)
que vous trouverez dans les fichiers que vous
allez modifier et dans FindNemo.java
.
Vous allez implémenter plusieurs algorithmes de parcours de l’océan.
Chaque algorithme devra être implémenté dans la méthode traverse(Ocean ocean, Coordinate start)
d’une classe dérivée de la classe abstraite Traversal
(dans le
fichier Traversal.java
). Traversal
est une
classe abstraite puisque cette méthode y est déclarée sans justement
être implémentée. La méthode traverse(...)
est appelée par Ocean.exploreUsing(...)
que nous avons vu ci-dessus. Par ailleurs, la classe Traversal
fournit tous
les éléments nécessaires pour implémenter des parcours de l’océan :
path
et deadEnd
, qui
servent à marquer, respectivement, le chemin vers Nemo lorsqu’il est
retrouvé et les cases qui ont été explorées mais sans qu’elles mènent à
Nemo,static Direction getDirection(Ocean ocean, Coordinate c)
récupère la marque de la cellule c
sous forme d’une
direction,static Integer getInteger(Ocean ocean, Coordinate c)
récupère la marque de la cellule c
sous forme d’un
entier.Ainsi, pour la méthode traverse(Ocean ocean, Coordinate start)
,
la signification des arguments est la suivante :
ocean
est l’océan à explorer,start
est la cellule de départ (la plupart de temps, ce
sera celle où se trouve Marin, mais cela peut être n’importe quelle
cellule).