feat: ajout commentaire package car

This commit is contained in:
2025-12-19 19:21:56 +01:00
parent eab6f4666f
commit 321fa43666
8 changed files with 402 additions and 161 deletions

View File

@@ -9,42 +9,63 @@ import model.map.Circuit;
import model.map.Map; import model.map.Map;
/** /**
* {@link BasicCar} représente une voiture qui avance sur un circuit en boucles. * {@link BasicCar} représente une voiture basique.
* Chaque appel à {@link #run()} avance la voiture d'une certaine position et *
* fait perdre de l'essence.
* Quand la position atteint la fin de la boucle, un nouveau tour est compté.
* <p> * <p>
* La voiture consomme du carburant à chaque déplacement, et son score * Chaque appel à {@link #apply()} :
* est calculé en fonction du nombre de tours complétés et de sa progression sur * <ul>
* le tour actuel. * <li>fait avancer la voiture selon son état courant</li>
* <li>diminue le carburant</li>
* <li>incrémente le nombre de tours si la voiture a bouclé le circuit</li>
* </ul>
* </p>
*
* <p>
* La voiture peut subir des dégâts ({@link State#DAMAGED}), inverser son sens,
* ou arrêter la consommation de carburant.
* </p> * </p>
*/ */
public class BasicCar implements Car { public class BasicCar implements Car {
/** Générateur de nombres aléatoires pour simuler la progression */ /** Générateur de nombres aléatoires pour simuler la progression */
protected static final Random RANDOM = new Random(); protected static final Random RANDOM = new Random();
/** Couleur de la voiture pour l'affichage */ /** Couleur de la voiture pour l'affichage */
private final Color COLOR; private final Color COLOR;
/** Nom de la voiture */ /** Nom de la voiture */
private final String NAME; private final String NAME;
/** Position actuelle dans la boucle (entre 0 et loop) */ /** Position actuelle dans la boucle (entre 0 et loop) */
private int pos = 0; private int pos = 0;
/** Nombre de tours complétés */ /** Nombre de tours complétés */
private int round = 0; private int round = 0;
/** Nombre de cases dans une boucle (doit être > 0) */
/** Référence à la carte/circuit sur lequel la voiture évolue */
private Map map; private Map map;
/** Carburant restant */ /** Carburant restant */
private int fuel = 60; private int fuel = 60;
/** Multiplicateur pour avancer ou reculer */
private int movement = 1; private int movement = 1;
/** Indique si la voiture consomme du carburant */
private boolean isConsuming = true; private boolean isConsuming = true;
/** État courant de la voiture */
private State state = State.NORMAL;
/** Compteur interne pour la durée d'un état endommagé */
private int damageRound = 0;
/** /**
* Construit une nouvelle voiture. * Construit une nouvelle voiture.
* *
* @param name nom de la voiture * @param name nom de la voiture
* @param color couleur de la voiture * @param color couleur de la voiture
* @param map * @param map carte du circuit
*/ */
public BasicCar(String name, Color color, Map map) { public BasicCar(String name, Color color, Map map) {
this.NAME = name; this.NAME = name;
@@ -52,24 +73,22 @@ public class BasicCar implements Car {
this.map = map; this.map = map;
} }
/**
* Construit une nouvelle voiture.
*
* @param name nom de la voiture
* @param color couleur de la voiture
*
*/
public BasicCar(String name, Color color) { public BasicCar(String name, Color color) {
this.NAME = name; this.NAME = name;
this.COLOR = color; this.COLOR = color;
} }
/** /**
* Référence à l'état du jeu, pour récupérer les paramètres comme la * Diminue le compteur de dégâts à chaque tick et rétablit l'état
* consommation * si nécessaire.
*/ */
private State state = State.NORMAL;
private int damageRound = 0;
public void setDamage() {
damageRound = 5;
state = State.DAMAGED;
}
private void decreaseDamage() { private void decreaseDamage() {
if (state.isDamaged()) { if (state.isDamaged()) {
if (--damageRound <= 0) { if (--damageRound <= 0) {
@@ -83,19 +102,12 @@ public class BasicCar implements Car {
return this; return this;
} }
/**
* Clique sur "Accelerer" : change d'état et retourne un message (si
* nécessaire).
*/
@Override @Override
public String accelerate() { public String accelerate() {
// Si endommagée => l'énoncé dit qu'on ne peut pas bouger
if (state.isDamaged()) { if (state.isDamaged()) {
return "Voiture endommagée : impossible d'accélérer"; return "Voiture endommagée : impossible d'accélérer";
} }
State next = state.accelerate(); State next = state.accelerate();
// Énoncé : en BOOST, si on accélère encore => message "déjà max"
if (state == State.BOOST && next == State.BOOST) { if (state == State.BOOST && next == State.BOOST) {
return "Déjà à la vitesse maximale"; return "Déjà à la vitesse maximale";
} }
@@ -103,41 +115,27 @@ public class BasicCar implements Car {
return ""; return "";
} }
/**
* Clique sur "Rallentir" : change d'état et retourne un message (si
* nécessaire).
*/
@Override @Override
public String decelerate() { public String decelerate() {
if (state.isDamaged()) { if (state.isDamaged()) {
return "Voiture endommagée : impossible de ralentir"; return "Voiture endommagée : impossible de ralentir";
} }
State next = state.decelerate(); State next = state.decelerate();
// Énoncé : en STOPPED, si on ralentit encore => message "déjà arrêtée"
if (state == State.STOPPED && next == State.STOPPED) { if (state == State.STOPPED && next == State.STOPPED) {
return "Déjà arrêtée"; return "Déjà arrêtée";
} }
state = next; state = next;
return ""; return "";
} }
/** /**
* Fait avancer la voiture d'un certain nombre de positions. * Déplace la voiture sur le circuit selon l'état courant.
* <p> * <p>
* Si la position atteint la fin de la boucle, le compteur de tours est * Gère également les accidents et l'incrémentation des tours.
* incrémenté et
* la position revient à zéro.
* </p> * </p>
*
* @param move nombre de positions à avancer
* @return cette même instance (pour chaînage fluide)
*/ */
private void move() { private void move() {
int jump = RANDOM.nextInt(state.MIN, state.MAX); int jump = RANDOM.nextInt(state.MIN, state.MAX);
for (int i = 0; i < jump; i++) { for (int i = 0; i < jump; i++) {
pos = state.move(pos, movement); pos = state.move(pos, movement);
@@ -148,35 +146,32 @@ public class BasicCar implements Car {
setDamage(); setDamage();
return; return;
} }
round = pos / map.getPathSize(); round = pos / map.getPathSize();
} }
} }
/** Vérifie si la voiture subit un accident selon l'élément du circuit */
private boolean hasAccident(Circuit element, int jump) { private boolean hasAccident(Circuit element, int jump) {
return element.isYRoad() && element.getValue() <= jump; return element.isYRoad() && element.getValue() <= jump;
} }
/** /** Consomme du carburant en fonction de l'état courant */
* Consomme du carburant en fonction de l'état du jeu.
*
* @return cette même instance pour chaînage
*/
public void consumeFuel() { public void consumeFuel() {
fuel = state.fuelConsumption(fuel); fuel = state.fuelConsumption(fuel);
if (fuel < 0) if (fuel < 0)
fuel = 0; // sécurité fuel = 0; // sécurité
} }
/** Indique si la voiture a terminé le nombre de tours requis */
public boolean finished() { public boolean finished() {
return 3 < round; return 3 < round;
} }
/** /**
* Exécute une "étape" de la voiture : avance d'une position aléatoire et * Exécute un tick de la voiture.
* consomme du carburant.
* <p> * <p>
* La progression estterminée par un intervalle aléatoire fourni par l'état * Si endommagée, diminue les dégâts. Sinon, avance et consomme du carburant.
* du jeu.
* </p> * </p>
*/ */
@Override @Override
@@ -203,53 +198,52 @@ public class BasicCar implements Car {
@Override @Override
public void reverse(boolean active) { public void reverse(boolean active) {
movement = (active) ? -1 : 1; movement = active ? -1 : 1;
} }
/** /**
* @return la position actuelle dans la boucle * Définit la voiture comme endommagée.
* <p>
* Passe l'état de la voiture à {@link State#DAMAGED} et initialise le
* compteur de tours endommagés.
* </p>
*/ */
public void setDamage() {
damageRound = 5;
state = State.DAMAGED;
}
@Override
public int getPosition() { public int getPosition() {
return Math.floorMod(pos, map.getPathSize()); return Math.floorMod(pos, map.getPathSize());
} }
/** @Override
* @return le score de la voiture, calculé comme :
* (nombre de tours + progression du tour) × 100
*/
public int getScore() { public int getScore() {
return (int) ((round + (float) pos / map.getPathSize()) * 100); return (int) ((round + (float) pos / map.getPathSize()) * 100);
} }
/** @Override
* @return le nombre de tours complétés
*/
public int getRound() { public int getRound() {
return round; return round;
} }
/** @Override
* @return le carburant restant
*/
public int getFuel() { public int getFuel() {
return fuel; return fuel;
} }
/** Retourne l'état courant de la voiture. */ @Override
public State getState() { public State getState() {
return state; return state;
} }
/** @Override
* @return la couleur de la voiture
*/
public Color getColor() { public Color getColor() {
return COLOR; return COLOR;
} }
/** @Override
* @return nom de la voiture
*/
public String getName() { public String getName() {
return NAME; return NAME;
} }

View File

@@ -1,8 +1,11 @@
package model.car; package model.car;
/** /**
* Décorateur Sound : * BoostCar est un décorateur qui améliore la voiture en augmentant
* affiche un message sonore quand la voiture accélère. * sa vitesse de manière temporaire ou permanente selon la logique du jeu.
* <p>
* Il hérite de {@link CarDecorator} et délègue toutes les méthodes à
* la voiture encapsulée sauf celles qu'on veut modifier.
*/ */
public class BoostCar extends CarDecorator { public class BoostCar extends CarDecorator {
public BoostCar(Car car) { public BoostCar(Car car) {

View File

@@ -3,29 +3,92 @@ package model.car;
import java.awt.Color; import java.awt.Color;
import model.Game.Observer; import model.Game.Observer;
/**
* {@link Car} est l'interface représentant une voiture dans le jeu.
*
* <p>
* Elle hérite de {@link Observer} afin de pouvoir être notifiée à chaque tick
* du jeu et participer à la logique principale.
* </p>
*
* <p>
* L'interface définit les actions possibles sur une voiture, ainsi que les
* méthodes pour obtenir son état, sa position, son score, et sa couleur.
* </p>
*/
public interface Car extends Observer { public interface Car extends Observer {
/**
* Accélère la voiture.
* <p>
* Modifie l'état de la voiture selon les règles du {@link State}.
* </p>
* @return message explicatif.
*/
public String accelerate(); public String accelerate();
/**
* Ralentit la voiture.
* <p>
* Modifie l'état de la voiture selon les règles du {@link State}.
* </p>
* @return message explicatif.
*/
public String decelerate(); public String decelerate();
/**
* Active ou désactive le mouvement inversé de la voiture.
*
* @param active true pour inverser la direction, false pour avancer normalement
*/
public void reverse(boolean active); public void reverse(boolean active);
/**
* Active ou désactive la consommation de carburant.
*
* @param active true pour consommer du carburant, false pour ne pas consommer
*/
public void consumption(boolean active); public void consumption(boolean active);
/**
* Supprime ou désactive la voiture (selon l'implémentation).
*
* @return l'instance de la voiture (pour chaînage ou gestion interne)
*/
public Car remove(); public Car remove();
/**
* @return le nom de la voiture
*/
public String getName(); public String getName();
/**
* @return la position actuelle sur le circuit
*/
public int getPosition(); public int getPosition();
/**
* @return le score actuel de la voiture
*/
public int getScore(); public int getScore();
/**
* @return le nombre de tours complétés
*/
public int getRound(); public int getRound();
/**
* @return le carburant restant
*/
public int getFuel(); public int getFuel();
/**
* @return l'état courant de la voiture ({@link State})
*/
public State getState(); public State getState();
/**
* @return la couleur de la voiture pour l'affichage
*/
public Color getColor(); public Color getColor();
} }

View File

@@ -1,12 +1,28 @@
package model.car; package model.car;
import java.awt.Color; import java.awt.Color;
import model.Game; import model.Game;
/**
* {@link CarDecorator} est une classe abstraite servant de base pour
* les décorateurs de voitures.
*
* <p>
* Elle encapsule une voiture existante ({@link Car}) et délègue
* toutes les méthodes à cette voiture. Les sous-classes peuvent
* redéfinir certaines méthodes pour ajouter un comportement
* spécifique (ex. Boost, Drunk, Hybrid).
* </p>
*/
public abstract class CarDecorator implements Car { public abstract class CarDecorator implements Car {
/** La voiture encapsulée à décorer */
protected final Car car; protected final Car car;
/**
* Construit un décorateur autour d'une voiture existante.
*
* @param car la voiture à décorer
*/
public CarDecorator(Car car) { public CarDecorator(Car car) {
this.car = car; this.car = car;
} }

View File

@@ -1,15 +1,16 @@
package model.car; package model.car;
/** /**
* DrunkCar = décorateur "pilote ivre". * DrunkCar est un décorateur simulant un pilote ivre.
* * <p>
* Idée : * Idée :
* - Quand l'utilisateur demande "Accelerer", le pilote peut se tromper * <ul>
* et faire "Rallentir" à la place (au hasard). * <li> Quand l'utilisateur demande "accelerate", il peut se tromper et faire
* - Pareil quand on demande "Rallentir". * "decelerate" à la place (aléatoirement). </li>
* * <li> Pareil pour "decelerate". </li>
* => On modifie seulement les actions utilisateur (accelerate/decelerate), * </ul>
* sans modifier la classe Car. * On ne modifie que le comportement des actions utilisateur, sans toucher
* à la classe de base {@link Car}.
*/ */
public class DrunkCar extends CarDecorator { public class DrunkCar extends CarDecorator {
private boolean reverse = false; private boolean reverse = false;

View File

@@ -1,12 +1,12 @@
package model.car; package model.car;
/** /**
* HybridCar = décorateur "voiture hybride". * HybridCar est un décorateur représentant une voiture hybride.
* * <p>
* Idée : * Idée :
* - La voiture avance à chaque tour * - La voiture avance à chaque tick comme une voiture normale
* - Mais elle consomme du carburant seulement 1 fois sur 2 * - Elle consomme du carburant seulement une fois sur deux, économisant ainsi
* => donc elle économise du carburant. * l'énergie.
*/ */
public class HybridCar extends CarDecorator { public class HybridCar extends CarDecorator {
private int energy = 100; // énergie batterie (0..100) private int energy = 100; // énergie batterie (0..100)
@@ -16,7 +16,6 @@ public class HybridCar extends CarDecorator {
car.consumption(false); car.consumption(false);
} }
/** pour afficher l'énergie dans le Dashboard */
public int getEnergy() { public int getEnergy() {
return energy; return energy;
} }

View File

@@ -7,69 +7,96 @@ import java.util.function.Function;
import model.Game; import model.Game;
/**
* Selection gère la création et la configuration des voitures
* avant le lancement du jeu.
* <p>
* Elle permet :
* - d'ajouter et retirer des voitures,
* - d'ajouter des décorateurs (Hybrid, Drunk, Boost),
* - de lancer le jeu avec les voitures sélectionnées.
* </p>
*/
public class Selection { public class Selection {
/** Builder du jeu associé */
private final Game.Builder gameBuilder; private final Game.Builder gameBuilder;
/** Liste interne des voitures sélectionnées */
private final List<Car> cars = new ArrayList<>(); private final List<Car> cars = new ArrayList<>();
public Game.Builder getGameBuilder() { public Game.Builder getGameBuilder() {
return gameBuilder; return gameBuilder;
} }
/** Constructeur : associe un Builder du jeu */
public Selection(Game.Builder gameBuilder) { public Selection(Game.Builder gameBuilder) {
this.gameBuilder = gameBuilder; this.gameBuilder = gameBuilder;
} }
/** Retourne une copie de la liste des voitures */
public List<Car> getCars() { public List<Car> getCars() {
return new ArrayList<>(cars); return new ArrayList<>(cars);
} }
/** Ajoute une nouvelle voiture basique */
public Car addCar(String name, Color color) { public Car addCar(String name, Color color) {
Car car = new BasicCar(name, color); Car car = new BasicCar(name, color);
cars.add(car); cars.add(car);
return car; return car;
} }
/** Supprime une voiture existante */
public void removeCar(Car car) { public void removeCar(Car car) {
cars.remove(car); cars.remove(car);
} }
/**
* Ajoute un décorateur à une voiture existante.
*
* @param fn fonction de création du décorateur
* @param car voiture à décorer
* @return voiture décorée
*/
private Car addDecorator(Function<Car, Car> fn, Car car) throws IllegalArgumentException { private Car addDecorator(Function<Car, Car> fn, Car car) throws IllegalArgumentException {
int index = cars.indexOf(car); int index = cars.indexOf(car);
if (index < 0) { if (index < 0) {
throw new IllegalArgumentException( throw new IllegalArgumentException("Aucune voiture dans la classe interne.");
"Aucune voiture dans la classe interne.");
} }
car = fn.apply(car); car = fn.apply(car);
cars.set(index, car); cars.set(index, car); // remplace l'ancienne voiture par la décorée
return car; return car;
} }
/** Ajoute un décorateur Hybrid */
public Car addHybridCarDecorator(Car car) throws IllegalArgumentException { public Car addHybridCarDecorator(Car car) throws IllegalArgumentException {
return addDecorator(HybridCar::new, car); return addDecorator(HybridCar::new, car);
} }
/** Ajoute un décorateur Drunk */
public Car addDrunkCarDecorator(Car car) throws IllegalArgumentException { public Car addDrunkCarDecorator(Car car) throws IllegalArgumentException {
return addDecorator(DrunkCar::new, car); return addDecorator(DrunkCar::new, car);
} }
/** Ajoute un décorateur Boost */
public Car addBoostCarDecorator(Car car) throws IllegalArgumentException { public Car addBoostCarDecorator(Car car) throws IllegalArgumentException {
return addDecorator(BoostCar::new, car); return addDecorator(BoostCar::new, car);
} }
/**
* Supprime le décorateur le plus externe d'une voiture
* (retourne la voiture "décorée de base")
*/
public Car removeDecorator(Car car) throws IllegalArgumentException { public Car removeDecorator(Car car) throws IllegalArgumentException {
int index = cars.indexOf(car); int index = cars.indexOf(car);
if (index < 0) { if (index < 0) {
throw new IllegalArgumentException( throw new IllegalArgumentException("Aucune voiture dans la classe interne.");
"Aucune voiture dans la classe interne.");
} }
car = car.remove(); car = car.remove(); // enlève le décorateur le plus externe
cars.set(index, car); cars.set(index, car);
return car; return car;
} }
/** Ajoute toutes les voitures au Builder */
private Game.Builder select() { private Game.Builder select() {
for (Car car : cars) { for (Car car : cars) {
gameBuilder.car(car); gameBuilder.car(car);
@@ -77,10 +104,12 @@ public class Selection {
return gameBuilder; return gameBuilder;
} }
/** Lance le jeu dans un nouveau thread */
public void run() { public void run() {
new Thread(() -> select().build().run()).start(); new Thread(() -> select().build().run()).start();
} }
/** Retourne le nombre de voitures sélectionnées */
public int size() { public int size() {
return cars.size(); return cars.size();
} }

View File

@@ -2,88 +2,171 @@ package model.car;
import java.util.List; import java.util.List;
/**
* {@code State} représente l'état dynamique d'un véhicule.
*
* <p>
* Chaque état définit :
* <ul>
* <li>la consommation de carburant par tour</li>
* <li>l'intervalle de déplacement possible</li>
* <li>le comportement lors d'une accélération ou décélération</li>
* <li>le comportement spécifique en cas de dégâts</li>
* </ul>
*
* <p>
* Ce design correspond au <strong>State Pattern</strong> :
* le comportement du véhicule varie selon son état courant
* sans avoir recours à des conditions {@code if / switch}.
*/
public enum State { public enum State {
/** /**
* L'état NORMAL du Vehicule avance selon un chiffre au alentour de 1 à 6 cases * État NORMAL du véhicule.
* par tour. Il consomme 2 unités de carburant à chaque tour. Si l'on *
* accelere, il passe à l'état BOOST. Si on Rallenti, il passe à l'état LOW. * <p>
* Le véhicule avance d'un nombre aléatoire de cases
* compris entre 1 et 6 inclus.
* Il consomme 2 unités de carburant par tour.
*
* <p>
* Transitions possibles :
* <ul>
* <li>accélération → {@link #BOOST}</li>
* <li>décélération → {@link #LOW}</li>
* </ul>
*/ */
NORMAL(2, 1, 6) { NORMAL(2, 1, 6) {
@Override
public State accelerate() { public State accelerate() {
return BOOST; return BOOST;
} }
@Override
public State decelerate() { public State decelerate() {
return LOW; return LOW;
} }
}, },
/** /**
* L'état BOOST du Vehicule avance selon un chiffre au alentour de 5 à 10 cases * État BOOST du hicule.
* par tour. Il consomme 5 unités de carburant à chaque tour. Si l'on *
* accelere, il reste sur son état et indique un message sur le tableau de bord. * <p>
* Si on Rallenti, il passe à l'état LOW. * Le véhicule avance rapidement (entre 5 et 10 cases).
* Il consomme 5 unités de carburant par tour.
*
* <p>
* Transitions possibles :
* <ul>
* <li>accélération → reste en {@link #BOOST}</li>
* <li>décélération → {@link #NORMAL}</li>
* </ul>
*/ */
BOOST(5, 5, 10) { BOOST(5, 5, 10) {
@Override
public State accelerate() { public State accelerate() {
return this; return this;
} }
@Override
public State decelerate() { public State decelerate() {
return NORMAL; return NORMAL;
} }
}, },
/** /**
* L'état LOW du Vehicule avance selon un chiffre au alentour de 1 à 3 cases * État LOW du véhicule.
* par tour. Il consomme 1 unités de carburant à chaque tour. Si l'on *
* accelere, il passe à l'état NORMAL. Si on Rallenti, il passe à l'état * <p>
* STOPPED. * Le véhicule avance lentement (entre 1 et 3 cases).
* Il consomme 1 unité de carburant par tour.
*
* <p>
* Transitions possibles :
* <ul>
* <li>accélération → {@link #NORMAL}</li>
* <li>décélération → {@link #STOPPED}</li>
* </ul>
*/ */
LOW(1, 1, 3) { LOW(1, 1, 3) {
@Override
public State accelerate() { public State accelerate() {
return NORMAL; return NORMAL;
} }
@Override
public State decelerate() { public State decelerate() {
return STOPPED; return STOPPED;
} }
}, },
/** /**
* L'état STOPPED du Vehicule n'avance pas. Il consomme aucune unités de * État STOPPED du hicule.
* carburant à chaque tour. Si l'on *
* accelere, il passe à l'état LOW. Si on Rallenti, il reste sur son état et * <p>
* indique un message sur le tableau de bord. * Le véhicule est à l'arrêt :
* <ul>
* <li>il n'avance pas</li>
* <li>il ne consomme pas de carburant</li>
* </ul>
*
* <p>
* Transitions possibles :
* <ul>
* <li>accélération → {@link #LOW}</li>
* <li>décélération → reste en {@link #STOPPED}</li>
* </ul>
*/ */
STOPPED(0, 0, 0) { STOPPED(0, 0, 0) {
@Override
public State accelerate() { public State accelerate() {
return LOW; return LOW;
} }
@Override
public State decelerate() { public State decelerate() {
return this; return this;
} }
/**
* Un véhicule arrêté ne se déplace pas.
*/
@Override @Override
public int move(int pos, int jump) { public int move(int pos, int jump) {
return pos; return pos;
} }
/**
* Un véhicule arrêté ne consomme pas de carburant.
*/
@Override @Override
public int fuelConsumption(int fuel) { public int fuelConsumption(int fuel) {
return fuel; return fuel;
} }
}, },
/** /**
* L'état STOPPED du Vehicule n'avance pas. Il consomme aucune unités de * État DAMAGED du hicule.
* carburant à chaque tour. Il reste immobile. *
* <p>
* Le véhicule est endommagé :
* <ul>
* <li>il ne se déplace pas</li>
* <li>il ne consomme pas de carburant</li>
* <li>il ignore les accélérations et décélérations</li>
* </ul>
*
* <p>
* Cet état est temporaire : après réparation,
* le véhicule repasse à l'état {@link #LOW}.
*/ */
DAMAGED(0, 0, 0) { DAMAGED(0, 0, 0) {
@Override
public State accelerate() { public State accelerate() {
return this; return this;
} }
@Override
public State decelerate() { public State decelerate() {
return this; return this;
} }
@@ -108,39 +191,92 @@ public enum State {
return LOW; return LOW;
} }
}; };
// @formatter:on
/* ==========================================================
* Attributs communs à tous les états
* ========================================================== */
/** Consommation de carburant par tour */
public final int FUELCOST; public final int FUELCOST;
/** Borne maximale (exclusive) de déplacement */
public final int MAX; public final int MAX;
/** Borne minimale (inclusive) de déplacement */
public final int MIN; public final int MIN;
/**
* Constructeur interne des états.
*
* @param fuelCost consommation par tour
* @param min déplacement minimal
* @param max déplacement maximal (inclus)
*/
private State(int fuelCost, int min, int max) { private State(int fuelCost, int min, int max) {
this.FUELCOST = fuelCost; this.FUELCOST = fuelCost;
this.MAX = max + 1;
this.MIN = min; this.MIN = min;
this.MAX = max + 1;
} }
/**
* Retourne l'intervalle de déplacement possible pour cet état.
*
* @return liste contenant [MIN, MAX[
*/
public List<Integer> getInterval() { public List<Integer> getInterval() {
return List.of(MIN, MAX); return List.of(MIN, MAX);
} }
/**
* Applique la consommation de carburant.
*
* @param fuel carburant actuel
* @return carburant restant
*/
public int fuelConsumption(int fuel) { public int fuelConsumption(int fuel) {
return fuel - FUELCOST; return fuel - FUELCOST;
} }
/**
* Calcule la nouvelle position du véhicule.
*
* @param pos position actuelle
* @param jump déplacement calculé
* @return nouvelle position
*/
public int move(int pos, int jump) { public int move(int pos, int jump) {
return pos + jump; return pos + jump;
} }
/**
* Indique si l'état correspond à un véhicule endommagé.
*
* @return {@code true} si endommagé, sinon {@code false}
*/
public boolean isDamaged() { public boolean isDamaged() {
return false; return false;
} }
/**
* État à appliquer lorsque les dégâts sont réparés.
*
* @return nouvel état après réparation
*/
public State onDamageEnd() { public State onDamageEnd() {
return this; return this;
} }
/**
* Transition lors d'une accélération.
*
* @return le nouvel état
*/
public abstract State accelerate(); public abstract State accelerate();
/**
* Transition lors d'une décélération.
*
* @return le nouvel état
*/
public abstract State decelerate(); public abstract State decelerate();
} }