package model;
import java.util.Random;
/**
* Car représente une voiture qui avance sur un circuit en boucles.
* Chaque appel à {@link #makeMove()} avance la voiture d'une position.
* Quand la position atteint la fin de la boucle, un nouveau tour est compté.
*/
public class Car implements GObserver
{
/** Ajout de la classe Random (Evite de le recreer a chaque fois) */
private Random rand = new Random();
/** Position actuelle dans la boucle (entre 0 et loop inclus) */
private int pos = 0;
/** Nombre de tours complétés */
private int round = 0;
/** Nombre total de cases dans une boucle (doit être > 0) */
private final int loop;
private final State state;
/** Nombre de fuel restant */
private int fuel = 60;
/**
* Construit une nouvelle voiture.
*
* @param loop nombre de positions par boucle (doit être > 0)
* @throws IllegalArgumentException si {@code loop <= 0}
*/
public Car(int loop, State state)
{
this.state = state;
if (loop <= 0)
throw new IllegalArgumentException("loop must be > 0!");
this.loop = loop;
}
/**
* Fait avancer la voiture d'une position.
*
Si la position atteint la fin de la boucle, un nouveau tour est compté.
* * @return cette même instance (pour chaînage fluide) */ public Car makeMove(int move) { pos += move; if (pos == loop) { round++; pos = 0; } return this; } /** * @return la position actuelle dans la boucle */ public int getPosition() { return pos; } /** * @return le score, calculé comme (nombre de tours + progression du tour) × 100 */ public int getScore() { return (int) ((round + (float) pos / loop) * 100); } /** * @return le nombre de tours complétés */ public int getRound() { return round; } /** * @return la taille de la boucle (nombre de positions) */ public int getLoop() { return loop; } public int getFuel() { return fuel; } public Car consumeFuel() { fuel -= state.getConsumption(); return this; } @Override public boolean apply() { if (this.fuel > 0) { int[] interval = state.getInterval(); int random = rand.nextInt(interval[0], interval[1]); makeMove(random).consumeFuel(); } return true; } /** Retourne l'état de la voiture (State) */ public State getState() { return state; } }