Table des matières

TD 2 : Une balade sur Mars

Dans ce TD, nous allons aborder la visualisation graphique de nos robots sur le sol martien. Nous utiliserons un environnement de développement intégré et des outils de compilation avancés.

Prise en main de IntelliJ IDEA et Gradle

Dans les séances à venir, nous allons utiliser IntelliJ IDEA, un Environnement de Développement Intégré (IDE) pour Java. Cet IDE offre des fonctionnalités avancées telles que le refactoring et une intégration transparente avec des outils de gestion de version comme Git. Nous utiliserons également Gradle, un système de gestion et d’automatisation de build pour Java qui permet de gérer les dépendances et de compiler le code.

Il est fortement recommandé de suivre ce tutoriel pour vous familiariser avec IntelliJ et Gradle. Cette initiation doit être réalisée si elle n’a pas été effectuée lors du TD précédent. Vous familiariser avec ces outils dès maintenant vous permettra de tirer le meilleur parti des fonctionnalités qu’ils offrent pour le développement de vos applications Java.

Encapsulation

Nous considérons maintenant que la surface de la planète Mars est divisée en tuiles carrées (quadrillage). Le robot ne peut se déplacer que d’une tuile à une autre. Nous allons pour la suite de ce TD prendre en main une base de code contenant une partie graphique (JavaFX) qui va permettre d’interagir avec notre robot martien. Pour ce faire, téléchargez l’archive suivante : td2-student. Une fois l’archive décompressée, le code est exécutable sans erreur. Il est fortement conseillé de prendre le temps de lire les autres classes.

1) Exécutez le code contenu dans cette archive et repérez graphiquement votre robot.

2) Modifiez la visibilité des attributs x et y dans la classe Position. Que constatez-vous alors?

3) Ajoutez dans la classe Position les méthodes getX() et getY() permettant de récupérer respectivement l’abscisse et l’ordonnée de la position. À noter que ces méthodes ne permettent pas de modifier les attributs, mais fournissent simplement un moyen de récupérer l’information.

4) Modifiez le code pour utiliser ces méthodes.

5) Ajoutez les méthodes suivantes dans la classe Position vues lors du TD précédent.

void translate(int dx, int dy) { ... }
void translate(int delta) { ... } 

Modificateur d’accès des méthodes

Actuellement, nos méthodes n’ont pas de modificateurs d’accès. Modifiez votre programme pour que les méthodes de la classe Position soient publiques.

Déplacements sur Mars

1) Dans la classe Main après l’instanciation du robot, ajoutez la ligne position.translate(10); puis exécuter à nouveau le code. Que constatez-vous ?

2) Comment peut-on rendre le robot indépendant de la variable position contenu dans la méthode start de la classe Main?

3) Proposez une solution en modifiant le constructeur de Robot.

4) Dans la classe Robot, ajoutez une méthode getPosition qui retourne la position courante du robot.

5) Remplacez maintenant la ligne position.translate(10); par robot.getPosition().translate(10); puis exécuter à nouveau le code. Que constatez-vous ?

6) Faites les modifications nécessaires dans la classe Robot.

7) Nous fournissons une classe de test permettant de vérifier que l’implémentation de getPosition est correct. Ajouter le fichier TestRobot dans votre projet. Pour lancer les tests, il suffit de faire un clic droit sur le fichier et Run.

8) La classe SpriteRobot est chargée de l’affichage graphique du robot. La classe Robot ne contient que la modélisation du robot, indépendamment de sa représentation graphique. Implémentez les méthodes de la classe Robot, à l’exception de la méthode getPathTo que nous verrons dans la partie suivante.

9) Testez votre code afin que lors d’un clic de la souris sur une tuile de la surface martienne, le robot se déplace s’il dispose de suffisamment d’énergie pour atteindre la cible.

Animation du déplacement

Notre robot est oactuellement capable de se déplacer instantanément, ce qui n’est pas très réaliste ! Nous allons créer une animation graphique pour visualiser le déplacement entre la position source et la position cible. Nous utilisons pour cela le code de la méthode animateMove de la classe SpriteRobot. Comme vous pouvez le constater, cette méthode utilise la méthode getPathTo de la classe Robot. Cette méthode renvoie un tableau de positions sur lesquelles le robot doit se rendre pour atteindre la cible (à l’exception de la position source).

1) Implémentez la méthode getPathTo. Le robot se déplace d’abord horizontalement, puis verticalement. Le chemin comprendra au maximum deux positions.

2) Améliorez le code de votre méthode pour que le déplacement se fasse en escalier. Le robot doit alterner entre déplacements horizontaux et verticaux, de longueur 1. Le dernier déplacement est soit horizontal, soit vertical et de longueur supérieure ou égale à 1.

3) Que se passe-t-il lorsqu’un clic de souris est effectué sur une tuile de la surface martienne alors que le robot est encore en train de se déplacer?

4) Assurez-vous que le robot ne puisse accepter de nouvel ordre de déplacement que lorsqu’il a terminé le déplacement en cours.

Pour aller plus loin

1) Faire en sorte que l’image du robot soit toujours orientée dans le sens du déplacement.

3) Utiliser l’algorithme de Bresenham pour optimiser la longueur de vos marches