Table des matières

TD 3 : À la découverte de Mars

Drone

Les déplacements de notre robot d’exploration étant contraints, nous allons déployer un drone capable de voler au-dessus de la surface martienne et de se déplacer d’une tuile à une autre en ligne droite, dans un espace euclidien.

1) Créez une classe Drone à l’image de la classe Robot. L’image du drone se trouve déjà dans le dossier resources/images/ du projet.

2) Créez une classe SpriteDrone à l’image de la classe SpriteRobot.

3) Modifiez la classe Main pour instancier un robot et un drone et les afficher à l’écran.

Héritage

Les classes Robot et Drone sont très similaires. Elles partagent les mêmes attributs et les mêmes méthodes. Nous allons supprimer cette duplication de code grâce à l’héritage.

1) Créez une classe Vehicle qui sera la classe mère de Robot et Drone. Nous supposerons que la méthode distance d’un véhicule renvoie 0 et que la méthode getPathTo renvoie null.

2) Modifiez les classes Robot et Drone pour qu’elles héritent de Vehicle. Chacune va définir son constructeur, et redéfinir les méthodes distance et getPathTo qui sont spécifiques.

L’annotation @Override devant une méthode indique que cette méthode est redéfinie. Cette annotation est optionnelle, mais permet de s’assurer qu’il s’agit bien d’une redéfinition et non pas d’une surcharge. Nous vous conseillons de l’utiliser systématiquement.

3) Vous pouvez constater que les classes SpriteRobot et SpriteDrone sont également très similaires. Créez une classe mère Sprite et faites les modifications nécessaires.

Polymorphisme

Le code de la méthode start dans la classe Main devrait contenir quelque chose comme :

view.getPane().setOnMouseClicked(e -> {
    Position target = view.getPosition(e);
    if (robot.canMove(target)) {
        spriteRobot.animateMove(target);
    }
    if (drone.canMove(target)) {
        spriteDrone.animateMove(target);
    }
});

Si nous devons gérer beaucoup de véhicules, le code va vite devenir ingérable. Une solution consiste à créer un tableau de véhicules.

1) Modifiez le code pour instancier un tableau de trois véhicules. Nous allons utiliser deux robots d’exploration (Curiosity et Opportunity) ainsi qu’un drone (Ingenuity)

2) Instanciez un tableau de trois sprites en faisant en sorte que le ième sprite corresponde au sprite du ième véhicule.

3) Simplifier le code dans le gestionnaire d’évènement du clic souris.

Redéfinition de toString

1) Ajoutez la ligne System.out.println("Move completed: " + this); à la fin de la méthode move de Vehicle. Que constatez-vous?

2) Redéfinissez la méthode toString pour que le message affiché ressemble à :

Move completed: Robot Curiosity : energy=460.0
Move completed: Drone Ingenuity : energy=100.0
Move completed: Robot Opportunity : energy=610.0

Indications

Redéfinition de equals

1) Définissez la méthode equals dans la classe position pour pouvoir comparer deux positions entre elles.

2) Créez une classe de test TestPosition avec une méthode main qui instancie deux positions et qui fait une comparaison en affichant un message.

3) Modifiez ensuite la méthode start de la classe Main pour vérifier que la destination est différente de la position actuelle d’un véhicule avant d’essayer de le déplacer. Le message Move completed ne devra s’afficher que lorsqu’un déplacement est réalisé.