diff --git a/src/Main.java b/src/Main.java index b4c05c6..d041a04 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,9 +1,9 @@ import java.awt.Color; -import java.util.List; import model.Game; import model.car.BasicCar; import model.car.DrunkCar; +import model.car.HybridCar; import model.map.Map; public class Main { @@ -22,7 +22,7 @@ public class Main { }); Game game = new Game.Builder() - .car(new BasicCar("Luwik", Color.RED)) + .car(new HybridCar(new BasicCar("Luwik", Color.RED))) .car(new DrunkCar(new BasicCar("Charazade", Color.PINK))) .track("Piste Formule 1", 1000, 500, 1, 1) .rankboard("Score", 200, 200, 0, 510) diff --git a/src/model/Game.java b/src/model/Game.java index a0e109f..fd3f262 100644 --- a/src/model/Game.java +++ b/src/model/Game.java @@ -69,24 +69,18 @@ public class Game { } public Game build() { - Game game = new Game(); + Game game = new Game(this.map, this.time, this.OBSERVERS); - for (Game.Observer observer : this.OBSERVERS) { + for (Game.Observer observer : new ArrayList<>(this.OBSERVERS)) { switch (observer) { case GameView gameView -> { gameView.setGame(game); } - case Car car -> { - car.setMap(map); - } default -> { } } } - game.map = this.map; - game.time = this.time; - game.observers = this.OBSERVERS; return game; } } @@ -104,6 +98,16 @@ public class Game { this.map = map; this.time = time; this.observers = observer; + + for (Game.Observer obs : this.observers) { + switch (obs) { + case Car car -> { + car.setMap(map); + } + default -> { + } + } + } } public Game addObserver(Observer o) { @@ -153,6 +157,7 @@ public class Game { e.printStackTrace(); System.exit(1); } + } public synchronized boolean togglePause() { diff --git a/src/model/car/BasicCar.java b/src/model/car/BasicCar.java index 3369353..dc2e275 100644 --- a/src/model/car/BasicCar.java +++ b/src/model/car/BasicCar.java @@ -134,10 +134,8 @@ public class BasicCar implements Car { * @param move nombre de positions à avancer * @return cette même instance (pour chaînage fluide) */ - @Override public void move() { if (decreaseDamage()) { - System.out.println(NAME + " est en\taccident " + damageRound); return; } @@ -150,7 +148,6 @@ public class BasicCar implements Car { Circuit element = map.getElement(point.x, point.y); if (hasAccident(element, jump)) { - System.out.println(NAME + " a un\taccident"); setDamage(); return; } @@ -167,7 +164,6 @@ public class BasicCar implements Car { * * @return cette même instance pour chaînage */ - @Override public void consumeFuel() { fuel = state.fuelConsumption(fuel); if (fuel < 0) @@ -190,6 +186,7 @@ public class BasicCar implements Car { public boolean apply() { if (fuel > 0) { move(); + consumeFuel(); } return !hasFinished(); } @@ -203,7 +200,7 @@ public class BasicCar implements Car { * @return la position actuelle dans la boucle */ public int getPosition() { - return pos; + return Math.floorMod(pos, map.getPathSize()); } /** diff --git a/src/model/car/Car.java b/src/model/car/Car.java index 2884300..65fd8a0 100644 --- a/src/model/car/Car.java +++ b/src/model/car/Car.java @@ -12,8 +12,6 @@ public interface Car extends Observer { public void move(); - public void consumeFuel(); - public void reverse(boolean active); public Color getColor(); @@ -31,4 +29,6 @@ public interface Car extends Observer { public State getState(); public void setMap(Map map); + + public void consumeFuel(); } diff --git a/src/model/car/CarDecorator.java b/src/model/car/CarDecorator.java index a6a3ae9..09497a2 100644 --- a/src/model/car/CarDecorator.java +++ b/src/model/car/CarDecorator.java @@ -26,16 +26,9 @@ public abstract class CarDecorator implements Car { car.move(); } - @Override - public void consumeFuel() { - car.consumeFuel(); - } - @Override public boolean apply() { - boolean response = car.apply(); - car.consumeFuel(); - return response; + return car.apply(); } @Override @@ -82,4 +75,9 @@ public abstract class CarDecorator implements Car { public void setMap(Map map) { car.setMap(map); } + + @Override + public void consumeFuel() { + car.consumeFuel(); + } } \ No newline at end of file diff --git a/src/model/car/DrunkCar.java b/src/model/car/DrunkCar.java index 8871a57..b2cba16 100644 --- a/src/model/car/DrunkCar.java +++ b/src/model/car/DrunkCar.java @@ -20,13 +20,14 @@ public class DrunkCar extends CarDecorator { public DrunkCar(Car car) { super(car); } - - @Override + // 50% : fait la bonne action, // 50% : fait l'inverse - public void move() { + @Override + public boolean apply() { car.reverse(RANDOM.nextBoolean()); - car.move(); + car.apply(); car.reverse(false); + return true; } } \ No newline at end of file diff --git a/src/model/car/HybridCar.java b/src/model/car/HybridCar.java index db49a20..89a08cc 100644 --- a/src/model/car/HybridCar.java +++ b/src/model/car/HybridCar.java @@ -1,7 +1,5 @@ package model.car; -import java.awt.Color; - /** * HybridCar = décorateur "voiture hybride". * @@ -22,17 +20,22 @@ public class HybridCar extends CarDecorator { return energy; } + // TODO @Override public boolean apply() { - boolean response = car.apply(); + car.move(); + consumeFuel(); + return true; + } + // TODO + @Override + public void consumeFuel() { if (energy > 0) { energy -= 10; } else { car.consumeFuel(); } - - return response; } @Override diff --git a/src/model/car/SoundCar.java b/src/model/car/SoundCar.java index 234ee1c..d3e19c3 100644 --- a/src/model/car/SoundCar.java +++ b/src/model/car/SoundCar.java @@ -1,7 +1,5 @@ package model.car; -import java.awt.Color; - /** * Décorateur Sound : * affiche un message sonore quand la voiture accélère. diff --git a/src/visual/Dashboard.java b/src/visual/Dashboard.java index 970a8f3..7657289 100644 --- a/src/visual/Dashboard.java +++ b/src/visual/Dashboard.java @@ -62,10 +62,12 @@ public class Dashboard extends GameView { this.car = car; if (car != null && game != null) - init(); + init(game); } - private void init() { + @Override + protected void init(Game game) { + super.init(game); // Fond de la fenêtre = couleur de la voiture frame.setBackground(car.getColor()); diff --git a/src/visual/GameView.java b/src/visual/GameView.java index b40fdf7..c07f2b3 100644 --- a/src/visual/GameView.java +++ b/src/visual/GameView.java @@ -34,6 +34,7 @@ public abstract class GameView extends JComponent implements Game.Observer { public void setGame(Game game) { this.game = game; + init(game); } /** diff --git a/src/visual/Rankboard.java b/src/visual/Rankboard.java index 6f47cc5..6839e8c 100644 --- a/src/visual/Rankboard.java +++ b/src/visual/Rankboard.java @@ -57,6 +57,7 @@ public class Rankboard extends GameView { *

*/ private void updateRankText() { + if (cars == null) return; // cloner pour de modifier la classe principale List cars_clone = new ArrayList<>(cars); cars_clone.sort(Comparator.comparingInt(Car::getScore).reversed());