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.
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 Sprite
dans le package view
.
2) Créez un package model
et déplacer les classes en relation avec les véhicules dedans.
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
.
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
.
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.
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 :
percentageRock
: le pourcentage de tuiles contenant un rocher.percentageDust
: le pourcentage de tuiles contenant des poussières.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.
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.