package model.car; import java.util.List; /** * {@code State} représente l'état dynamique d'un véhicule. * *

* Chaque état définit : *

* *

* Ce design correspond au State Pattern : * le comportement du véhicule varie selon son état courant * sans avoir recours à des conditions {@code if / switch}. */ public enum State { /** * État NORMAL du véhicule. * *

* 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. * *

* Transitions possibles : *

*/ NORMAL(2, 1, 6) { @Override public State accelerate() { return BOOST; } @Override public State decelerate() { return LOW; } }, /** * État BOOST du véhicule. * *

* Le véhicule avance rapidement (entre 5 et 10 cases). * Il consomme 5 unités de carburant par tour. * *

* Transitions possibles : *

*/ BOOST(5, 5, 10) { @Override public State accelerate() { return this; } @Override public State decelerate() { return NORMAL; } }, /** * État LOW du véhicule. * *

* Le véhicule avance lentement (entre 1 et 3 cases). * Il consomme 1 unité de carburant par tour. * *

* Transitions possibles : *

*/ LOW(1, 1, 3) { @Override public State accelerate() { return NORMAL; } @Override public State decelerate() { return STOPPED; } }, /** * État STOPPED du véhicule. * *

* Le véhicule est à l'arrêt : *

* *

* Transitions possibles : *

*/ STOPPED(0, 0, 0) { @Override public State accelerate() { return LOW; } @Override public State decelerate() { return this; } /** * Un véhicule arrêté ne se déplace pas. */ @Override public int move(int pos, int jump) { return pos; } /** * Un véhicule arrêté ne consomme pas de carburant. */ @Override public int fuelConsumption(int fuel) { return fuel; } }, /** * État DAMAGED du véhicule. * *

* Le véhicule est endommagé : *

* *

* Cet état est temporaire : après réparation, * le véhicule repasse à l'état {@link #LOW}. */ DAMAGED(0, 0, 0) { @Override public State accelerate() { return this; } @Override public State decelerate() { return this; } @Override public int move(int pos, int jump) { return pos; } @Override public int fuelConsumption(int fuel) { return fuel; } @Override public boolean isDamaged() { return true; } @Override public State onDamageEnd() { return LOW; } }; /* ========================================================== * Attributs communs à tous les états * ========================================================== */ /** Consommation de carburant par tour */ public final int FUELCOST; /** Borne maximale (exclusive) de déplacement */ public final int MAX; /** Borne minimale (inclusive) de déplacement */ 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) { this.FUELCOST = fuelCost; this.MIN = min; this.MAX = max + 1; } /** * Retourne l'intervalle de déplacement possible pour cet état. * * @return liste contenant [MIN, MAX[ */ public List getInterval() { return List.of(MIN, MAX); } /** * Applique la consommation de carburant. * * @param fuel carburant actuel * @return carburant restant */ public int fuelConsumption(int fuel) { 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) { return pos + jump; } /** * Indique si l'état correspond à un véhicule endommagé. * * @return {@code true} si endommagé, sinon {@code false} */ public boolean isDamaged() { return false; } /** * État à appliquer lorsque les dégâts sont réparés. * * @return nouvel état après réparation */ public State onDamageEnd() { return this; } /** * Transition lors d'une accélération. * * @return le nouvel état */ public abstract State accelerate(); /** * Transition lors d'une décélération. * * @return le nouvel état */ public abstract State decelerate(); }