From 47698c64bc0834830c071b39d3205dfe0e43a847 Mon Sep 17 00:00:00 2001
From: a23022716 <celia.arezki.1@etu.univ-amu.fr>
Date: Fri, 22 Nov 2024 12:17:18 +0100
Subject: [PATCH] correction

---
 .../java/model/BoardFireFighterBehavior.java  | 106 ++++++++++++
 .../model/BoardFirefighterProperties.java     |  65 ++++++++
 src/main/java/model/FirefighterBoard.java     | 151 +++++++-----------
 3 files changed, 225 insertions(+), 97 deletions(-)
 create mode 100644 src/main/java/model/BoardFireFighterBehavior.java
 create mode 100644 src/main/java/model/BoardFirefighterProperties.java

diff --git a/src/main/java/model/BoardFireFighterBehavior.java b/src/main/java/model/BoardFireFighterBehavior.java
new file mode 100644
index 0000000..18e8817
--- /dev/null
+++ b/src/main/java/model/BoardFireFighterBehavior.java
@@ -0,0 +1,106 @@
+package model;
+
+import util.Position;
+import util.TargetStrategy;
+
+import java.util.*;
+
+public class BoardFireFighterBehavior implements BoardBehavior{
+    private final TargetStrategy targetStrategy = new TargetStrategy();
+    private final Map<Position, List<Position>> neighbors;
+    private List<Position> firefighterPositions;
+    private Set<Position> firePositions;
+    private int step;
+
+    public BoardFireFighterBehavior(Map<Position, List<Position>> neighbors) {
+        this.neighbors = neighbors;
+        this.step = 0;
+    }
+
+    public void initializeElements(int initialFireCount, int initialFirefighterCount, int rowCount, int columnCount, Random randomGenerator) {
+        firefighterPositions = new ArrayList<>();
+        firePositions = new HashSet<>();
+        for (int i = 0; i < initialFireCount; i++) {
+            firePositions.add(randomPosition(rowCount, columnCount, randomGenerator));
+        }
+        for (int i = 0; i < initialFirefighterCount; i++) {
+            firefighterPositions.add(randomPosition(rowCount, columnCount, randomGenerator));
+        }
+    }
+
+    private Position randomPosition(int rowCount, int columnCount, Random randomGenerator) {
+        return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
+    }
+
+    public List<Position> updateFires() {
+        List<Position> modifiedPositions = new ArrayList<>();
+        if (step % 2 == 0) {
+            List<Position> newFirePositions = new ArrayList<>();
+            for (Position fire : firePositions) {
+                newFirePositions.addAll(neighbors.get(fire));
+            }
+            firePositions.addAll(newFirePositions);
+            modifiedPositions.addAll(newFirePositions);
+        }
+        return modifiedPositions;
+    }
+
+    public List<Position> updateFirefighters() {
+        List<Position> modifiedPositions = new ArrayList<>();
+        List<Position> newFirefighterPositions = new ArrayList<>();
+        for (Position firefighterPosition : firefighterPositions) {
+            Position newFirefighterPosition = targetStrategy.neighborClosestToFire(firefighterPosition, firePositions, neighbors);
+            newFirefighterPositions.add(newFirefighterPosition);
+            extinguish(newFirefighterPosition);
+            modifiedPositions.add(firefighterPosition);
+            modifiedPositions.add(newFirefighterPosition);
+
+            List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream()
+                    .filter(firePositions::contains).toList();
+            for (Position firePosition : neighborFirePositions) {
+                extinguish(firePosition);
+            }
+            modifiedPositions.addAll(neighborFirePositions);
+        }
+        firefighterPositions = newFirefighterPositions;
+        return modifiedPositions;
+    }
+
+    private void extinguish(Position position) {
+        firePositions.remove(position);
+    }
+
+    public void reset(int step) {
+        this.step = step;
+    }
+
+    public Set<Position> getFirePositions() {
+        return firePositions;
+    }
+
+    public List<Position> getFirefighterPositions() {
+        return firefighterPositions;
+    }
+
+    public void incrementStep() {
+        step++;
+    }
+
+    public int getStep() {
+        return step;
+    }
+    @Override
+    public int stepNumber() {
+        return 0;
+    }
+
+    @Override
+    public List<Position> updateToNextGeneration() {
+        return List.of();
+    }
+
+    @Override
+    public void reset() {
+
+    }
+}
diff --git a/src/main/java/model/BoardFirefighterProperties.java b/src/main/java/model/BoardFirefighterProperties.java
new file mode 100644
index 0000000..efd5b8a
--- /dev/null
+++ b/src/main/java/model/BoardFirefighterProperties.java
@@ -0,0 +1,65 @@
+package model;
+
+import util.Position;
+
+import java.util.List;
+import java.util.Map;
+
+public class BoardFirefighterProperties implements BoardProperties{
+    private final int rowCount;
+    private final int columnCount;
+    private final Position[][] positions;
+    private final Map<Position, List<Position>> neighbors;
+
+    public BoardFirefighterProperties(int rowCount, int columnCount, Map<Position, List<Position>> neighbors) {
+        this.rowCount = rowCount;
+        this.columnCount = columnCount;
+        this.positions = new Position[rowCount][columnCount];
+        this.neighbors = neighbors;
+
+        initializePositions();
+    }
+
+    private void initializePositions() {
+        for (int row = 0; row < rowCount; row++) {
+            for (int column = 0; column < columnCount; column++) {
+                positions[row][column] = new Position(row, column);
+            }
+        }
+    }
+
+    public int getRowCount() {
+        return rowCount;
+    }
+
+    public int getColumnCount() {
+        return columnCount;
+    }
+
+    public Map<Position, List<Position>> getNeighbors() {
+        return neighbors;
+    }
+
+    public Position getPosition(int row, int column) {
+        return positions[row][column];
+    }
+    @Override
+    public int rowCount() {
+        return 0;
+    }
+
+    @Override
+    public int columnCount() {
+        return 0;
+    }
+
+    @Override
+    public List<ModelElement> getState(Position position) {
+        return List.of();
+    }
+
+    @Override
+    public void setState(List<ModelElement> state, Position position) {
+
+    }
+}
diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java
index 6398ec5..2626de0 100644
--- a/src/main/java/model/FirefighterBoard.java
+++ b/src/main/java/model/FirefighterBoard.java
@@ -1,32 +1,41 @@
 package model;
