diff --git a/src/model/Game.java b/src/model/Game.java
index c37c2bd..22c916c 100644
--- a/src/model/Game.java
+++ b/src/model/Game.java
@@ -2,75 +2,188 @@ package model;
import java.util.ArrayList;
import java.util.List;
-import java.util.function.Consumer;
import model.car.Car;
import model.map.Map;
import visual.*;
+/**
+ * {@code Game} représente le cœur du moteur de jeu.
+ */
public class Game {
- public static interface Observer extends Consumer
+ * Les fonctions disponible dans l'interface sont les suivantes:
+ *
+ *
+ *
+ * Il permet de configurer l'ensemble des éléments du jeu avant son lancement : + *
+ */
private static record DashboardConfig(int width, int height, int x, int y) {
+ /**
+ * Initialise un dashboard pour une voiture donnée.
+ *
+ * @param builder le builder utilisé pour ajouter la vue
+ * @param car la voiture associée au dashboard
+ * @param index l'indice de la voiture (utilisé pour le décalage vertical)
+ */
public void initDashboard(Builder builder, Car car, int index) {
- builder.dashboard(car, car.getName(), width, height, x, y + (height * index));
+ builder.dashboard(
+ car,
+ car.getName(),
+ width, height,
+ x, y + (height * index));
}
}
+ /** Liste des voitures participant à la partie */
private final List
+ * Cette méthode :
+ *
+ *
+ *
+ * La partie est considérée comme finie lorsque + * toutes les voitures n'ont plus de carburant. + * + * @return {@code true} si la partie est terminée + */ + private boolean hasEnoughFuel() { for (Game.Observer observer : observers) { - switch (observer) { - case Car car -> { - if (car.getFuel() > 0) - return false; - } - default -> { - } + if (observer instanceof Car car && car.getFuel() > 0) { + return true; } } + return false; + } + /** + * Notifie tous les observers pour un tick. + * + * @return {@code true} si le jeu peut continuer + */ + public boolean notifyObservers() { + for (Observer o : observers) { + if (!o.apply()) { + return false; + } + } return true; } - public void notifyObservers() { - for (Observer o : observers) { - if (!o.apply()) { - System.exit(0); - } - } + /** + * Indique si la partie est terminée. + * + * @return {@code true} si le jeu est terminé + */ + // DOIT ETRE MODIFIÉE SI AJOUT CONDITION DE FIN + private boolean isGameOver() { + return !(hasEnoughFuel()); } + /** + * Notifie tous les observers pour la fin de partie. + */ + public void notifyEnd() { + for (Observer o : observers) { + o.end(); + } + System.exit(0); + } + + /** + * Lance la boucle principale du moteur de jeu. + *
+ * La boucle s'exécute tant que : + *
@@ -131,78 +131,78 @@ public class BasicCar implements Car { * incrémenté et * la position revient à zéro. *
- * - * @param move nombre de positions à avancer - * @return cette même instance (pour chaînage fluide) - */ - private void move() { - int jump = RANDOM.nextInt(state.MIN, state.MAX); - - for (int i = 0; i < jump; i++) { - pos = state.move(pos, movement); - - Point point = map.getPath(pos); - Circuit element = map.getElement(point.x, point.y); - - if (hasAccident(element, jump)) { - setDamage(); - return; + * + * @param move nombre de positions à avancer + * @return cette même instance (pour chaînage fluide) + */ + private void move() { + int jump = RANDOM.nextInt(state.MIN, state.MAX); + + for (int i = 0; i < jump; i++) { + pos = state.move(pos, movement); + + Point point = map.getPath(pos); + Circuit element = map.getElement(point.x, point.y); + + if (hasAccident(element, jump)) { + setDamage(); + return; } round = pos / map.getPathSize(); } } - + private boolean hasAccident(Circuit element, int jump) { return element.isYRoad() && element.getValue() <= jump; } - + /** * Consomme du carburant en fonction de l'état du jeu. - * - * @return cette même instance pour chaînage - */ - public void consumeFuel() { - fuel = state.fuelConsumption(fuel); - if (fuel < 0) - fuel = 0; // sécurité -} - -public boolean hasFinished() { - return 3 < round; -} - -/** - * Exécute une "étape" de la voiture : avance d'une position aléatoire et - * consomme du carburant. - *- * La progression est déterminée par un intervalle aléatoire fourni par l'état - * du jeu. - *
-*/ -@Override -public boolean apply() { - if (state.isDamaged()) { - decreaseDamage(); - } else if (fuel > 0) { - move(); - if (isConsuming) - consumeFuel(); + * + * @return cette même instance pour chaînage + */ + public void consumeFuel() { + fuel = state.fuelConsumption(fuel); + if (fuel < 0) + fuel = 0; // sécurité } - return !hasFinished(); -} -@Override -public void consumption(boolean active) { - isConsuming = active; -} + public boolean finished() { + return 3 < round; + } + + /** + * Exécute une "étape" de la voiture : avance d'une position aléatoire et + * consomme du carburant. + *+ * La progression est déterminée par un intervalle aléatoire fourni par l'état + * du jeu. + *
+ */ + @Override + public boolean apply() { + if (state.isDamaged()) { + decreaseDamage(); + } else if (fuel > 0) { + move(); + if (isConsuming) + consumeFuel(); + } + return !finished(); + } + + @Override + public void consumption(boolean active) { + isConsuming = active; + } @Override public Car remove() { return this; } -@Override -public void reverse(boolean active) { + @Override + public void reverse(boolean active) { movement = (active) ? -1 : 1; } @@ -255,7 +255,17 @@ public void reverse(boolean active) { } @Override - public void accept(Game game) { + public void setup(Game game) { this.map = game.getMap(); } + + @Override + public String toString() { + return "nom: " + NAME + " score: " + getScore(); + } + + @Override + public void end() { + System.out.println(this); + } } diff --git a/src/model/car/CarDecorator.java b/src/model/car/CarDecorator.java index ea985a5..f72cd26 100644 --- a/src/model/car/CarDecorator.java +++ b/src/model/car/CarDecorator.java @@ -77,7 +77,12 @@ public abstract class CarDecorator implements Car { } @Override - public void accept(Game game) { - car.accept(game); + public void setup(Game game) { + car.setup(game); + } + + @Override + public void end() { + car.end(); } } \ No newline at end of file diff --git a/src/visual/GameView.java b/src/visual/GameView.java index 3156c51..edada9f 100644 --- a/src/visual/GameView.java +++ b/src/visual/GameView.java @@ -32,7 +32,7 @@ public abstract class GameView extends JComponent implements Game.Observer { } } - public void accept(Game game) { + public void setup(Game game) { this.game = game; init(game); } @@ -85,4 +85,9 @@ public abstract class GameView extends JComponent implements Game.Observer { public boolean apply() { return (game != null); } + + @Override + public void end() { + frame.dispose(); + } } \ No newline at end of file diff --git a/src/visual/RankboardView.java b/src/visual/RankboardView.java index ab7a426..bfe5ae8 100644 --- a/src/visual/RankboardView.java +++ b/src/visual/RankboardView.java @@ -57,7 +57,8 @@ public class RankboardView extends GameView { * */ private void updateRankText() { - if (cars == null) return; + if (cars == null) + return; // cloner pour de modifier la classe principale List