Files
racing-game/model/Car.java
2025-11-06 20:29:58 +01:00

119 lines
2.6 KiB
Java
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package model;
import java.util.Random;
/**
* <code>Car</code> 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.
* <p>Si la position atteint la fin de la boucle, un nouveau tour est compté.</p>
*
* @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;
}
}