diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index 86abb8525b4a41c5a54cea60981c01025d5ae3f8..0b2081cdd9186f46454e0c82ac0bce3ce81f5769 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -13,15 +13,18 @@ import javafx.stage.Stage; public class SimulatorApplication extends javafx.application.Application { private static final String VIEW_RESOURCE_PATH = "/view/view.fxml"; private static final String APP_NAME = "Firefighter simulator"; - private static final int ROW_COUNT = 20; - private static final int COLUMN_COUNT = 20; + private static final int ROW_COUNT = 22; + private static final int COLUMN_COUNT = 22; private static final int BOX_WIDTH = 25; private static final int BOX_HEIGHT = 25; public static final int INITIAL_FIRE_COUNT = 3; public static final int INITIAL_FIREFIGHTER_COUNT = 6; + public static final int INITIAL_CLOUD_COUNT = 6; + public static final int INITIAL_MOUNTAIN_COUNT= 30; private Stage primaryStage; private Parent view; + private void initializePrimaryStage(Stage primaryStage) { this.primaryStage = primaryStage; this.primaryStage.setTitle(APP_NAME); @@ -44,7 +47,7 @@ public class SimulatorApplication extends javafx.application.Application { view = loader.load(); Controller controller = loader.getController(); controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT, - INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT); + INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT, INITIAL_MOUNTAIN_COUNT); } private void showScene() { diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 04dd45ff4d3470ecc1557ba9b9801c769d15415e..577ca8297d2ffe2d263bb10fdcf88a74a17bcd09 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -5,6 +5,8 @@ import static java.util.Objects.*; import java.util.ArrayList; import java.util.List; + + import javafx.animation.Animation; import javafx.animation.KeyFrame; import javafx.animation.Timeline; @@ -117,9 +119,9 @@ public class Controller { } public void initialize(int squareWidth, int squareHeight, int columnCount, - int rowCount, int initialFireCount, int initialFirefighterCount) { + int rowCount, int initialFireCount, int initialFirefighterCount, int initialcloudCount, int initialmountaincount) { grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight); - this.setModel(new FireFighterScenario(columnCount, rowCount, initialFireCount, initialFirefighterCount)); + this.setModel(new FireFighterScenario(columnCount, rowCount, initialFireCount, initialFirefighterCount, initialcloudCount, initialmountaincount)); repaintGrid(); } diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java new file mode 100644 index 0000000000000000000000000000000000000000..52ad4a1846097b7cb9a99325dd94ccbdd77761e9 --- /dev/null +++ b/src/main/java/model/Cloud.java @@ -0,0 +1,104 @@ +package model; + +import javafx.geometry.Pos; +import javafx.scene.paint.Color; +import util.Position; +import util.PositionUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class Cloud implements Entity{ + private int age; + private Position position; + private final Color viewColor = Color.GREEN; + private final int priority = 3; + + + + public Cloud(Position position, Board<Square> b){ + this.age = 0; + this.position = position; + + } + + public Cloud(Position position, Board<Square> b, int age){ + this.age = age; + this.position = position; + + } + + @Override + public List<Position> nextTurn(Board<Square> b) { + List<Position> adjacentPositions = PositionUtil.generateAdjacentPositions(position, b); + adjacentPositions.removeIf( p -> b.doesSquareContainEntity(p, Cloud.class)); + adjacentPositions.removeIf( p -> b.doesSquareContainEntity(p, Mountain.class)); + + // Filtrer pour obtenir uniquement les positions qui ne contiennent pas de pompier + adjacentPositions.removeIf(p -> b.doesSquareContainEntity(p, FireFighter.class)); + + // Choisir une position aléatoire parmi les mouvements possibles + Position next_position = adjacentPositions.get(new Random().nextInt(adjacentPositions.size())); + + // Si la nouvelle position contient un feu, éteindre le feu + if (b.getStates(next_position).getEntities().stream().anyMatch(element -> element instanceof Fire) ){ + extinguish(next_position, b); + } + + Position old_position = this.position; + this.position = next_position; + b.addEntityAtSquare(this, next_position); + b.clearCaseFrom(this, old_position); + + return List.of(old_position, this.position); + } + + + private Position extinguish(Position p, Board<Square> b) { + b.getStates(p).getEntities().removeIf(element -> element instanceof Fire); + List<Entity> entities = b.getStates(p).getEntities(); + for (Entity e : entities) { + if (e instanceof EmptyEntity) { + e.setAge(b.stepNumber() + 1); + } + } + + return p; + } + + @Override + public Position getPosition() { + return this.position; + } + + @Override + public void setPosition(Position p) { + this.position = p; + } + + @Override + public int getAge() { + return age; + } + + @Override + public void setAge(int age) { + this.age =age; + } + + @Override + public void incrementAge() { + this.age += 1; + + } + + @Override + public Color getViewColor() { + return this.viewColor; + } + + @Override + public int getPriority(){ return this.priority;} + +} diff --git a/src/main/java/model/EmptyEntity.java b/src/main/java/model/EmptyEntity.java index 6a916b89c626b4a0fcbdda433592f07a0cb2050a..69ce92772341497e5da5e6605d9bbff936996bcd 100644 --- a/src/main/java/model/EmptyEntity.java +++ b/src/main/java/model/EmptyEntity.java @@ -8,7 +8,7 @@ import util.Position; public class EmptyEntity implements Entity{ - + private final int priority=3; private Position position; private int age; public EmptyEntity(Position position){ @@ -55,5 +55,8 @@ public class EmptyEntity implements Entity{ public Color getViewColor() { return Color.WHITE; } + + @Override + public int getPriority(){return this.priority;} } \ No newline at end of file diff --git a/src/main/java/model/EmptySquare.java b/src/main/java/model/EmptySquare.java new file mode 100644 index 0000000000000000000000000000000000000000..aa7c5dee8d7e942ccf67ca63824c71531e237947 --- /dev/null +++ b/src/main/java/model/EmptySquare.java @@ -0,0 +1,64 @@ +package model; + +import java.util.ArrayList; +import java.util.List; + +import javafx.scene.paint.Color; +import util.Position; + +public class EmptySquare implements Entity { + + private Position position; + private final Color viewColor = Color.WHITE; + private int age; + private final int priotity = 0; + + public EmptySquare(Position p) { + this.position = p; + this.age = -999; + } + + public EmptySquare(Position p, int age) { + this.position = p; + this.age = age; + } + + @Override + public List<Position> nextTurn(Board<Square> board) { + return new ArrayList<Position>(); + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public void setPosition(Position p) { + this.position = p; + } + + public Color getViewColor() { + return this.viewColor; + } + + @Override + public int getAge() { + return this.age; + } + + @Override + public void incrementAge() { + age = age + 1; + } + + @Override + public void setAge(int age) { + this.age = age; + } + + @Override + public int getPriority(){ + return this.priotity; + } +} diff --git a/src/main/java/model/Entity.java b/src/main/java/model/Entity.java index a14b34a525698fa52e5d472ccbc57764f78b9435..3270ae89da793de0e332c5802f70d4f60b88c933 100644 --- a/src/main/java/model/Entity.java +++ b/src/main/java/model/Entity.java @@ -5,6 +5,7 @@ import java.util.List; import javafx.scene.paint.Color; import util.Position; + public interface Entity { /** * Exécute un tour de jeu, en vérifiant les cases adjacentes pour des instances de Fire. @@ -19,4 +20,5 @@ public interface Entity { public void setAge(int age); public void incrementAge(); public Color getViewColor(); + public int getPriority(); } diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java index 90b9636c8a5f4301af411e291a34e834ed0806cf..3bb763e26843898c634ea8ee3ade0af9963c9316 100644 --- a/src/main/java/model/Fire.java +++ b/src/main/java/model/Fire.java @@ -6,12 +6,14 @@ import java.util.List; import javafx.scene.paint.Color; import util.Position; import util.PositionUtil; +import util.PositionUtil; public class Fire implements Entity { Board<Square> b; private Position position; private final Color viewColor = Color.RED; private int age; + private final int priority = 0; public Fire(Position position, Board<Square> b) { this.b = b; @@ -34,8 +36,9 @@ public class Fire implements Entity { return new ArrayList<Position>(); } List<Position> positions = PositionUtil.generateAdjacentPositions(position, board); + positions.removeIf( p -> b.doesSquareContainEntity(p, Mountain.class)); for (Position p : positions) { - if (b.getStates(p).isEmpty()) { + if (b.getStates(p).isEmpty() && !b.getStates(p).getEntities().contains(Cloud.class)) { if (b.getStates(p).getMaxAge() < b.getStepNumber() && PositionUtil.getManhattanDistance(position, p) == 1) { board.addEntityAtSquare(new Fire(p, board), p); @@ -76,4 +79,7 @@ public class Fire implements Entity { public void setAge(int age) { this.age = age; } + + @Override + public int getPriority(){ return this.priority;} } diff --git a/src/main/java/model/FireFighter.java b/src/main/java/model/FireFighter.java index 4e8a35e927eb440d3ce9d35ce327dfd741e206c5..e206765c44f675019cb90fc054c926e0d36e170c 100644 --- a/src/main/java/model/FireFighter.java +++ b/src/main/java/model/FireFighter.java @@ -1,16 +1,15 @@ package model; +import java.util.*; +import javafx.scene.paint.Color; +import util.*; -import java.util.ArrayList; -import java.util.List; -import javafx.scene.paint.Color; -import util.Position; -import util.PositionUtil; public class FireFighter implements Entity { private int age; private Position position; private final Color viewColor = Color.BLUE; + private final int priority = 1; public FireFighter(Position position, Board<Square> b) { this.position = position; @@ -27,6 +26,7 @@ public class FireFighter implements Entity { // Générer les positions adjacentes List<Position> adjacentPositions = PositionUtil.generateAdjacentPositions(position, b); + adjacentPositions.removeIf( p -> b.doesSquareContainEntity(p, Mountain.class)); // Vérifier s'il y a du feu dans une des positions adjacentes boolean hasFire = adjacentPositions.stream() @@ -137,4 +137,6 @@ public class FireFighter implements Entity { public void setAge(int age) { this.age = age; } + public int getPriority(){ return this.priority;} + } diff --git a/src/main/java/model/FireFighterScenario.java b/src/main/java/model/FireFighterScenario.java index 547f543001aa02f794db3bb8d17ec0f2dac16cf9..d0dc3442a2c61acd65e3da672de76834715d6cac 100644 --- a/src/main/java/model/FireFighterScenario.java +++ b/src/main/java/model/FireFighterScenario.java @@ -3,12 +3,16 @@ package model; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; +import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Random; +import java.util.Random; import util.Matrix; import util.Position; import util.PositionUtil; +import util.PositionUtil; public class FireFighterScenario extends EntityScenario implements Board<Square> { @@ -17,19 +21,25 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> private int initialFireCount; private int initialFireFightersCount; + private int intialCloudCount; + private int initialMoutainCount; - public FireFighterScenario(int columns, int rows, int initialFireCount, int initialFireFightersCount) { + public FireFighterScenario(int columns, int rows, int initialFireCount, int initialFireFightersCount, int initialCloudCount, int initialMoutainCount) { this.matrix = new Matrix<Square>(columns, rows); this.initialFireCount = initialFireCount; this.initialFireFightersCount = initialFireFightersCount; + this.intialCloudCount = initialCloudCount; + this.initialMoutainCount = initialMoutainCount; initScenario(matrix); - placeInitialActors(initialFireCount, initialFireFightersCount); + placeInitialActors(initialFireCount, initialFireFightersCount, initialCloudCount, initialMoutainCount); this.step = 0; } - private void placeInitialActors(int initialFireCount, int initialFireFightersCount) { + private void placeInitialActors(int initialFireCount, int initialFireFightersCount, int initialCloudCount, int initialMoutainCount) { int fireCount = 0; int fireFighterCount = 0; + int cloudCount = 0; + int moutainCount = 0; int chance = 5; // Chance initiale en pourcentage Random random = new Random(); List<Position> positions = new ArrayList<>(); @@ -39,7 +49,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> } } - while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount) { + while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount || cloudCount < intialCloudCount) { Collections.shuffle(positions); // Mélange les positions pour un parcours aléatoire for (Position pos : positions) { @@ -47,7 +57,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> if (fireCount < initialFireCount && random.nextInt(100) < chance) { setSquare(new Square(pos, new Fire(pos, this, 1))); fireCount++; - if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) { + if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount && moutainCount == initialMoutainCount) { return; } continue; @@ -56,7 +66,23 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> if (fireFighterCount < initialFireFightersCount && random.nextInt(100) < chance) { setSquare(new Square(pos, new FireFighter(pos, this, 1))); fireFighterCount++; - if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) { + if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount && moutainCount == initialMoutainCount) { + return; + } + } + + if (cloudCount < intialCloudCount && random.nextInt(100) < chance) { + setSquare(new Square(pos, new Cloud(pos, this, 1))); + cloudCount++; + if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount && moutainCount == initialMoutainCount) { + return; + } + } + + if (moutainCount < initialMoutainCount && random.nextInt(100) < chance) { + setSquare(new Square(pos, new Mountain(pos, 1))); + moutainCount++; + if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount && moutainCount == initialMoutainCount) { return; } } @@ -182,7 +208,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> step = 0; matrix.clear(); initScenario(matrix); - placeInitialActors(initialFireCount, initialFireFightersCount); + placeInitialActors(initialFireCount, initialFireFightersCount, intialCloudCount, initialMoutainCount); } public int stepNumber() { diff --git a/src/main/java/model/Mountain.java b/src/main/java/model/Mountain.java new file mode 100644 index 0000000000000000000000000000000000000000..4962526a16a524ccd8b34c9b934e3263a69362a0 --- /dev/null +++ b/src/main/java/model/Mountain.java @@ -0,0 +1,64 @@ +package model; + +import javafx.scene.paint.Color; +import util.Position; + +import java.util.List; + +public class Mountain implements Entity{ + private final int priority = 3; + Position position; + private int age; + private final Color viewColor = Color.YELLOW; + + public Mountain(Position p ){ + this.position = p; + } + + + public Mountain(Position p , int age){ + this.position = p; + this.age = age; + } + + @Override + public List<Position> nextTurn(Board<Square> board) { + return List.of(); + } + + @Override + public Position getPosition() { + return this.position; + } + + @Override + public void setPosition(Position p) { + this.position = p; + + } + + @Override + public int getAge() { + return this.age; + } + + @Override + public void setAge(int age) { + this.age = age; + } + + @Override + public void incrementAge() { + this.age += 1; + } + + @Override + public Color getViewColor() { + return this.viewColor; + } + + @Override + public int getPriority() { + return this.priority; + } +} diff --git a/src/main/java/model/Scenario.java b/src/main/java/model/Scenario.java index d491a6542975411890741666160ca88246e544ea..03d319a9325df2547e011ba58d5243e34f116b13 100644 --- a/src/main/java/model/Scenario.java +++ b/src/main/java/model/Scenario.java @@ -4,4 +4,5 @@ import util.Matrix; public interface Scenario { public void initScenario(Matrix<Square> matrix); -} + +} \ No newline at end of file diff --git a/src/main/java/model/Square.java b/src/main/java/model/Square.java index cdd616d8778e532772c5821122a4d975dc1ef4d5..779884b2442587710d96ef24ee0c867502f0f369 100644 --- a/src/main/java/model/Square.java +++ b/src/main/java/model/Square.java @@ -77,6 +77,9 @@ public class Square { for (Entity e : entities) { Color color = e.getViewColor(); if (color != null) { + if(sumRed == 255 & sumGreen == 255 & sumBlue == 255){ + continue; + } sumRed += color.getRed(); sumGreen += color.getGreen(); sumBlue += color.getBlue(); diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 4c36d97709b342e457203c75d081fc5cc1955c0f..1bd3e9a86156ea98b4650fee627b4411b90ff3fd 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -2,7 +2,8 @@ module firefighter { requires javafx.controls; requires javafx.fxml; requires javafx.graphics; - opens controller to javafx.fxml; + requires java.sql; + opens controller to javafx.fxml; exports app; opens app to javafx.fxml; } diff --git a/src/main/java/util/Matrix.java b/src/main/java/util/Matrix.java index 5bbccfa13e21061d30fd50baf111cacdff888d67..9fb77030ffe0228fcba57d442f8611bc6c8f42ad 100644 --- a/src/main/java/util/Matrix.java +++ b/src/main/java/util/Matrix.java @@ -1,5 +1,6 @@ package util; + import java.util.ArrayList; import java.util.Iterator; import java.util.NoSuchElementException;