Skip to content
Snippets Groups Projects
Commit ce56e87c authored by Yanis O's avatar Yanis O
Browse files

[Refac] Changement de la structure du code de génération d'entités de départ

parent f46e527f
No related branches found
No related tags found
No related merge requests found
Pipeline #40622 failed
...@@ -13,14 +13,16 @@ import javafx.stage.Stage; ...@@ -13,14 +13,16 @@ import javafx.stage.Stage;
public class SimulatorApplication extends javafx.application.Application { public class SimulatorApplication extends javafx.application.Application {
private static final String VIEW_RESOURCE_PATH = "/view/view.fxml"; private static final String VIEW_RESOURCE_PATH = "/view/view.fxml";
private static final String APP_NAME = "Firefighter simulator"; private static final String APP_NAME = "Firefighter simulator";
private static final int ROW_COUNT = 20; private static final int ROW_COUNT = 40;
private static final int COLUMN_COUNT = 20; private static final int COLUMN_COUNT = 40;
private static final int BOX_WIDTH = 25; private static final int BOX_WIDTH = 15;
private static final int BOX_HEIGHT = 25; private static final int BOX_HEIGHT = 15;
public static final int INITIAL_FIRE_COUNT = 3; public static final int INITIAL_FIRE_COUNT = 4;
public static final int INITIAL_FIREFIGHTER_COUNT = 6; public static final int INITIAL_FIREFIGHTER_COUNT = 18;
public static final int INITIAL_CLOUD_COUNT = 6; public static final int INITIAL_MOTORIZED_FIREFIGHTER_COUNT = 5;
public static final int INITIAL_MOUNTAIN_COUNT= 30; public static final int INITIAL_CLOUD_COUNT = 9;
public static final int INITIAL_MOUNTAIN_COUNT= 18;
public static final int TURNS_FOR_SPAWNING_AIRTANKER = 8;
private Stage primaryStage; private Stage primaryStage;
private Parent view; private Parent view;
...@@ -47,7 +49,7 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -47,7 +49,7 @@ public class SimulatorApplication extends javafx.application.Application {
view = loader.load(); view = loader.load();
Controller controller = loader.getController(); Controller controller = loader.getController();
controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT, controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT,
INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT, INITIAL_MOUNTAIN_COUNT); INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_MOTORIZED_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT, INITIAL_MOUNTAIN_COUNT, TURNS_FOR_SPAWNING_AIRTANKER);
} }
private void showScene() { private void showScene() {
......
...@@ -3,9 +3,9 @@ package controller; ...@@ -3,9 +3,9 @@ package controller;
import static java.util.Objects.*; import static java.util.Objects.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javafx.animation.Animation; import javafx.animation.Animation;
import javafx.animation.KeyFrame; import javafx.animation.KeyFrame;
...@@ -20,7 +20,13 @@ import javafx.scene.control.ToggleGroup; ...@@ -20,7 +20,13 @@ import javafx.scene.control.ToggleGroup;
import javafx.util.Duration; import javafx.util.Duration;
import javafx.util.Pair; import javafx.util.Pair;
import model.Board; import model.Board;
import model.Cloud;
import model.EntityFactory;
import model.Fire;
import model.FireFighter;
import model.FireFighterScenario; import model.FireFighterScenario;
import model.MotorizedFireFighter;
import model.Mountain;
import model.Square; import model.Square;
import util.Position; import util.Position;
import view.Grid; import view.Grid;
...@@ -119,9 +125,19 @@ public class Controller { ...@@ -119,9 +125,19 @@ public class Controller {
} }
public void initialize(int squareWidth, int squareHeight, int columnCount, public void initialize(int squareWidth, int squareHeight, int columnCount,
int rowCount, int initialFireCount, int initialFirefighterCount, int initialcloudCount, int initialmountaincount) { int rowCount, int initialFireCount, int initialFirefighterCount, int initialMotorizedFirefightersCount, int initialcloudCount, int initialmountaincount, int turnsForSpawningAirTanker) {
grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight); grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
this.setModel(new FireFighterScenario(columnCount, rowCount, initialFireCount, initialFirefighterCount, initialcloudCount, initialmountaincount)); Board<Square> model = new FireFighterScenario(columnCount, rowCount);
Map<EntityFactory, Integer> entityCounts = new HashMap<>();
entityCounts.put((pos, b) -> new Fire(pos), initialFireCount);
entityCounts.put((pos, b) -> new FireFighter(pos, b), initialFirefighterCount);
entityCounts.put((pos, b) -> new MotorizedFireFighter(pos, b), initialMotorizedFirefightersCount);
entityCounts.put((pos, b) -> new Cloud(pos, b), initialcloudCount);
entityCounts.put((pos, b) -> new Mountain(pos), initialmountaincount);
model.placeInitialEntities(entityCounts);
this.setModel(model);
repaintGrid(); repaintGrid();
} }
......
...@@ -16,8 +16,8 @@ public class AirTanker implements Entity{ ...@@ -16,8 +16,8 @@ public class AirTanker implements Entity{
private Position position; private Position position;
private int priority = 3; private int priority = 3;
public AirTanker(Position position, Board<Square> b) { public AirTanker(Position position, Board<Square> b, int age) {
this.age = 0; this.age = age;
this.position = position; this.position = position;
determineDirection(b); determineDirection(b);
extinguish(position,b); extinguish(position,b);
...@@ -41,7 +41,6 @@ public class AirTanker implements Entity{ ...@@ -41,7 +41,6 @@ public class AirTanker implements Entity{
} else if (position.y() == rowCount - 1) { } else if (position.y() == rowCount - 1) {
direction = Direction.NORTH; // Move north if on bottom edge direction = Direction.NORTH; // Move north if on bottom edge
} else { } else {
System.out.println("not on a edge");
// Not on an edge; default to moving east or choose a random direction // Not on an edge; default to moving east or choose a random direction
direction = Direction.EAST; direction = Direction.EAST;
} }
...@@ -49,14 +48,12 @@ public class AirTanker implements Entity{ ...@@ -49,14 +48,12 @@ public class AirTanker implements Entity{
@Override @Override
public List<Position> nextTurn(Board<Square> b) { public List<Position> nextTurn(Board<Square> b) {
List<Position> positions = new ArrayList<>(); List<Position> positions = new ArrayList<>();
// Move in the determined direction // Move in the determined direction
Position nextPos = getNextPosition(position, direction, b); Position nextPos = getNextPosition(position, direction, b);
if (nextPos == null || !b.doesPositionExist(nextPos)) { if (nextPos == null || !b.doesPositionExist(nextPos)) {
// Reached the edge; remove AirTanker from the board // Reached the edge; remove AirTanker from the board
System.out.println("end of airtanker mission");
b.clearCaseFrom(this, position); b.clearCaseFrom(this, position);
positions.add(position); positions.add(position);
return positions; return positions;
...@@ -71,10 +68,6 @@ public class AirTanker implements Entity{ ...@@ -71,10 +68,6 @@ public class AirTanker implements Entity{
b.addEntityAtSquare(this, nextPos); b.addEntityAtSquare(this, nextPos);
positions.add(nextPos); // New position positions.add(nextPos); // New position
// Increment age if needed
this.age++;
return positions; return positions;
} }
} }
...@@ -110,7 +103,6 @@ public class AirTanker implements Entity{ ...@@ -110,7 +103,6 @@ public class AirTanker implements Entity{
break; // Only handling cardinal directions break; // Only handling cardinal directions
} }
Position newPos = new Position(x, y); Position newPos = new Position(x, y);
System.out.println("trying to move to : " + newPos.toString());
if (b.doesPositionExist(newPos)) { if (b.doesPositionExist(newPos)) {
return newPos; return newPos;
} else { } else {
......
package model; package model;
import java.util.List; import java.util.List;
import java.util.Map;
import util.Position; import util.Position;
...@@ -77,7 +78,7 @@ public interface Board<S> { ...@@ -77,7 +78,7 @@ public interface Board<S> {
public boolean doesSquareContainEntity(Position squarePos, Class<?> entityType); public boolean doesSquareContainEntity(Position squarePos, Class<?> entityType);
public void addEntityAtSquare(Entity entity, Position position); public void addEntityAtSquare(Entity entity, Position position);
public void placeInitialEntities(Map<EntityFactory, Integer> entityCounts);
//Return if the position is completely free //Return if the position is completely free
public boolean isPositionEmpty(Position position); public boolean isPositionEmpty(Position position);
......
package model;
import util.Position;
public interface EntityFactory {
Entity create(Position position, Board<Square> board);
}
package model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import util.Position;
public class EntitySpawner {
private final Board<Square> board;
private final Random random = new Random();
public EntitySpawner(Board<Square> board) {
this.board = board;
}
public void spawnEntities(Map<EntityFactory, Integer> entityCounts) {
Map<EntityFactory, Integer> counts = new HashMap<>();
for (EntityFactory factory : entityCounts.keySet()) {
counts.put(factory, 0);
}
int totalEntitiesToPlace = entityCounts.values().stream().mapToInt(Integer::intValue).sum();
int totalEntitiesPlaced = 0;
int chance = 5;
List<Position> positions = generateAllPositions();
while (totalEntitiesPlaced < totalEntitiesToPlace) {
Collections.shuffle(positions);
for (Position pos : positions) {
if (board.getStates(pos).isEmpty()) {
for (EntityFactory factory : entityCounts.keySet()) {
int desiredCount = entityCounts.get(factory);
int currentCount = counts.get(factory);
if (currentCount < desiredCount && random.nextInt(100) < chance) {
Entity entity = factory.create(pos, board);
board.setSquare(new Square(pos, entity));
counts.put(factory, currentCount + 1);
totalEntitiesPlaced++;
if (totalEntitiesPlaced == totalEntitiesToPlace) {
return;
}
break; // Move to the next position
}
}
}
}
// Increase chance after each full traversal
chance = Math.min(chance + 5, 100);
}
}
private List<Position> generateAllPositions() {
List<Position> positions = new ArrayList<>();
for (int x = 0; x < board.rowCount(); x++) {
for (int y = 0; y < board.columnCount(); y++) {
positions.add(new Position(x, y));
}
}
return positions;
}
}
package model; package model;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Random; import java.util.Random;
import util.Matrix; import util.Matrix;
...@@ -15,80 +15,20 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> ...@@ -15,80 +15,20 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
private Matrix<Square> matrix; private Matrix<Square> matrix;
private int step; private int step;
private int initialFireCount; private Map<EntityFactory, Integer> initialMap;
private int initialFireFightersCount;
private int intialCloudCount;
private int initialMoutainCount;
public FireFighterScenario(int columns, int rows, int initialFireCount, int initialFireFightersCount, int initialCloudCount, int initialMoutainCount) { public FireFighterScenario(int columns, int rows) {
this.matrix = new Matrix<Square>(columns, rows); this.matrix = new Matrix<Square>(columns, rows);
this.initialFireCount = initialFireCount;
this.initialFireFightersCount = initialFireFightersCount;
this.intialCloudCount = initialCloudCount;
this.initialMoutainCount = initialMoutainCount;
initScenario(matrix); initScenario(matrix);
placeInitialActors(initialFireCount, initialFireFightersCount, initialCloudCount, initialMoutainCount);
this.step = 0; this.step = 0;
} }
private void placeInitialActors(int initialFireCount, int initialFireFightersCount, int initialCloudCount, int initialMoutainCount) { public void placeInitialEntities(Map<EntityFactory, Integer> entityCounts) {
int fireCount = 0; EntitySpawner spawner = new EntitySpawner(this);
int fireFighterCount = 0; spawner.spawnEntities(entityCounts);
int cloudCount = 0; this.initialMap = entityCounts;
int moutainCount = 0;
int chance = 5; // Chance initiale en pourcentage
Random random = new Random();
List<Position> positions = new ArrayList<>();
for (int x = 0; x < matrix.getRows(); x++) {
for (int y = 0; y < matrix.getColumns(); y++) {
positions.add(new Position(x, y));
}
}
//setSquare(new Square(new Position(0,0), new MotorizedFireFighter(new Position(0,0), this)));
while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount || cloudCount < intialCloudCount) {
Collections.shuffle(positions); // Mélange les positions pour un parcours aléatoire
for (Position pos : positions) {
if (getStates(pos).isEmpty()) {
if (fireCount < initialFireCount && random.nextInt(100) < chance) {
setSquare(new Square(pos, new Fire(pos, 0)));
fireCount++;
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount && moutainCount == initialMoutainCount) {
return;
}
continue;
}
if (fireFighterCount < initialFireFightersCount && random.nextInt(100) < chance) {
setSquare(new Square(pos, new FireFighter(pos, this, 1)));
fireFighterCount++;
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;
}
}
}
}
// Augmente la chance de placement après chaque parcours complet
chance = Math.min(chance + 5, 100); // Ne dépasse pas 100%
}
}
public Square getStates(Position position) { public Square getStates(Position position) {
if (position.x() > matrix.size() || position.y() > matrix.size()) { if (position.x() > matrix.size() || position.y() > matrix.size()) {
...@@ -199,7 +139,7 @@ private void spawnAirTanker(List<Position> changedPositions) { ...@@ -199,7 +139,7 @@ private void spawnAirTanker(List<Position> changedPositions) {
System.out.println("Position: " + position.toString()); System.out.println("Position: " + position.toString());
// Create a new AirTanker // Create a new AirTanker
AirTanker airTanker = new AirTanker(position, this); AirTanker airTanker = new AirTanker(position, this, getStepNumber());
System.out.println(" direction : " + airTanker.getDirection()); System.out.println(" direction : " + airTanker.getDirection());
// Add the AirTanker to the board // Add the AirTanker to the board
addEntityAtSquare(airTanker, position); addEntityAtSquare(airTanker, position);
...@@ -240,7 +180,7 @@ private void spawnAirTanker(List<Position> changedPositions) { ...@@ -240,7 +180,7 @@ private void spawnAirTanker(List<Position> changedPositions) {
step = 0; step = 0;
matrix.clear(); matrix.clear();
initScenario(matrix); initScenario(matrix);
placeInitialActors(initialFireCount, initialFireFightersCount, intialCloudCount, initialMoutainCount); placeInitialEntities(initialMap);
} }
public int stepNumber() { public int stepNumber() {
......
...@@ -23,7 +23,6 @@ public class Mountain implements Entity{ ...@@ -23,7 +23,6 @@ public class Mountain implements Entity{
@Override @Override
public List<Position> nextTurn(Board<Square> board) { public List<Position> nextTurn(Board<Square> board) {
List<Entity> states = board.getStates(position).getEntities();
return List.of(); return List.of();
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment