From d2847745baa9ff348abd0fc8884037a6cc2ddf8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20GUEZO?= Date: Wed, 5 Nov 2025 20:23:57 +0100 Subject: [PATCH] feat: ajout impl Car et rework State et Game --- src/Car.java | 33 +++++++-- src/GFactory.java | 20 ------ src/GObserver.java | 13 ++++ src/Game.java | 164 ++++++++++++++++++++++----------------------- src/Main.java | 10 ++- src/State.java | 46 ++++++------- 6 files changed, 149 insertions(+), 137 deletions(-) delete mode 100644 src/GFactory.java create mode 100644 src/GObserver.java diff --git a/src/Car.java b/src/Car.java index f05019f..1ac630f 100644 --- a/src/Car.java +++ b/src/Car.java @@ -1,18 +1,24 @@ +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 { - +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; @@ -22,8 +28,10 @@ public class Car { * @param loop nombre de positions par boucle (doit être > 0) * @throws IllegalArgumentException si {@code loop <= 0} */ - public Car(int loop) + public Car(int loop, State state) { + this.state = state; + if (loop <= 0) throw new IllegalArgumentException("loop must be > 0!"); this.loop = loop; @@ -85,7 +93,20 @@ public class Car { public Car consumeFuel() { - fuel -= State.get().getConsumption(); + 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; + } } \ No newline at end of file diff --git a/src/GFactory.java b/src/GFactory.java deleted file mode 100644 index 8621a7c..0000000 --- a/src/GFactory.java +++ /dev/null @@ -1,20 +0,0 @@ -public class GFactory -{ - public static Game defaultInit() - { - Integer[][] map = 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 }, - }; - return Game.getInstance().init(3, Map.fromInts(map)); - } - -} diff --git a/src/GObserver.java b/src/GObserver.java new file mode 100644 index 0000000..cb2e4f6 --- /dev/null +++ b/src/GObserver.java @@ -0,0 +1,13 @@ +@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(); +} \ No newline at end of file diff --git a/src/Game.java b/src/Game.java index ee2aa99..64519e8 100644 --- a/src/Game.java +++ b/src/Game.java @@ -1,73 +1,79 @@ import java.util.ArrayList; -import java.util.Random; public class Game { - @FunctionalInterface - private static interface GameObserver + private boolean paused; + private Car[] cars; + private Map map; + + public static class Builder { - /** - * - * @return true si la fonction s'est bien passé sinon false (le programme va se stopper) - */ - public boolean apply(); - } + private int pnumber = 3; + private Map map = null; + private State state = new State(); - private static Game game; - - private Car[] cars; - private Map map; - private ArrayList obs = new ArrayList<>(); - - private Random random = new Random(); - private boolean paused = false; - - public static Game getInstance() - { - if (game == null) game = new Game(); - return game; - } - - private Game() {} - - public Game init(int playerNumber, Map map) - { - this.cars = new Car[playerNumber]; - this.map = map; - // combien de route avant loop - int loop = this.map.getPathSize(); - for (int i = 0; i < cars.length; i++) + public Builder setPlayers(int pnumber) { - final Car CAR = new Car(loop); - final int I = i; - cars[i] = CAR; - - // Observer pour avancer - obs.add(() -> { - if (CAR.getFuel() > 0) - { - int[] interval = State.get().getInterval(); - int rand = random.nextInt(interval[0], interval[1]); - - CAR.makeMove(rand).consumeFuel(); - System.out.println("car " + I + " score: " + CAR.getScore() + " random: " + rand); - } - - return true; - }); + this.pnumber = pnumber; + return this; + } + + public Builder setMap(Map map) + { + this.map = map; + return this; + } + + public Builder setState(State s) + { + this.state = s; + return this; + } + + public Builder defaultMap() + { + Integer[][] map = 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 }, + }; + + this.map = Map.fromInts(map); + return this; + } + + public Game build() + { + if (map == null) defaultMap(); + return new Game(pnumber, map, state); } - - return this; } - - public void addObserver(GameObserver game) + + private ArrayList obs; + + public Game(int pnumber, Map map, State state) { - obs.add(game); - } + int loop = map.getPathSize(); + this.map = map; - public void removeObserver(GameObserver game) - { - obs.remove(game); + cars = new Car[pnumber]; + obs = new ArrayList<>(); + + for (int i = 0; i < pnumber; i++) + { + Car car = new Car(loop, state); + cars[i] = car; + // Observer pour avancer + obs.add(car); + } } private boolean isFinish() @@ -80,9 +86,16 @@ public class Game return false; } + public synchronized boolean togglePause() + { + if (paused) notifyAll(); + paused = !paused; + return paused; + } + private void step() throws InterruptedException { - for (GameObserver o : obs) + for (GObserver o : obs) { synchronized (this) { @@ -91,37 +104,18 @@ public class Game { wait(); } - - boolean isSuccess = o.apply(); - if (!isSuccess) - { - System.err.println("Une erreur s'est produite pendant le jeu."); - System.exit(1); - } + } + boolean isSuccess = o.apply(); + if (!isSuccess) + { + System.err.println("Une erreur s'est produite pendant le jeu."); + System.exit(1); } } - - } - - public synchronized boolean togglePause() - { - if (paused) - { - notifyAll(); - paused = false; - } - else paused = true; - return paused; } public void run() { - if (this.cars == null || this.map == null) - { - System.out.println("Lancement du init par défaut."); - GFactory.defaultInit(); - } - while (!isFinish()) { try diff --git a/src/Main.java b/src/Main.java index 049c432..c95ad42 100644 --- a/src/Main.java +++ b/src/Main.java @@ -6,6 +6,11 @@ public class Main { {'9', '#', 'F'}, }); + Game game = new Game.Builder() + .setMap(m) + .setPlayers(3) + .build(); + Thread t = new Thread(() -> { int i = 0; while (i++ < 10) @@ -18,12 +23,11 @@ public class Main { { e.printStackTrace(); } - System.out.println(Game.getInstance().togglePause() ? "stop" : "fini" ); + System.out.println(game.togglePause() ? "stop" : "fini" ); } }); t.start(); - Game.getInstance() - .run(); + game.run(); } } \ No newline at end of file diff --git a/src/State.java b/src/State.java index 315f069..148d39a 100644 --- a/src/State.java +++ b/src/State.java @@ -5,35 +5,35 @@ public class State // NORMAL(2, 1, 6); - private int carbUsed; - private int[] interval; + public int carbUsed; + public int[] interval; private DriveMode(int carbUsed, int fInterval, int sInterval) { - this.carbUsed = carbUsed; - interval = new int[] {fInterval, sInterval}; - } - - public int getConsumption() - { - return carbUsed; - } - - public int[] getInterval() - { - return interval; + this.carbUsed = carbUsed; + interval = new int[] {fInterval, sInterval}; } } - private static DriveMode current = DriveMode.NORMAL; + private DriveMode current = DriveMode.NORMAL; - public static DriveMode get() - { - return current; - } + public DriveMode get() + { + return current; + } - public static void set(DriveMode DriveMode) - { - current = DriveMode; - } + public int[] getInterval() + { + return current.interval; + } + + public int getConsumption() + { + return current.carbUsed; + } + + public void set(DriveMode DriveMode) + { + current = DriveMode; + } }