Table des matières

TD 4 & 5 : Exploration Martienne

Classes abstraites

1) Dans la classe Vehicule, les méthodes distance et getPathTo retournent des valeurs fictives. En réalité, cela ne fait pas de sens d’instancier un objet de la classe Vehicule. Nous allons empêcher cela en définissant la classe Vehicule comme abstraite. Modifiez le code en conséquence.

2) De même, faites en sorte que la classe Sprite soit abstraite.

Organisation du code

Nous commençons à avoir beaucoup de classes et cela devient difficile de s’y retrouver.

1) Créez un package view et déplacer les classes ImageRessource, View et toutes les classes Spritedans le package view.

2) Créez un package model et déplacer les classes en relation avec les véhicules dedans.

Objets immuables

Nous avons mis en évidence dans le deuxième TD des problèmes d’encapsulation avec la classe Position. En réalité, nous n’avons pas besoin de modifier une position existante. En Java, un objet immuable est une instance de classe dont les membres ne peuvent être modifiés après création.

1) Modifier la classe Position pour que les attributs de classe soient final. Ajouter une méthode equals.

2) Java propose maintenant une syntaxe spécifique pour des classes de ce type. Utiliser la syntaxe des Record pour définir la classe Position.

Surface martienne

En réalité, la surface martienne n’est pas aussi lisse que ça.

1) Ajouter une classe SpriteDust () pour afficher des poussières martiennes à quelques endroits sur la grille.

2) Ajouter une classe SpriteRock () pour afficher des rochers martiens à quelques endroits sur la grille.

Vous pouvez ajouter une super classe Sprite dont vont hériter les classes SpriteVehicule et SpriteDecor. La classe Sprite ne prendrait qu’une image dans son constructeur. La classe SpriteVehicule prendrait une image et un véhicule comme paramètre dans son constructeur. La classe SpriteDecor prendrait une image et une position comme paramètre dans son constructeur. Les classes SpriteDust et SpriteRock sont alors des sous-classes de cette classe SpriteDecor.

Modélisons le monde martien

Nous avons positionné des images à certains endroits, mais nous n’avons pas de modèle du terrain. Nous allons représenter le sol martien par un tableau à deux dimensions dont chaque cellule représentera une tuile du terrain.

1) Créez une classe World qui contient un tableau à deux dimensions pour modéliser la surface martienne. Nous utiliserons le codage suivant : 0 indique qu’il n’y a rien, 1 indique la présence d’un rocher et 2 celle de poussières.

public class World {
    public static final int EMPTY = 0;
    public static final int ROCK  = 1;
    public static final int DUST  = 2;

    public World(int width, int height) {
        // À compléter
    }
}

2) Ajoutez les méthodes suivantes dans la classe World.

public int get(Position position) { ... }
public void set(Position position, int kind) { ... }

3) Ajoutez la classe DecorFactory suivante. Pour ce faire, modifiez les classes SpriteRock et SpriteDust pour qu’elles héritent toutes les deux d’une classe SpriteDecor. Modifiez la classe Main pour utiliser cette nouvelle méthode create.

public class DecorFactory {
    public static SpriteDecor create(Position position, int kind) {
        switch (kind) {
            case World.DUST:
                return new SpriteDust(position);
            case World.ROCK:
                return new SpriteRock(position);
            default:
                return null;
        }
    }
}

4) Créez une méthode Position random(int width, int height); dans la classe Position qui retourne une nouvelle position dans l’intervalle passé en argument.

Indications

Pour tirer des nombres aléatoires compris entre 0 et 100, vous devez créer une instance de Random puis invoquer la méthode nextInt comme suit.

Random random = new Random();
int r1 = random.nextInt(100);
int r2 = random.nextInt(100);

5) Ajoutez un constructeur à la classe World qui prendra deux arguments supplémentaires :

Modifiez le code pour ajouter des rochers et des poussières à des positions aléatoires.

6) Nos robots se déplacent librement à la surface de Mars, mais ne devraient pas pouvoir traverser les rochers! Modifiez le code de la méthode getPathTo pour que le robot s’arrête dès qu’il est bloqué par un rocher.

Pour aller plus loin

1) Faire en sorte que nos robots consomment 20% d’énergie en plus lorsqu’ils roulent sur de la poussière.

2) Dessiner les cases accessibles par le robot en fonction de son énergie restante.