+
 import util.Position;
-import util.TargetStrategy;
 
 import java.util.*;
 
-
 public class FirefighterBoard implements Board<List<ModelElement>> {
-  private final int columnCount;
-  private final int rowCount;
+  private final BoardFireFighterBehavior behavior;
+  private final BoardFirefighterProperties properties;
+
   private final int initialFireCount;
   private final int initialFirefighterCount;
-  private final TargetStrategy targetStrategy = new TargetStrategy();
-  private List<Position> firefighterPositions;
-  private Set<Position> firePositions;
-  private Map<Position, List<Position>> neighbors = new HashMap();
-  private final Position[][] positions;
-  private int step = 0;
   private final Random randomGenerator = new Random();
 
   public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
-    this.columnCount = columnCount;
-    this.rowCount = rowCount;
-    this.positions = new Position[rowCount][columnCount];
-    for (int column = 0; column < columnCount; column++)
-      for (int row = 0; row < rowCount; row++)
+    Map<Position, List<Position>> neighbors = initializeNeighbors(rowCount, columnCount);
+
+    this.properties = new BoardFirefighterProperties(rowCount, columnCount, neighbors);
+    this.behavior = new BoardFireFighterBehavior(neighbors);
+
+    this.initialFireCount = initialFireCount;
+    this.initialFirefighterCount = initialFirefighterCount;
+
+    initializeElements();
+  }
+
+  private Map<Position, List<Position>> initializeNeighbors(int rowCount, int columnCount) {
+    Map<Position, List<Position>> neighbors = new HashMap<>();
+    Position[][] positions = new Position[rowCount][columnCount];
+
+    for (int row = 0; row < rowCount; row++) {
+      for (int column = 0; column < columnCount; column++) {
         positions[row][column] = new Position(row, column);
-    for (int column = 0; column < columnCount; column++)
-      for (int row = 0; row < rowCount; row++) {
+      }
+    }
+
+    for (int row = 0; row < rowCount; row++) {
+      for (int column = 0; column < columnCount; column++) {
         List<Position> list = new ArrayList<>();
         if (row > 0) list.add(positions[row - 1][column]);
         if (column > 0) list.add(positions[row][column - 1]);
@@ -34,114 +43,62 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
         if (column < columnCount - 1) list.add(positions[row][column + 1]);
         neighbors.put(positions[row][column], list);
       }
-    this.initialFireCount = initialFireCount;
-    this.initialFirefighterCount = initialFirefighterCount;
-    initializeElements();
+    }
+    return neighbors;
   }
 
   public void initializeElements() {
-    firefighterPositions = new ArrayList<>();
-    firePositions = new HashSet<>();
-    for (int index = 0; index < initialFireCount; index++)
-      firePositions.add(randomPosition());
-    for (int index = 0; index < initialFirefighterCount; index++)
-      firefighterPositions.add(randomPosition());
-  }
-
-  private Position randomPosition() {
-    return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
+    behavior.initializeElements(initialFireCount, initialFirefighterCount, properties.getRowCount(), properties.getColumnCount(), randomGenerator);
   }
 
   @Override
   public List<ModelElement> getState(Position position) {
     List<ModelElement> result = new ArrayList<>();
-    for (Position firefighterPosition : firefighterPositions)
-      if (firefighterPosition.equals(position))
-        result.add(ModelElement.FIREFIGHTER);
-    if (firePositions.contains(position))
+    if (behavior.getFirePositions().contains(position)) {
       result.add(ModelElement.FIRE);
+    }
+    if (behavior.getFirefighterPositions().contains(position)) {
+      result.add(ModelElement.FIREFIGHTER);
+    }
     return result;
   }
 
   @Override
   public int rowCount() {
-    return rowCount;
+    return properties.getRowCount();
   }
 
   @Override
   public int columnCount() {
-    return columnCount;
-  }
-
-  public List<Position> updateToNextGeneration() {
-    List<Position> modifiedPositions = updateFirefighters();
-    modifiedPositions.addAll(updateFires());
-    step++;
-    return modifiedPositions;
-  }
-
-  private List<Position> updateFires() {
-    List<Position> modifiedPositions = new ArrayList<>();
-    if (step % 2 == 0) {
-      List<Position> newFirePositions = new ArrayList<>();
-      for (Position fire : firePositions) {
-        newFirePositions.addAll(neighbors.get(fire));
-      }
-      firePositions.addAll(newFirePositions);
-      modifiedPositions.addAll(newFirePositions);
-    }
-    return modifiedPositions;
-
+    return properties.getColumnCount();
   }
 
   @Override
-  public int stepNumber() {
-    return step;
+  public void reset() {
+    behavior.reset(0);
+    initializeElements();
   }
 
-  private List<Position> updateFirefighters() {
-    List<Position> modifiedPosition = new ArrayList<>();
-    List<Position> firefighterNewPositions = new ArrayList<>();
-    for (Position firefighterPosition : firefighterPositions) {
-      Position newFirefighterPosition =
-              targetStrategy.neighborClosestToFire(firefighterPosition,
-                      firePositions, neighbors);
-      firefighterNewPositions.add(newFirefighterPosition);
-      extinguish(newFirefighterPosition);
-      modifiedPosition.add(firefighterPosition);
-      modifiedPosition.add(newFirefighterPosition);
-      List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream()
-              .filter(firePositions::contains).toList();
-      for (Position firePosition : neighborFirePositions)
-        extinguish(firePosition);
-      modifiedPosition.addAll(neighborFirePositions);
+  @Override
+  public void setState(List<ModelElement> state, Position position) {
+    if (state.contains(ModelElement.FIRE)) {
+      behavior.getFirePositions().add(position);
+    }
+    if (state.contains(ModelElement.FIREFIGHTER)) {
+      behavior.getFirefighterPositions().add(position);
     }
-    firefighterPositions = firefighterNewPositions;
-    return modifiedPosition;
   }
 
   @Override
-  public void reset() {
-    step = 0;
-    initializeElements();
-  }
-
-  private void extinguish(Position position) {
-    firePositions.remove(position);
+  public List<Position> updateToNextGeneration() {
+    List<Position> modifiedPositions = behavior.updateFirefighters();
+    modifiedPositions.addAll(behavior.updateFires());
+    behavior.incrementStep();
+    return modifiedPositions;
   }
 
-
   @Override
-  public void setState(List<ModelElement> state, Position position) {
-    firePositions.remove(position);
-    for (; ; ) {
-      if (!firefighterPositions.remove(position)) break;
-    }
-    for (ModelElement element : state) {
-      switch (element) {
-        case FIRE -> firePositions.add(position);
-        case FIREFIGHTER -> firefighterPositions.add(position);
-      }
-    }
+  public int stepNumber() {
+    return behavior.getStep();
   }
-}
\ No newline at end of file
+}
-- 
GitLab