diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index f6c0bdffa732d36aec0fe2b895cfcda1fc587948..04dd45ff4d3470ecc1557ba9b9801c769d15415e 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -58,10 +58,10 @@ public class Controller { this.board = requireNonNull(board, "board is null"); } - private void updateBoard(){ + private void updateBoard() { List<Position> updatedPositions = board.updateToNextGeneration(); List<Pair<Position, ViewElement>> updatedSquares = new ArrayList<>(); - for(Position updatedPosition : updatedPositions){ + for (Position updatedPosition : updatedPositions) { Square squareState = board.getStates(updatedPosition); ViewElement viewElement = getViewElement(squareState); updatedSquares.add(new Pair<>(updatedPosition, viewElement)); @@ -70,25 +70,24 @@ public class Controller { updateGenerationLabel(board.stepNumber()); } - private void repaintGrid(){ + private void repaintGrid() { int columnCount = board.columnCount(); int rowCount = board.rowCount(); ViewElement[][] viewElements = new ViewElement[rowCount][columnCount]; - for(int column = 0; column < columnCount; column++) - for(int row = 0; row < rowCount; row++) + for (int column = 0; column < columnCount; column++) + for (int row = 0; row < rowCount; row++) viewElements[row][column] = getViewElement(board.getStates(new Position(row, column))); grid.repaint(viewElements); updateGenerationLabel(board.stepNumber()); } private ViewElement getViewElement(Square square) { - return new ViewElement(square.getViewColor()); + return new ViewElement(square.getViewColor()); } private void initializeTimeline() { Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS); - EventHandler<ActionEvent> eventHandler = - event -> updateBoard(); + EventHandler<ActionEvent> eventHandler = event -> updateBoard(); KeyFrame keyFrame = new KeyFrame(duration, eventHandler); timeline = new Timeline(keyFrame); timeline.setCycleCount(Animation.INDEFINITE); @@ -118,7 +117,7 @@ public class Controller { } public void initialize(int squareWidth, int squareHeight, int columnCount, - int rowCount, int initialFireCount, int initialFirefighterCount) { + int rowCount, int initialFireCount, int initialFirefighterCount) { grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight); this.setModel(new FireFighterScenario(columnCount, rowCount, initialFireCount, initialFirefighterCount)); repaintGrid(); @@ -129,7 +128,7 @@ public class Controller { updateBoard(); } - private void updateGenerationLabel(int value){ + private void updateGenerationLabel(int value) { generationNumberLabel.setText(Integer.toString(value)); } } \ No newline at end of file diff --git a/src/main/java/model/Board.java b/src/main/java/model/Board.java index b9ca3fdf2ee4e6bab091aa3c40deb18394d485f6..b0e448c8012bfe706f1a8d8dcf8b642a1aec6955 100644 --- a/src/main/java/model/Board.java +++ b/src/main/java/model/Board.java @@ -5,7 +5,8 @@ import java.util.List; import util.Position; /** - * This interface represents a generic board for modeling various state-based systems. + * This interface represents a generic board for modeling various state-based + * systems. * * @param <S> The type of state represented on the board. */ @@ -22,7 +23,7 @@ public interface Board<S> { /** * Set the state of a specific position on the board to the specified state. * - * @param state The state to set for the given position. + * @param state The state to set for the given position. * @param position The position on the board for which to set the state. */ void setSquare(S square); @@ -63,12 +64,13 @@ public interface Board<S> { int stepNumber(); public int getStepNumber(); + // Le booléen replaceState permet de forcer le remplacement des cases vides public void setSquare(S square, boolean replaceStates); public boolean doesPositionExist(Position position); - public void clearCase(Position position); + public void clearCaseFrom(Entity entity, Position position); public Position getNearestEntity(Position fromPos, Class<?> entityType); @@ -80,4 +82,3 @@ public interface Board<S> { public void addEntityAtSquare(Entity entity, Position position, boolean replaceStates); } - diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java index 34adf3169dfb57b371aa6db5a32c0d04d3336d5a..65c3fe456a66630864e209db25b2ed38d35ffe2c 100644 --- a/src/main/java/model/Fire.java +++ b/src/main/java/model/Fire.java @@ -1,4 +1,5 @@ package model; + import java.util.ArrayList; import java.util.List; @@ -6,17 +7,19 @@ import javafx.scene.paint.Color; import util.Position; import util.PositionUtil; -public class Fire implements Entity{ +public class Fire implements Entity { Board<Square> b; private Position position; private final Color viewColor = Color.RED; private int age; - public Fire(Position position, Board<Square> b){ + + public Fire(Position position, Board<Square> b) { this.b = b; this.position = position; this.age = 0; } - public Fire(Position position, Board<Square> b, int age){ + + public Fire(Position position, Board<Square> b, int age) { this.b = b; this.position = position; this.age = age; @@ -24,35 +27,34 @@ public class Fire implements Entity{ @Override public List<Position> nextTurn(Board<Square> board) { - if(board.getStepNumber() % 2 == 0)return new ArrayList<Position>(); - List<Position> positions = PositionUtil.generateAdjacentPositions(position, board); - for(Position p : positions){ - if(b.getStates(p).isEmpty()){ - if(b.getStates(p).getMaxAge() < b.getStepNumber() && PositionUtil.getManhattanDistance(position, p) == 1){ + if (board.getStepNumber() % 2 == 0) + return new ArrayList<Position>(); + List<Position> positions = PositionUtil.generateAdjacentPositions(position, board); + for (Position p : positions) { + if (b.getStates(p).isEmpty()) { + if (b.getStates(p).getMaxAge() < b.getStepNumber() + && PositionUtil.getManhattanDistance(position, p) == 1) { board.addEntityAtSquare(new Fire(p, board), p); - } } - if(!b.doesPositionExist(p)){ + if (!b.doesPositionExist(p)) { positions.remove(p); } } return positions; } - - - @Override public void setPosition(Position p) { this.position = p; } + @Override public Position getPosition() { return this.position; } - public Color getViewColor(){ + public Color getViewColor() { return this.viewColor; } @@ -63,8 +65,9 @@ public class Fire implements Entity{ @Override public void incrementAge() { - this.age = age + 1 ; + this.age = age + 1; } + @Override public void setAge(int age) { this.age = age; diff --git a/src/main/java/model/FireFighter.java b/src/main/java/model/FireFighter.java index 83dc27c0434222d93dccbbdfd49defc848857778..4e8a35e927eb440d3ce9d35ce327dfd741e206c5 100644 --- a/src/main/java/model/FireFighter.java +++ b/src/main/java/model/FireFighter.java @@ -1,4 +1,5 @@ package model; + import java.util.ArrayList; import java.util.List; @@ -6,89 +7,90 @@ import javafx.scene.paint.Color; import util.Position; import util.PositionUtil; -public class FireFighter implements Entity{ +public class FireFighter implements Entity { private int age; private Position position; private final Color viewColor = Color.BLUE; - - public FireFighter(Position position, Board<Square> b){ + public FireFighter(Position position, Board<Square> b) { this.position = position; this.age = 0; } - public FireFighter(Position position, Board<Square> b, int age){ + + public FireFighter(Position position, Board<Square> b, int age) { this.position = position; this.age = age; } - + public List<Position> nextTurn(Board<Square> b) { List<Position> positions = new ArrayList<>(); - + // Générer les positions adjacentes List<Position> adjacentPositions = PositionUtil.generateAdjacentPositions(position, b); - + // Vérifier s'il y a du feu dans une des positions adjacentes boolean hasFire = adjacentPositions.stream() - .anyMatch(p -> b.doesSquareContainEntity(p, Fire.class)); - + .anyMatch(p -> b.doesSquareContainEntity(p, Fire.class)); + if (hasFire) { // Si du feu est trouvé, on éteint les feux adjacents positions.addAll(extinguish(adjacentPositions, b)); } else { // Chercher la position du feu le plus proche Position nearestFirePos = b.getNearestEntity(position, Fire.class); - + if (nearestFirePos != null && !nearestFirePos.equals(position)) { // Trouver la meilleure position pour se rapprocher du feu Position nextPos = getNextPositionTowards(position, nearestFirePos, b); if (nextPos != null) { // Mettre à jour la position du pompier - b.clearCase(position); // Vider l'ancienne case + b.clearCaseFrom(this, position); // Vider l'ancienne case positions.add(new Position(position.x(), position.y())); this.position = nextPos; b.addEntityAtSquare(this, nextPos); // Mettre à jour la nouvelle case positions.add(nextPos); adjacentPositions = PositionUtil.generateAdjacentPositions(nextPos, b); positions.addAll(extinguish(adjacentPositions, b)); - } + } // Aucun déplacement possible = le pompier reste sur place } } - + return positions; } - + private List<Position> extinguish(List<Position> adjacentPositions, Board<Square> b) { List<Position> extinguishedPositions = new ArrayList<>(); for (Position p : adjacentPositions) { + extinguishedPositions.addAll(adjacentPositions); 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(age+1); + for (Entity e : entities) { + if (e instanceof EmptyEntity) { + e.setAge(b.stepNumber() + 1); } } extinguishedPositions.add(p); // Ajouter la position où le feu a été éteint - + } return extinguishedPositions; } - + private Position getNextPositionTowards(Position currentPos, Position targetPos, Board<Square> b) { // Générer les 8 positions adjacentes possibles List<Position> possibleMoves = PositionUtil.generateAllAdjacentPositions(currentPos, b); - + // Filtrer les positions qui sont libres possibleMoves.removeIf(p -> !(b.isPositionEmpty(p))); - + // Si aucune position libre n'est disponible, retourner null if (possibleMoves.isEmpty()) { return null; } - + // Calculer la distance actuelle vers la cible int currentDistance = PositionUtil.getManhattanDistance(currentPos, targetPos); - + // Choisir la position libre qui réduit le plus la distance vers le feu Position bestMove = null; int minDistance = currentDistance; @@ -99,16 +101,13 @@ public class FireFighter implements Entity{ bestMove = move; } } - + // Si aucun déplacement ne réduit la distance, annuler le déplacement if (bestMove == null) { return null; } return bestMove; } - - - @Override public void setPosition(Position p) { @@ -119,7 +118,8 @@ public class FireFighter implements Entity{ public Position getPosition() { return this.position; } - public Color getViewColor(){ + + public Color getViewColor() { return this.viewColor; } @@ -127,9 +127,10 @@ public class FireFighter implements Entity{ public int getAge() { return this.age; } + @Override public void incrementAge() { - this.age = age + 1 ; + this.age = age + 1; } @Override diff --git a/src/main/java/model/FireFighterScenario.java b/src/main/java/model/FireFighterScenario.java index dbe7d4203d46ec17a9049ce9b2a6c115981d36cc..7fc6ce9f81869777ef22099dc22f1ebff58b3c45 100644 --- a/src/main/java/model/FireFighterScenario.java +++ b/src/main/java/model/FireFighterScenario.java @@ -40,7 +40,6 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> } while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount) { - System.out.println("aaa"); Collections.shuffle(positions); // Mélange les positions pour un parcours aléatoire for (Position pos : positions) { @@ -122,10 +121,8 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> } @Override - public void clearCase(Position position) { - Square s = new Square(position); - s.addEntity(new EmptyEntity(position, step+1)); - setSquare(s, true); + public void clearCaseFrom(Entity entity, Position position) { + matrix.get(position.x(), position.y()).getEntities().removeIf(element -> element.equals(entity)); } public List<Position> updateToNextGeneration() { @@ -142,14 +139,16 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> if (s.getMaxAge() == step + 1) { continue; } - for (Entity e : s.getEntities()) { + List<Entity> entities = new ArrayList<>(s.getEntities()); + for (Entity e : entities) { List<Position> entityUpdatedPositions = e.nextTurn(this); e.incrementAge(); changedPositions.addAll(entityUpdatedPositions); } } - //matrix.displayMatrix(); + this.step = this.step + 1; + // matrix.displayMatrix(); return changedPositions; } @@ -188,7 +187,6 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> } public int stepNumber() { - this.step = step + 1; return this.step; } @@ -204,11 +202,11 @@ public class FireFighterScenario extends EntityScenario implements Board<Square> @Override public boolean doesSquareContainEntity(Position squarePos, Class<?> entityType) { - return getStates(squarePos).getEntities().stream().anyMatch(entityType::isInstance); - } + return getStates(squarePos).getEntities().stream().anyMatch(entityType::isInstance); + } @Override - public boolean isPositionEmpty(Position position){ + public boolean isPositionEmpty(Position position) { return getStates(position).isEmpty(); } }