From f2c2585cc08d7447cf7b233495fc2a011177fd47 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20GUEZO?=
- * Chaque cellule possède un type ({@link Cell}) et éventuellement une valeur
- * numérique (par exemple pour indiquer une intensité, une vitesse, ou un identifiant de route).
- * Cell est un enum
- * représentant les différents types de
- * cases qui composent le circuit de
- * course.
- */
- public static enum Cell
- {
- /**
- * Case hors piste, non
- * praticable par les
- * voitures. */
- EMPTY,
-
- /**
- * Case de route normale
- * sur laquelle les voitures
- * peuvent circuler.
- */
- ROAD,
-
- /**
- * Case correspondant à la
- * ligne de départ du circuit.
- */
- START,
-
- /**
- * Case correspondant à la
- * ligne d'arrivée du circuit.
- */
- FINISH,
-
- /**
- * Case de route jaune, plus
- * d'information sur le
- * livrable 2
- */
- YROAD;
- }
-
- /** Type de la cellule (vide, route, départ, arrivée, etc.) */
- private final Cell type;
-
- /** Valeur associée à la cellule (optionnelle, dépend du type) */
- private int value;
-
- /**
- * Construit une cellule avec un type défini et une valeur par défaut
- * égale à l’indice ordinal du type.
- *
- * @param type le type de la cellule
- */
- public Circuit(Cell type)
- {
- this.type = type;
- this.value = type.ordinal();
- }
-
- /**
- * Construit une cellule avec un type et une valeur spécifique.
- *
- * @param type le type de la cellule
- * @param value la valeur associée à la cellule
- */
- public Circuit(Cell type, int value)
- {
- this.type = type;
- this.value = value;
- }
-
- /**
- * Modifie la valeur associée à la cellule.
- *
- * @param value la nouvelle valeur
- * @return cette même instance (pour chaînage fluide)
- */
- public Circuit setValue(int value)
- {
- this.value = value;
- return this;
- }
-
- /**
- * @return le type de la cellule
- */
- public Cell getType()
- {
- return type;
- }
-
- /**
- * @return la valeur associée à la cellule
- */
- public int getValue()
- {
- return value;
- }
-
- /**
- * Vérifie si la cellule est une route (ROAD ou YROAD).
- *
- * @return vrai si la cellule représente une route
- */
- public boolean isRoad()
- {
- return type == Cell.ROAD || type == Cell.YROAD;
- }
-
- /**
- * Vérifie si la cellule est un point de départ.
- *
- * @return vrai si la cellule représente le départ
- */
- public boolean isStart()
- {
- return type == Cell.START;
- }
-
- /**
- * Vérifie si la cellule est un point d’arrivée.
- *
- * @return vrai si la cellule représente la fin du circuit
- */
- public boolean isFinish()
- {
- return type == Cell.FINISH;
- }
-}
\ No newline at end of file
diff --git a/src/GObserver.java b/src/GObserver.java
deleted file mode 100644
index 6ad48c9..0000000
--- a/src/GObserver.java
+++ /dev/null
@@ -1,13 +0,0 @@
-@FunctionalInterface
-/**
- * L'interface utilisée pour Game.
- */
-public interface GObserver
-{
- /**
- *
- * @return true si la fonction s'est bien passé sinon false (le programme va se
- * stopper)
- */
- public boolean apply();
-}
diff --git a/src/Game.java b/src/Game.java
index 266fd54..4648a53 100644
--- a/src/Game.java
+++ b/src/Game.java
@@ -9,19 +9,34 @@ import java.util.ArrayList;
* (pause, boucle de jeu, observateurs).
*
- * Chaque instance contient toutes les informations nécessaires pour créer et positionner + * Chaque instance contient toutes les informations nécessaires pour créer et + * positionner * cette vue à l’écran. *
* @@ -32,13 +47,41 @@ public class Game * @param x la position horizontale (en pixels) de la vue sur l’écran * @param y la position verticale (en pixels) de la vue sur l’écran */ - public record VisualInfo - ( - Class extends GameView> type, - String title, - int width, int height, - int x, int y - ) {} + private record VisualInfo(Class extends GameView> type, + String title, int width, int height, int x, int y) { + } + + public static class GameFactory { + public static Map defaultMap() { + return Map.fromInts(new Integer[][] { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -1, -1, 5, 0 }, + { 0, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 0, 0, -1, 0, 0, -1, 0 }, + { 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0 }, + { 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0 }, + { 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, -1, -1, 2, 0, 0, -1, 0 }, + { 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0 }, + { 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0 }, + { 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -3, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + }); + } + + public static Game defaultGame(Map map) { + return new Game.Builder() + .addCar("Voiture à LUWIK", Color.BLUE) + .addCar("Voiture à CHARAZADE", Color.PINK) + .addCar("Voiture de UPEC", Color.RED) + .addVisual(Dashboard.class, "Voiture à LUWIK", 300, 200, 1000, 0) + .addVisual(Dashboard.class, "Voiture à CHARAZADE", 300, 200, 1000, 200) + .addVisual(Dashboard.class, "Voiture de UPEC", 300, 200, 1000, 400) + .addVisual(Track.class, "Piste Formule 1", 1000, 500, 1, 1) + .addVisual(Rankboard.class, "Score", 200, 200, 0, 510) + .setTime(1000) + .setMap(map) + .build(); + } + } /** * Builder pour créer une instance de {@link Game} de façon fluide. @@ -47,84 +90,80 @@ public class Game * le temps entre les étapes du jeu avant de construire l'objet final. * */ - public static class Builder - { + public static class Builder { /** Liste des voitures à créer pour le jeu */ private ArrayList
@@ -189,17 +225,15 @@ public class Game
* @param carInfos liste des informations des voitures
* @return l'instance de Game
*/
- private Game init(ArrayList
@@ -208,68 +242,62 @@ public class Game
*
* @return true si le jeu est terminé
*/
- private boolean isFinish()
- {
- for (Car car : cars)
- {
+ private boolean isFinish() {
+ for (Car car : cars) {
if (car.getFuel() == 0)
- return true;
+ return true;
}
return false;
}
-
+
/**
* Ajoute un observateur pour recevoir les mises à jour du jeu.
*
* @param o observateur
* @return instance de Game pour chaîner
*/
- public Game addObserver(GObserver o)
- {
+ public Game addObserver(observer o) {
obs.add(o);
return this;
}
-
+
/**
* Supprime un observateur.
*
* @param o observateur
* @return instance de Game pour chaîner
*/
- public Game remObserver(GObserver o)
- {
+ public Game remObserver(observer o) {
obs.remove(o);
return this;
}
-
+
/**
* Bascule l'état de pause du jeu.
*
- * Si le jeu était en pause, il est relancé et les threads en attente sont notifiés.
+ * Si le jeu était en pause, il est relancé et les threads en attente sont
+ * notifiés.
*
@@ -279,21 +307,18 @@ public class Game
*
* @throws InterruptedException si le thread est interrompu pendant wait()
*/
- private void step() throws InterruptedException
- {
- for (Car car : cars)
- {
- synchronized(this)
- {
+ private void step() throws InterruptedException {
+ for (Car car : cars) {
+ synchronized (this) {
while (isPaused)
- wait();
- }
-
+ wait();
+ }
+
car.run();
notifyObservers();
}
}
-
+
/**
* Boucle principale du jeu.
*
@@ -301,46 +326,36 @@ public class Game
* les vues toutes les 'time' millisecondes.
*