diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index 35f5bd1beb70bf8580fcad77a6d1d8462524bcc8..7629eeb1e4853f94cd11a32c4ef743330cce0d61 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -46,7 +46,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); } private void showScene() { diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index f694acf9bee37287cf1267ad3e3594dd740f0e61..ab6b16b32824c1247a65b11529685b27afd7baae 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -122,9 +122,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) { grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight); - this.setModel(new FireFighterScenario(columnCount, rowCount, initialFireCount, initialFirefighterCount)); + this.setModel(new FireFighterScenario(columnCount, rowCount, initialFireCount, initialFirefighterCount, initialcloudCount)); repaintGrid(); } diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java new file mode 100644 index 0000000000000000000000000000000000000000..d953e02aed26027710d3ba02cf51d7eddf536b7d --- /dev/null +++ b/src/main/java/model/Cloud.java @@ -0,0 +1,92 @@ +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; + + + + 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); + Position next_position = adjacentPositions.get(new Random().nextInt(adjacentPositions.size())); + + + + 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, 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; + } +} diff --git a/src/main/java/model/FireFighterScenario.java b/src/main/java/model/FireFighterScenario.java index fadd6bceaf191fdcff9718e321079150929f3be7..7542286945f64dd827829c89014ba4ba193cd1eb 100644 --- a/src/main/java/model/FireFighterScenario.java +++ b/src/main/java/model/FireFighterScenario.java @@ -21,19 +21,22 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> private int initialFireCount; private int initialFireFightersCount; + private int intialCloudCount; - public FireFighterScenario(int columns, int rows, int initialFireCount, int initialFireFightersCount) { + public FireFighterScenario(int columns, int rows, int initialFireCount, int initialFireFightersCount, int initialCloudCount) { this.matrix = new Matrix<Square>(columns, rows); this.initialFireCount = initialFireCount; this.initialFireFightersCount = initialFireFightersCount; + this.intialCloudCount = initialCloudCount; initScenario(matrix); - placeInitialActors(initialFireCount, initialFireFightersCount); + placeInitialActors(initialFireCount, initialFireFightersCount, initialCloudCount); this.step = 0; } - private void placeInitialActors(int initialFireCount, int initialFireFightersCount) { + private void placeInitialActors(int initialFireCount, int initialFireFightersCount, int initialCloudCount) { int fireCount = 0; int fireFighterCount = 0; + int cloudCount = 0; int chance = 5; // Chance initiale en pourcentage Random random = new Random(); List<Position> positions = new ArrayList<>(); @@ -43,7 +46,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) { @@ -51,7 +54,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) { return; } continue; @@ -60,7 +63,15 @@ 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) { + return; + } + } + + if (fireFighterCount < initialFireFightersCount && random.nextInt(100) < chance) { + setSquare(new Square(pos, new Cloud(pos, this, 1))); + cloudCount++; + if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount) { return; } } @@ -187,7 +198,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> step = 0; matrix.clear(); initScenario(matrix); - placeInitialActors(initialFireCount, initialFireFightersCount); + placeInitialActors(initialFireCount, initialFireFightersCount, intialCloudCount); } public int stepNumber() {