From 974fa21c3d6b63bbd7c28d520b35a2bb05a13a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20GUEZO?= Date: Thu, 30 Oct 2025 19:08:56 +0100 Subject: [PATCH] fix: ajout multiple fonction Map / Game / Car --- src/Car.java | 8 ++-- src/Game.java | 109 +++++++++++++++++++++++++++++++++++++++++++------- src/Main.java | 5 ++- src/Map.java | 12 +++--- 4 files changed, 108 insertions(+), 26 deletions(-) diff --git a/src/Car.java b/src/Car.java index c3ff178..f05019f 100644 --- a/src/Car.java +++ b/src/Car.java @@ -35,12 +35,14 @@ public class Car { * * @return cette même instance (pour chaînage fluide) */ - public Car makeMove() + public Car makeMove(int move) { - pos++; + pos += move; if (pos == loop) + { round++; - pos %= (loop + 1); // Repart de 0 après avoir dépassé loop + pos = 0; + } return this; } diff --git a/src/Game.java b/src/Game.java index b8dc83b..4074796 100644 --- a/src/Game.java +++ b/src/Game.java @@ -1,42 +1,121 @@ +import java.util.ArrayList; +import java.util.Random; + public class Game { - private Car[] car; - private Map map; - - public Game(int playerNumber, Map map) + @FunctionalInterface + private static interface GameObserver { - this.car = new Car[playerNumber]; - this.map = map; - - init().run(); + /** + * + * @return true si la fonction s'est bien passé sinon false (le programme va se stopper) + */ + public boolean apply(); } - private Game init() + private static Game game; + + private Car[] cars; + private Map map; + private ArrayList obs = new ArrayList<>(); + + private Random random = new Random(); + private boolean pause = false; + + public static Game create() { + 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 < car.length; i++) + for (int i = 0; i < cars.length; i++) { - car[i] = new Car(loop); + 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()); + } + + return true; + }); } + return this; } + public 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 init(3, Map.fromInts(map)); + } + private boolean isFinish() { - for (int i = 0; i < car.length; i++) + for (Car car : cars) { - if (car[i].getFuel() == 0) + if (car.getFuel() == 0) return true; } return false; } + private synchronized void step() throws InterruptedException + { + // if (pause) wait(); + + for (GameObserver o : obs) + { + if (!o.apply()) + { + System.err.println("Une erreur s'est produite pendant le jeu."); + System.exit(1); + } + } + + } + public void run() { - while (isFinish()) - { + if (this.cars == null || this.map == null) + defaultInit(); + while (!isFinish()) + { + // notifyAll(); + try + { + step(); + Thread.sleep(1000); + } + catch (InterruptedException e) + { e.printStackTrace(); } } } } diff --git a/src/Main.java b/src/Main.java index f7a71af..390fe52 100644 --- a/src/Main.java +++ b/src/Main.java @@ -6,7 +6,8 @@ public class Main { {'9', '#', 'F'}, }); - System.out.println(m.getPathSize()); - Car car = new Car(m.getPathSize()); + Game.create() + .init(3, m) + .run(); } } \ No newline at end of file diff --git a/src/Map.java b/src/Map.java index a407a37..5bfd1b6 100644 --- a/src/Map.java +++ b/src/Map.java @@ -53,9 +53,9 @@ public class Map * Crée une map à partir d'un tableau d'entiers. * * @@ -66,9 +66,9 @@ public class Map { return create((i) -> switch (i) { case 0 -> new Circuit(CircuitCell.EMPTY); - case 1 -> new Circuit(CircuitCell.ROAD); - case 2 -> new Circuit(CircuitCell.START); - case 3 -> new Circuit(CircuitCell.FINISH); + case -1 -> new Circuit(CircuitCell.ROAD); + case -2 -> new Circuit(CircuitCell.START); + case -3 -> new Circuit(CircuitCell.FINISH); default -> new Circuit(CircuitCell.YROAD, i); }, map); }