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;
+ }
}