diff --git a/.gradle/8.4/checksums/checksums.lock b/.gradle/8.4/checksums/checksums.lock
index fd7ac3b6a738f01bf77b5ff78013c34a51e23dc9..687f4f2689f36141e55132a03a06f37ea20d28c3 100644
Binary files a/.gradle/8.4/checksums/checksums.lock and b/.gradle/8.4/checksums/checksums.lock differ
diff --git a/.gradle/8.4/checksums/md5-checksums.bin b/.gradle/8.4/checksums/md5-checksums.bin
index 20ecb22ad4851fd079addcb6c12124b0f5737318..8c03806985ac6e3e9759c9dafd4f5fbe741086e0 100644
Binary files a/.gradle/8.4/checksums/md5-checksums.bin and b/.gradle/8.4/checksums/md5-checksums.bin differ
diff --git a/.gradle/8.4/checksums/sha1-checksums.bin b/.gradle/8.4/checksums/sha1-checksums.bin
index abb1d0193715746820008a24f65141ca7e19ad62..cb6d5a21a59a742866df2474925984a3d6e5f40d 100644
Binary files a/.gradle/8.4/checksums/sha1-checksums.bin and b/.gradle/8.4/checksums/sha1-checksums.bin differ
diff --git a/.gradle/8.4/dependencies-accessors/dependencies-accessors.lock b/.gradle/8.4/dependencies-accessors/dependencies-accessors.lock
index 5ef2939589a88791a8553f37175c2cedbad524df..c150f374e8350fdc4d0b480b32e0bc156ecdb4f0 100644
Binary files a/.gradle/8.4/dependencies-accessors/dependencies-accessors.lock and b/.gradle/8.4/dependencies-accessors/dependencies-accessors.lock differ
diff --git a/.gradle/8.4/executionHistory/executionHistory.bin b/.gradle/8.4/executionHistory/executionHistory.bin
index 0d4a8ebf59ea742fee1e92e4b9d30ed8d7c71793..14de053e2be6fbb2ca7891822fcb1d5eb3ead8d2 100644
Binary files a/.gradle/8.4/executionHistory/executionHistory.bin and b/.gradle/8.4/executionHistory/executionHistory.bin differ
diff --git a/.gradle/8.4/executionHistory/executionHistory.lock b/.gradle/8.4/executionHistory/executionHistory.lock
index cb6fba4af0b9e6e4d7e385c629de6caea9941218..c87fcc9349a2ef81dfe68895e7011b540ebe0730 100644
Binary files a/.gradle/8.4/executionHistory/executionHistory.lock and b/.gradle/8.4/executionHistory/executionHistory.lock differ
diff --git a/.gradle/8.4/fileHashes/fileHashes.bin b/.gradle/8.4/fileHashes/fileHashes.bin
index 40582fde45f8a5bf38d11963cb946a56796f4e80..ee1911fe5301189769c38cd829c3ffe30c08f0a9 100644
Binary files a/.gradle/8.4/fileHashes/fileHashes.bin and b/.gradle/8.4/fileHashes/fileHashes.bin differ
diff --git a/.gradle/8.4/fileHashes/fileHashes.lock b/.gradle/8.4/fileHashes/fileHashes.lock
index af3a067a1f25d796969477742a0edeab7d7a1fc5..a6b915a90cb046cfc12791a367d93eeb30bd8cf0 100644
Binary files a/.gradle/8.4/fileHashes/fileHashes.lock and b/.gradle/8.4/fileHashes/fileHashes.lock differ
diff --git a/.gradle/8.4/fileHashes/resourceHashesCache.bin b/.gradle/8.4/fileHashes/resourceHashesCache.bin
index 8f977fbd3de0680e252dceb47eef58553089896d..6cd79388e76bb5f34544f1b41604251d8437dcb1 100644
Binary files a/.gradle/8.4/fileHashes/resourceHashesCache.bin and b/.gradle/8.4/fileHashes/resourceHashesCache.bin differ
diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock
index 1064ef65391d6dc53282a8ba25be825d7b72ed47..7903126a0dcdbfde39041e8a6de5812e36679bf7 100644
Binary files a/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ
diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties
index a5079eb7d8dbdb6c5d4311eb4b547d167fd748f7..90154715c19ffcb4cfd832c6c62fcfe3c445afac 100644
--- a/.gradle/buildOutputCleanup/cache.properties
+++ b/.gradle/buildOutputCleanup/cache.properties
@@ -1,2 +1,2 @@
-#Thu Nov 09 10:27:52 CET 2023
+#Mon Nov 13 20:29:54 CET 2023
 gradle.version=8.4
diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin
index b52382e1ea9a4b561468112b8df7504d0a8cab34..9950dc5e73e58206fe7f141e701e984fedcc0ab0 100644
Binary files a/.gradle/buildOutputCleanup/outputFiles.bin and b/.gradle/buildOutputCleanup/outputFiles.bin differ
diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe
new file mode 100644
index 0000000000000000000000000000000000000000..e2a27b4fa137df29ad7ad2b30eb568a77facaacd
Binary files /dev/null and b/.gradle/file-system.probe differ
diff --git a/build/classes/java/main/app/SimulatorApplication.class b/build/classes/java/main/app/SimulatorApplication.class
index b20b834ef489ed0cfcf6f12e7993b40632a049e9..2792d63b92517bb76234c95f54d1ac8669770999 100644
Binary files a/build/classes/java/main/app/SimulatorApplication.class and b/build/classes/java/main/app/SimulatorApplication.class differ
diff --git a/build/classes/java/main/controller/Controller.class b/build/classes/java/main/controller/Controller.class
index 408d092cf56a29ba8a5a3b62eaff45c69e64478e..74013efab5e05f9243deca053906751ea238f241 100644
Binary files a/build/classes/java/main/controller/Controller.class and b/build/classes/java/main/controller/Controller.class differ
diff --git a/build/classes/java/main/model/Board.class b/build/classes/java/main/model/Board.class
index 964278193ef90b7d61ea16d7819580a1bc368733..a78d2b182c87683650b0972590097ab4611719be 100644
Binary files a/build/classes/java/main/model/Board.class and b/build/classes/java/main/model/Board.class differ
diff --git a/build/classes/java/main/model/BoardElement.class b/build/classes/java/main/model/BoardElement.class
index e6407e3436efd6f66cef461a3057ddad781ec1ef..b7da37d481527392ebf91688895cc27b0ede2413 100644
Binary files a/build/classes/java/main/model/BoardElement.class and b/build/classes/java/main/model/BoardElement.class differ
diff --git a/build/classes/java/main/model/Builder/ConcreteGameBuilder.class b/build/classes/java/main/model/Builder/ConcreteGameBuilder.class
new file mode 100644
index 0000000000000000000000000000000000000000..66850dd8e50d617a3da2c6c02c18f71cdc9daec6
Binary files /dev/null and b/build/classes/java/main/model/Builder/ConcreteGameBuilder.class differ
diff --git a/build/classes/java/main/model/Builder/GameBuilder.class b/build/classes/java/main/model/Builder/GameBuilder.class
new file mode 100644
index 0000000000000000000000000000000000000000..6b7721744a4ab2dbde7979ff7263e54e46fac025
Binary files /dev/null and b/build/classes/java/main/model/Builder/GameBuilder.class differ
diff --git a/build/classes/java/main/model/Builder/GameManage.class b/build/classes/java/main/model/Builder/GameManage.class
new file mode 100644
index 0000000000000000000000000000000000000000..af3536b151a408b96923e5356e098c9e646509d4
Binary files /dev/null and b/build/classes/java/main/model/Builder/GameManage.class differ
diff --git a/build/classes/java/main/model/EmptyElement.class b/build/classes/java/main/model/EmptyElement.class
index 1b4302dfb07e50dd922bb3bfc0397dd9181191c2..5069ea14ef0a85701717a0b7537a043f6dcdd4af 100644
Binary files a/build/classes/java/main/model/EmptyElement.class and b/build/classes/java/main/model/EmptyElement.class differ
diff --git a/build/classes/java/main/model/ExtinguishFire/Cloud.class b/build/classes/java/main/model/ExtinguishFire/Cloud.class
index 9de56c2328937cd36048ec37406dc9240e0c39b7..dd940b0174a4a149abcf9599d409366672fda4e4 100644
Binary files a/build/classes/java/main/model/ExtinguishFire/Cloud.class and b/build/classes/java/main/model/ExtinguishFire/Cloud.class differ
diff --git a/build/classes/java/main/model/ExtinguishFire/ExtinguishFire.class b/build/classes/java/main/model/ExtinguishFire/ExtinguishFire.class
index 08283af2f289a834db27ad5290c80428d2d17016..a4d622e74ad0dac8a1e1ee24f055fadd19df68df 100644
Binary files a/build/classes/java/main/model/ExtinguishFire/ExtinguishFire.class and b/build/classes/java/main/model/ExtinguishFire/ExtinguishFire.class differ
diff --git a/build/classes/java/main/model/ExtinguishFire/FireFighter.class b/build/classes/java/main/model/ExtinguishFire/FireFighter.class
index ef5f30ff2197eb4fae3cd0571d46d41d2ace1ba5..02776eb6f209146e6f2de1891a6ecafbc4aa688a 100644
Binary files a/build/classes/java/main/model/ExtinguishFire/FireFighter.class and b/build/classes/java/main/model/ExtinguishFire/FireFighter.class differ
diff --git a/build/classes/java/main/model/Flammable/Fire.class b/build/classes/java/main/model/Flammable/Fire.class
index 54c22d9aa466d3b1562090fce45b0f280f3518b3..c26b25067e3470b44d70d004d5f4c57388352c7a 100644
Binary files a/build/classes/java/main/model/Flammable/Fire.class and b/build/classes/java/main/model/Flammable/Fire.class differ
diff --git a/build/classes/java/main/model/Flammable/Flammable.class b/build/classes/java/main/model/Flammable/Flammable.class
index fe96542831296a4c3aaf59973ade237c17d4a0a6..bf120cd5de3e083cfef4bb7079bfbbbd2f05fb97 100644
Binary files a/build/classes/java/main/model/Flammable/Flammable.class and b/build/classes/java/main/model/Flammable/Flammable.class differ
diff --git a/build/classes/java/main/model/GameBoard.class b/build/classes/java/main/model/GameBoard.class
index dc92f4792309c5d900468d456582f61f1497b80e..9a2ab100b7a3ff1b6282d6ac48938001da2a7bdb 100644
Binary files a/build/classes/java/main/model/GameBoard.class and b/build/classes/java/main/model/GameBoard.class differ
diff --git a/build/classes/java/main/model/Visitor/CrossMountain.class b/build/classes/java/main/model/Visitor/CrossMountain.class
index ddbfddb8f7cee6c257ddbd45252852a741b3db40..69f63f7cd3d38ef2cee410a9416eee60dd7cfd4f 100644
Binary files a/build/classes/java/main/model/Visitor/CrossMountain.class and b/build/classes/java/main/model/Visitor/CrossMountain.class differ
diff --git a/build/classes/java/main/model/Visitor/CrossRoad.class b/build/classes/java/main/model/Visitor/CrossRoad.class
index ee0df02352663a36d691bb3081a31d94c5028c0d..6846553e8ac3d3e4fee6d99e85266f45c4b7a798 100644
Binary files a/build/classes/java/main/model/Visitor/CrossRoad.class and b/build/classes/java/main/model/Visitor/CrossRoad.class differ
diff --git a/build/classes/java/main/model/Visitor/FireFinder.class b/build/classes/java/main/model/Visitor/FireFinder.class
index 05ddcb141f461b8f1e4f42cb7b2c32083b234b7f..3eee0b6a9e0b6ef841b3a41e019f5871a34211a8 100644
Binary files a/build/classes/java/main/model/Visitor/FireFinder.class and b/build/classes/java/main/model/Visitor/FireFinder.class differ
diff --git a/build/classes/java/main/model/Visitor/Visitor.class b/build/classes/java/main/model/Visitor/Visitor.class
index d9ae8e3a8a6375c074840b3b24e35ce02a6d6b1e..6bda2c96ed0d078985d77b993144828ec7de1b9c 100644
Binary files a/build/classes/java/main/model/Visitor/Visitor.class and b/build/classes/java/main/model/Visitor/Visitor.class differ
diff --git a/build/classes/java/main/module-info.class b/build/classes/java/main/module-info.class
index 7a769b70875d147512dd0dc3f725d1c113981548..228b8be064ecf35c69bb788937ce7ff8ab50174e 100644
Binary files a/build/classes/java/main/module-info.class and b/build/classes/java/main/module-info.class differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/BoardElement.class.uniqueId13 b/build/tmp/compileJava/compileTransaction/stash-dir/BoardElement.class.uniqueId13
new file mode 100644
index 0000000000000000000000000000000000000000..b7da37d481527392ebf91688895cc27b0ede2413
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/BoardElement.class.uniqueId13 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Controller.class.uniqueId6 b/build/tmp/compileJava/compileTransaction/stash-dir/Controller.class.uniqueId6
new file mode 100644
index 0000000000000000000000000000000000000000..74013efab5e05f9243deca053906751ea238f241
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/Controller.class.uniqueId6 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/CrossMountain.class.uniqueId9 b/build/tmp/compileJava/compileTransaction/stash-dir/CrossMountain.class.uniqueId9
new file mode 100644
index 0000000000000000000000000000000000000000..69f63f7cd3d38ef2cee410a9416eee60dd7cfd4f
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/CrossMountain.class.uniqueId9 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/CrossRoad.class.uniqueId2 b/build/tmp/compileJava/compileTransaction/stash-dir/CrossRoad.class.uniqueId2
new file mode 100644
index 0000000000000000000000000000000000000000..6846553e8ac3d3e4fee6d99e85266f45c4b7a798
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/CrossRoad.class.uniqueId2 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/EmptyElement.class.uniqueId8 b/build/tmp/compileJava/compileTransaction/stash-dir/EmptyElement.class.uniqueId8
new file mode 100644
index 0000000000000000000000000000000000000000..5069ea14ef0a85701717a0b7537a043f6dcdd4af
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/EmptyElement.class.uniqueId8 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/ExtinguishFire.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/ExtinguishFire.class.uniqueId0
index 08283af2f289a834db27ad5290c80428d2d17016..a4d622e74ad0dac8a1e1ee24f055fadd19df68df 100644
Binary files a/build/tmp/compileJava/compileTransaction/stash-dir/ExtinguishFire.class.uniqueId0 and b/build/tmp/compileJava/compileTransaction/stash-dir/ExtinguishFire.class.uniqueId0 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Fire.class.uniqueId7 b/build/tmp/compileJava/compileTransaction/stash-dir/Fire.class.uniqueId7
new file mode 100644
index 0000000000000000000000000000000000000000..c26b25067e3470b44d70d004d5f4c57388352c7a
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/Fire.class.uniqueId7 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FireFighter.class.uniqueId12 b/build/tmp/compileJava/compileTransaction/stash-dir/FireFighter.class.uniqueId12
new file mode 100644
index 0000000000000000000000000000000000000000..02776eb6f209146e6f2de1891a6ecafbc4aa688a
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/FireFighter.class.uniqueId12 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FireFinder.class.uniqueId10 b/build/tmp/compileJava/compileTransaction/stash-dir/FireFinder.class.uniqueId10
new file mode 100644
index 0000000000000000000000000000000000000000..3eee0b6a9e0b6ef841b3a41e019f5871a34211a8
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/FireFinder.class.uniqueId10 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/FirefighterGrid.class.uniqueId3 b/build/tmp/compileJava/compileTransaction/stash-dir/FirefighterGrid.class.uniqueId3
new file mode 100644
index 0000000000000000000000000000000000000000..d2bbe7e11dd4d28c3fba73284af14ce15b59f73f
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/FirefighterGrid.class.uniqueId3 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Flammable.class.uniqueId1 b/build/tmp/compileJava/compileTransaction/stash-dir/Flammable.class.uniqueId1
new file mode 100644
index 0000000000000000000000000000000000000000..bf120cd5de3e083cfef4bb7079bfbbbd2f05fb97
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/Flammable.class.uniqueId1 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/GameManage.class.uniqueId4 b/build/tmp/compileJava/compileTransaction/stash-dir/GameManage.class.uniqueId4
new file mode 100644
index 0000000000000000000000000000000000000000..af3536b151a408b96923e5356e098c9e646509d4
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/GameManage.class.uniqueId4 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Grid.class.uniqueId5 b/build/tmp/compileJava/compileTransaction/stash-dir/Grid.class.uniqueId5
new file mode 100644
index 0000000000000000000000000000000000000000..cedfc6abc7646d2aeb91d7df5227cbdb1cae0317
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/Grid.class.uniqueId5 differ
diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/Visitor.class.uniqueId11 b/build/tmp/compileJava/compileTransaction/stash-dir/Visitor.class.uniqueId11
new file mode 100644
index 0000000000000000000000000000000000000000..6bda2c96ed0d078985d77b993144828ec7de1b9c
Binary files /dev/null and b/build/tmp/compileJava/compileTransaction/stash-dir/Visitor.class.uniqueId11 differ
diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin
index fb3776eb8d47f0b29bebf5c61e2df8876bd80e17..4bd233e0eadb98e8fa5873e7b16630662e933ad2 100644
Binary files a/build/tmp/compileJava/previous-compilation-data.bin and b/build/tmp/compileJava/previous-compilation-data.bin differ
diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java
index 2646eb7602accd2b174ae3a116377f828e0b1473..351abfe45780ac3aa3dab486bd37909748981d6f 100644
--- a/src/main/java/app/SimulatorApplication.java
+++ b/src/main/java/app/SimulatorApplication.java
@@ -17,9 +17,10 @@ public class SimulatorApplication extends javafx.application.Application {
   private static final int COLUMN_COUNT = 20;
   private static final int SQUARE_WIDTH = 30;
   private static final int SQUARE_HEIGHT = 30;
-  public static final int INITIAL_FIRE_COUNT = 3;
-  public static final int INITIAL_FIREFIGHTER_COUNT = 6;
-
+  public static final int INITIAL_FIRE_COUNT = 5;
+  public static final int INITIAL_FIREFIGHTER_COUNT = 3;
+  public static final int INITIAL_CLOUD_COUNT = 2;
+  public static final int INITIAL_MOTORIZEDFIREFIGHTER_COUNT = 2;
   private Stage primaryStage;
   private Parent view;
   private void initializePrimaryStage(Stage primaryStage) {
@@ -44,7 +45,7 @@ public class SimulatorApplication extends javafx.application.Application {
     view = loader.load();
     Controller controller = loader.getController();
     controller.initialize(SQUARE_WIDTH, SQUARE_HEIGHT, COLUMN_COUNT, ROW_COUNT,
-            INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT);
+            INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT,INITIAL_MOTORIZEDFIREFIGHTER_COUNT);
   }
 
   private void showScene() {
diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java
index 95a6293fc078e81ce97e67436766f956d2de8ea9..8719a0a6feb61e6e9acae11ce37ac5310eddc159 100644
--- a/src/main/java/controller/Controller.java
+++ b/src/main/java/controller/Controller.java
@@ -10,14 +10,9 @@ import javafx.scene.control.Button;
 import javafx.scene.control.Label;
 import javafx.scene.control.ToggleButton;
 import javafx.scene.control.ToggleGroup;
-import javafx.scene.paint.Color;
 import javafx.util.Duration;
 import javafx.util.Pair;
 import model.*;
-import model.ExtinguishFire.FireFighter;
-import model.Flammable.Fire;
-import model.Visitor.FireFighterFinder;
-import model.Visitor.FireFinder;
 import util.Position;
 import view.Grid;
 
@@ -56,20 +51,13 @@ public class Controller {
     pauseToggleButton.setSelected(true);
   }
 
-  private void setModel(GameBoard gameBoard) {
+ /* private void setModel(GameBoard gameBoard) {
     this.board = requireNonNull(gameBoard, "GameBoard.model is null");
-  }
+  }*/
 
   private void updateBoard(){
-    List<Position> updatedPositions = board.updateToNextGeneration();
-    List<Pair<Position, BoardElement>> updatedSquares = new ArrayList<>();
-    for(Position updatedPosition : updatedPositions){
-      List<BoardElement> squareState = board.getState(updatedPosition);
-      BoardElement boardElement = getViewElement(squareState);
-      updatedSquares.add(new Pair<>(updatedPosition,boardElement));
-    }
-    grid.repaint(updatedSquares);
-    updateGenerationLabel(board.stepNumber());
+    board.updateToNextGeneration();
+    repaintGrid();
   }
 
   private void repaintGrid(){
@@ -78,7 +66,7 @@ public class Controller {
     model.BoardElement[][] boardElements = new model.BoardElement[rowCount][columnCount];
     for(int column = 0; column < columnCount; column++)
       for(int row = 0; row < rowCount; row++){
-        if(board.getElementPosition().containsKey(new Position(row,column))){
+        if(board.getElementPosition().containsKey(new Position(row,column)) && board.getElementPosition().get(new Position(row,column)).size()!=0){
           boardElements[row][column] = board.getElementPosition().get(new Position(row,column)).get(0);
         }else{
           boardElements[row][column]=new EmptyElement();
@@ -88,19 +76,6 @@ public class Controller {
     updateGenerationLabel(board.stepNumber());
   }
 
-  private BoardElement getViewElement(List<BoardElement> squareState) {
-    for (BoardElement boardElement : squareState) {
-      if (boardElement.accept(new FireFinder())) {
-        return new Fire(Color.RED);
-      } else if (boardElement.accept(new FireFighterFinder())) {
-        return new FireFighter(Color.BLUE);
-      }
-    }
-        return new EmptyElement();
-
-    }
-
-
   private void initializeTimeline() {
     Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS);
     EventHandler<ActionEvent> eventHandler =
@@ -134,9 +109,10 @@ 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 initialMotorizedFireFighterCount) {
     grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
-    this.setModel(new GameBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount));
+    board = new GameBoard(rowCount,columnCount,initialFireCount,initialFirefighterCount,initialCloudCount,initialMotorizedFireFighterCount);
+    board.initializeElements();
     repaintGrid();
   }
 
diff --git a/src/main/java/model/Board.java b/src/main/java/model/Board.java
index bb089a41406d57b0b2fe3d43b3c040cbd640b6b9..469590ddfbca6597b878794b33c75ebfbae8b5c8 100644
--- a/src/main/java/model/Board.java
+++ b/src/main/java/model/Board.java
@@ -48,7 +48,7 @@ public interface Board<S> {
    *
    * @return A list of positions that have changed during the update.
    */
-  List<Position> updateToNextGeneration();
+  void updateToNextGeneration();
 
   /**
    * Reset the board to its initial state.
diff --git a/src/main/java/model/BoardElement.java b/src/main/java/model/BoardElement.java
index d81bfbd960bea825dada024453bb4f9e81f8a433..4100f828a2f9ee1ee61bcfa5ac84e75df95168a9 100644
--- a/src/main/java/model/BoardElement.java
+++ b/src/main/java/model/BoardElement.java
@@ -13,5 +13,5 @@ public interface BoardElement {
 
     Color getColor();
     Boolean accept(Visitor visitor);
-    void initialize(int initialElementCount, HashMap<Position, ArrayList<BoardElement>> elementPosition);
+    void initialize();
 }
diff --git a/src/main/java/model/Builder/ConcreteGameBuilder.java b/src/main/java/model/Builder/ConcreteGameBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c367e38c7129e93b09c75108aa6571cc8c95a2b
--- /dev/null
+++ b/src/main/java/model/Builder/ConcreteGameBuilder.java
@@ -0,0 +1,44 @@
+package model.Builder;
+
+public class ConcreteGameBuilder implements GameBuilder{
+    int firefighter=0;
+    int fire=0;
+    int clouds=0;
+    int motorizedFireFighters=0;
+    int roads=0;
+    int mountains=0;
+    @Override
+    public GameBuilder setFire(int fires) {
+        this.fire=fires;
+        return this;
+    }
+
+    @Override
+    public GameBuilder setFireFighter(int fireFighters) {
+        this.firefighter=fireFighters;
+        return this;
+    }
+
+    @Override
+    public GameBuilder setCloud(int clouds) {
+        this.clouds=clouds;
+        return this;
+    }
+
+    @Override
+    public GameBuilder setMotorizedFireFighter(int motorizedFireFighters) {
+        this.motorizedFireFighters=motorizedFireFighters;
+        return this;
+    }
+
+    @Override
+    public GameBuilder setMountain(int mountains) {
+        this.mountains=mountains;
+        return this;
+    }
+
+    @Override
+    public GameManage build() {
+        return new GameManage(fire,firefighter,clouds,motorizedFireFighters,roads,mountains);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/model/Builder/FireFirefightersBuilder.java b/src/main/java/model/Builder/FireFirefightersBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..81761717ce8a6893a77b43fe360a863d6aa6b095
--- /dev/null
+++ b/src/main/java/model/Builder/FireFirefightersBuilder.java
@@ -0,0 +1,13 @@
+package model.Builder;
+
+public class FireFirefightersBuilder {
+    public void Build(int fires, int firefighters , int clouds , int motorizedFireFighter) {
+        ConcreteGameBuilder concreteGameBuilder;
+        concreteGameBuilder =new ConcreteGameBuilder();
+        concreteGameBuilder.setFire(fires)
+                .setFireFighter(firefighters)
+                .setCloud(clouds)
+                .setMotorizedFireFighter(motorizedFireFighter)
+                .build();
+    }
+}
diff --git a/src/main/java/model/Builder/GameBuilder.java b/src/main/java/model/Builder/GameBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..603ed19ba8f6b57d6b97439f6f5fef42e56c9488
--- /dev/null
+++ b/src/main/java/model/Builder/GameBuilder.java
@@ -0,0 +1,14 @@
+package model.Builder;
+
+public interface GameBuilder {
+
+        model.Builder.GameBuilder setFire(int fire);
+        model.Builder.GameBuilder setFireFighter(int fireFighter);
+        model.Builder.GameBuilder setCloud(int cloud);
+        model.Builder.GameBuilder setMotorizedFireFighter(int motorizedFireFighter);
+        model.Builder.GameBuilder setMountain(int mountain);
+
+        // TODO: 15/11/2023 la suite
+        GameManage build();
+
+}
diff --git a/src/main/java/model/Builder/GameManage.java b/src/main/java/model/Builder/GameManage.java
new file mode 100644
index 0000000000000000000000000000000000000000..151135d213a60453e8c15cf0bbe1503da179fe65
--- /dev/null
+++ b/src/main/java/model/Builder/GameManage.java
@@ -0,0 +1,46 @@
+package model.Builder;
+
+import javafx.scene.paint.Color;
+import model.ExtinguishFire.Cloud;
+import model.ExtinguishFire.FireFighter;
+import model.ExtinguishFire.MotorizedFireFighter;
+import model.Flammable.Fire;
+
+public class GameManage {
+    private final int fires;
+    private final int firefighters;
+    private final int clouds;
+    private final int motorizedFireFighters;
+    private final int roads;
+    private final int mountains;
+
+
+
+    public GameManage(int fires, int firefighters, int clouds, int motorizedFireFighters, int roads, int mountains) {
+        this.fires = fires;
+        this.firefighters = firefighters;
+        this.clouds = clouds;
+        this.motorizedFireFighters = motorizedFireFighters;
+        this.roads = roads;
+        this.mountains = mountains;
+        Initialize();
+    }
+
+    public void Initialize(){
+        for(int i=0;i<fires;i++) {
+            new Fire(Color.RED);
+        }
+        for(int i=0;i<firefighters;i++) {
+            new FireFighter(Color.BLUE);
+        }
+        for(int i=0;i<clouds;i++) {
+            new Cloud(Color.DARKBLUE);
+        }
+        for(int i=0;i<motorizedFireFighters;i++) {
+            new MotorizedFireFighter(Color.ORANGE);
+        }
+        // TODO: 15/11/2023  la suite .... aussi l'initialisation va changer dans fire et firefighter
+    }
+
+}
+
diff --git a/src/main/java/model/EmptyElement.java b/src/main/java/model/EmptyElement.java
index 80cae5ec9935be3f9b2e39f11f9e21a03b38314a..0834ed20164d8952c31219db4eef249683d40d72 100644
--- a/src/main/java/model/EmptyElement.java
+++ b/src/main/java/model/EmptyElement.java
@@ -19,7 +19,7 @@ public class EmptyElement implements BoardElement{
     }
 
     @Override
-    public void initialize(int initialElementCount, HashMap<Position, ArrayList<BoardElement>> elementPosition) {
+    public void initialize() {
 
     }
 }
diff --git a/src/main/java/model/ExtinguishFire/Cloud.java b/src/main/java/model/ExtinguishFire/Cloud.java
index 5fa1c31b671d246b8662185ede204bd7504d7407..f4db6c7e384e6567f90372334b415a010b09988e 100644
--- a/src/main/java/model/ExtinguishFire/Cloud.java
+++ b/src/main/java/model/ExtinguishFire/Cloud.java
@@ -1,4 +1,74 @@
 package model.ExtinguishFire;
 
-public class Cloud {
+import javafx.scene.paint.Color;
+import model.BoardElement;
+import model.GameBoard;
+import model.Visitor.FireFinder;
+import model.Visitor.Visitor;
+import util.Position;
+
+import java.util.*;
+
+import static model.GameBoard.elementPosition;
+import static model.GameBoard.randomPosition;
+
+public class Cloud implements ExtinguishFire{
+
+    Color color;
+
+    public Cloud(Color color){
+        this.color=color;
+        initialize();
+    }
+    @Override
+    public Color getColor() {
+        return color;
+    }
+
+    @Override
+    public Boolean accept(Visitor visitor) {
+        return visitor.visit(this);
+    }
+
+    @Override
+    public void initialize() {
+        Position position = GameBoard.randomPosition();
+        if (elementPosition.containsKey(position))
+            elementPosition.get(position).add(this);
+        else {
+            ArrayList<BoardElement> boardElements = new ArrayList<>();
+            boardElements.add(this);
+            elementPosition.put(position, boardElements);
+        }
+    }
+
+    @Override
+    public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
+        List<Position> firePositions = new ArrayList<>();
+        for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
+            for (BoardElement element : entry.getValue()) {
+                if (element.accept(new FireFinder())) {
+                    firePositions.add(entry.getKey());
+                }
+            }
+        }
+        List<Position> neighbors = gameBoard.neighbors(position);
+        Random random = new Random();
+        int randomIndex = random.nextInt(neighbors.size());
+        Position newCloudPosition = neighbors.get(randomIndex);
+        if(newElementPosition.containsKey(newCloudPosition)){
+            newElementPosition.get(newCloudPosition).add(this);
+        }
+        else{
+            ArrayList<BoardElement> boardElements = new ArrayList<>();
+            boardElements.add(this);
+            newElementPosition.put(newCloudPosition,boardElements);
+        }
+        extinguishPosition.add(newCloudPosition);
+        /*List<Position> neighborFirePositions = gameBoard.neighbors(newFirefighterPosition).stream()
+                .filter(firePositions::contains).toList();
+        for(Position firePosition : neighborFirePositions) {
+            extinguishPosition.add(firePosition);
+        }*/
+    }
 }
diff --git a/src/main/java/model/ExtinguishFire/ExtinguishFire.java b/src/main/java/model/ExtinguishFire/ExtinguishFire.java
index 491c3b88a886ada6400484863be6549b06f7f3e2..006a184b8dafa69d1dd97417c753609aa993d12c 100644
--- a/src/main/java/model/ExtinguishFire/ExtinguishFire.java
+++ b/src/main/java/model/ExtinguishFire/ExtinguishFire.java
@@ -6,12 +6,9 @@ import util.Position;
 
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 
 public interface ExtinguishFire extends BoardElement {
 
-    void initialize(int initialFireFighterCount, HashMap<Position, ArrayList<BoardElement>> elementPosition);
-
-    List<Position> updateFirefighters(GameBoard gameBoard);
+    void update(GameBoard gameBoard , Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition);
 
 }
diff --git a/src/main/java/model/ExtinguishFire/FireFighter.java b/src/main/java/model/ExtinguishFire/FireFighter.java
index 155184ba7bdc86161c1c56c68b492ad767421621..73e882fcd02475c97582e1ae6cffa1d7e8098679 100644
--- a/src/main/java/model/ExtinguishFire/FireFighter.java
+++ b/src/main/java/model/ExtinguishFire/FireFighter.java
@@ -2,9 +2,8 @@ package model.ExtinguishFire;
 
 import javafx.scene.paint.Color;
 import model.BoardElement;
-import model.Flammable.Fire;
 import model.GameBoard;
-import model.Visitor.FireFighterFinder;
+import model.Visitor.CrossMountain;
 import model.Visitor.FireFinder;
 import model.Visitor.Visitor;
 import util.Position;
@@ -14,10 +13,13 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class FireFighter implements ExtinguishFire{
+import static model.GameBoard.elementPosition;
+
+public class FireFighter implements ExtinguishFire {
     Color color;
     public FireFighter(Color color){
         this.color=color;
+        initialize();
     }
     @Override
     public Color getColor() {
@@ -30,70 +32,67 @@ public class FireFighter implements ExtinguishFire{
     }
 
     @Override
-    public void initialize(int initialFireFighterCount, HashMap<Position, ArrayList<BoardElement>> elementPosition) {
-        FireFinder fireFinder=new FireFinder();
+    public void initialize( ) {
+        CrossMountain crossMountain=new CrossMountain();
         boolean canInitialise;
-        for (int index = 0; index < initialFireFighterCount; index++) {
-            Position position = GameBoard.randomPosition();
-            if(elementPosition.containsKey(position)) {
-                for (;;) {
-                    canInitialise = true;
-                    for (BoardElement element : elementPosition.get(position)) {
-                        if (element.accept(fireFinder)) {
-                            canInitialise=false;
-                            break;
-                        }
-                    }
-                    if(canInitialise){
+        Position position = GameBoard.randomPosition();
+        if(elementPosition.containsKey(position)) {
+            for (;;) {
+                canInitialise = true;
+                for (BoardElement element : elementPosition.get(position)) {
+                    if (element.accept(crossMountain)) {
+                        canInitialise = false;
                         break;
                     }
-                    position = GameBoard.randomPosition();
-                    if(!elementPosition.containsKey(position))break;
                 }
-                if(elementPosition.containsKey(position))
-                    elementPosition.get(position).add(new FireFighter(Color.BLUE));
-                else{
-                    ArrayList<BoardElement> boardElements = new ArrayList<>();
-                    boardElements.add(new FireFighter(Color.BLUE));
-                    elementPosition.put(position,boardElements);
+                if (canInitialise) {
+                    break;
                 }
-                continue;
+                position = GameBoard.randomPosition();
+                if (!elementPosition.containsKey(position)) break;
             }
-            ArrayList<BoardElement> boardElements = new ArrayList<>();
-            boardElements.add(new FireFighter(Color.BLUE));
-            elementPosition.put(position,boardElements);
+            if (elementPosition.containsKey(position))
+                elementPosition.get(position).add(this);
+            else {
+                ArrayList<BoardElement> boardElements = new ArrayList<>();
+                boardElements.add(this);
+                elementPosition.put(position, boardElements);
+            }
+
         }
+        ArrayList<BoardElement> boardElements = new ArrayList<>();
+        boardElements.add(this);
+        elementPosition.put(position,boardElements);
     }
 
     @Override
-    public List<Position> updateFirefighters(GameBoard gameBoard) {
-        List<Position> result = new ArrayList<>();
-        List<Position> firefighterPositions = new ArrayList<>();
-        List<Position> firePositions = new ArrayList<>();
-        for (Map.Entry<Position, ArrayList<BoardElement>> entry : gameBoard.getElementPosition().entrySet()) {
-            for (BoardElement element : entry.getValue()) {
-                if (element.accept(new FireFighterFinder())) {
-                    firefighterPositions.add(entry.getKey());
-                }
-                if (element.accept(new FireFinder())) {
-                    firePositions.add(entry.getKey());
+    public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
+
+            List<Position> firePositions = new ArrayList<>();
+            for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
+                for (BoardElement element : entry.getValue()) {
+                    if (element.accept(new FireFinder())) {
+                     firePositions.add(entry.getKey());
+                    }
                 }
             }
-        }
-        for (Position firefighterPosition : firefighterPositions) {
-            Position newFirefighterPosition = gameBoard.neighborClosestToFire(firefighterPosition);
-            gameBoard.getElementPosition().get(newFirefighterPosition).add(new FireFighter(Color.BLUE));
-            gameBoard.extinguish(newFirefighterPosition);
-            result.add(firefighterPosition);
-            result.add(newFirefighterPosition);
+            Position newFirefighterPosition = gameBoard.neighborClosestToFire(position);
+            if(newElementPosition.containsKey(newFirefighterPosition)){
+                newElementPosition.get(newFirefighterPosition).add(this);
+            }
+            else{
+                ArrayList<BoardElement> boardElements = new ArrayList<>();
+                boardElements.add(this);
+                newElementPosition.put(newFirefighterPosition,boardElements);
+            }
+            extinguishPosition.add(newFirefighterPosition);
             List<Position> neighborFirePositions = gameBoard.neighbors(newFirefighterPosition).stream()
                     .filter(firePositions::contains).toList();
-            for(Position firePosition : neighborFirePositions)
-                gameBoard.extinguish(firePosition);
-            result.addAll(neighborFirePositions);
+            for(Position firePosition : neighborFirePositions) {
+                extinguishPosition.add(firePosition);
+            }
+
         }
-        return result;
-    }
 
 }
 
diff --git a/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java b/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java
index ef4d68ee00907de06dd030dc354df6e6f4e154cc..5d04606784c5f64e617b39e350fe85e3019c47ee 100644
--- a/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java
+++ b/src/main/java/model/ExtinguishFire/MotorizedFireFighter.java
@@ -1,4 +1,107 @@
 package model.ExtinguishFire;
 
-public class MotorizedFireFighter {
+import javafx.scene.paint.Color;
+import model.BoardElement;
+import model.GameBoard;
+import model.Visitor.CrossMountain;
+import model.Visitor.FireFinder;
+import model.Visitor.Visitor;
+import util.Position;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static model.GameBoard.elementPosition;
+
+public class MotorizedFireFighter implements ExtinguishFire {
+
+    Color color;
+
+    public MotorizedFireFighter(Color color){
+        this.color=color;
+        initialize();
+    }
+    @Override
+    public Color getColor() {
+        return color;
+    }
+
+    @Override
+    public Boolean accept(Visitor visitor) {
+        return visitor.visit(this);
+    }
+
+    @Override
+    public void initialize() {
+        CrossMountain crossMountain=new CrossMountain();
+        boolean canInitialise;
+        Position position = GameBoard.randomPosition();
+        if(elementPosition.containsKey(position)) {
+            for (;;) {
+                canInitialise = true;
+                for (BoardElement element : elementPosition.get(position)) {
+                    if (element.accept(crossMountain)) {
+                        canInitialise = false;
+                        break;
+                    }
+                }
+                if (canInitialise) {
+                    break;
+                }
+                position = GameBoard.randomPosition();
+                if (!elementPosition.containsKey(position)) break;
+            }
+            if (elementPosition.containsKey(position))
+                elementPosition.get(position).add(this);
+            else {
+                ArrayList<BoardElement> boardElements = new ArrayList<>();
+                boardElements.add(this);
+                elementPosition.put(position, boardElements);
+            }
+
+        }
+        ArrayList<BoardElement> boardElements = new ArrayList<>();
+        boardElements.add(this);
+        elementPosition.put(position,boardElements);
+    }
+
+    @Override
+    public void update(GameBoard gameBoard, Position position, HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
+
+        List<Position> firePositions = new ArrayList<>();
+        for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()) {
+            for (BoardElement element : entry.getValue()) {
+                if (element.accept(new FireFinder())) {
+                    firePositions.add(entry.getKey());
+                }
+            }
+        }
+        ArrayList<Position> newMotorizedFireFighterPositions = new ArrayList<>();
+        Position newMotorizedFireFighterPosition1 = gameBoard.neighborClosestToFire(position);
+        newMotorizedFireFighterPositions.add(newMotorizedFireFighterPosition1);
+        Position newMotorizedFireFighterPosition2 = gameBoard.neighborClosestToFire(newMotorizedFireFighterPosition1);
+        newMotorizedFireFighterPositions.add(newMotorizedFireFighterPosition2);
+
+        if(newElementPosition.containsKey(newMotorizedFireFighterPosition2)){
+            newElementPosition.get(newMotorizedFireFighterPosition2).add(this);
+        }
+        else{
+            ArrayList<BoardElement> boardElements = new ArrayList<>();
+            boardElements.add(this);
+            newElementPosition.put(newMotorizedFireFighterPosition2,boardElements);
+        }
+        for(Position newPosition : newMotorizedFireFighterPositions) {
+            extinguishPosition.add(newPosition);
+        }
+        List<Position> neighborFirePositions = new ArrayList<>();
+        neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPosition1).stream()
+                .filter(firePositions::contains).toList());
+        neighborFirePositions.addAll(gameBoard.neighbors(newMotorizedFireFighterPosition2).stream()
+                .filter(firePositions::contains).toList());
+        for(Position firePosition : neighborFirePositions) {
+            extinguishPosition.add(firePosition);
+        }
+    }
 }
diff --git a/src/main/java/model/Flammable/Fire.java b/src/main/java/model/Flammable/Fire.java
index 37f5ad36aebf67eecd2e7b918d8845e89822b894..1d156d3ea1f521735df67fdaa6e27dd653205060 100644
--- a/src/main/java/model/Flammable/Fire.java
+++ b/src/main/java/model/Flammable/Fire.java
@@ -3,6 +3,8 @@ package model.Flammable;
 import javafx.scene.paint.Color;
 import model.BoardElement;
 import model.GameBoard;
+import model.Visitor.CrossMountain;
+import model.Visitor.CrossRoad;
 import model.Visitor.FireFinder;
 import model.Visitor.Visitor;
 import util.Position;
@@ -15,6 +17,7 @@ public class Fire implements Flammable{
 
     public Fire(Color color){
         this.color = color;
+        initialize();
     }
 
     @Override
@@ -28,61 +31,86 @@ public class Fire implements Flammable{
     }
 
     @Override
-    public void initialize(int initialFireCount, HashMap<Position, ArrayList<BoardElement>> elementPosition) {
+    public void initialize() {
         FireFinder fireFinder=new FireFinder();
         Position position = GameBoard.randomPosition();
         boolean canInitialise;
-        for (int index = 0; index < initialFireCount; index++) {
-            if(elementPosition.containsKey(position)) {
-                 for (;;) {
-                    canInitialise=true;
-                    for (BoardElement element : elementPosition.get(position)) {
-                        if (element.accept(fireFinder)) {
-                            canInitialise=false;
-                            break;
-                        }
-                    }
-                    if(canInitialise){
+        if(GameBoard.elementPosition.containsKey(position)) {
+            for (;;) {
+                canInitialise=true;
+                for (BoardElement element : GameBoard.elementPosition.get(position)) {
+                    if (element.accept(fireFinder)) {
+                        canInitialise=false;
                         break;
                     }
-                 position = GameBoard.randomPosition();
-                    if(!elementPosition.containsKey(position))break;
-                 }
-                 if(elementPosition.containsKey(position))
-                      elementPosition.get(position).add(new Fire(Color.RED));
-                 else{
-                     ArrayList<BoardElement> boardElements = new ArrayList<>();
-                     boardElements.add(new Fire(Color.RED));
-                     elementPosition.put(position,boardElements);
-                 }
-                 continue;
+                }
+                if(canInitialise){
+                    break;
+                }
+                position = GameBoard.randomPosition();
+                if(!GameBoard.elementPosition.containsKey(position))break;
             }
-            ArrayList<BoardElement> boardElements = new ArrayList<>();
-            boardElements.add(new Fire(Color.RED));
-            elementPosition.put(position,boardElements);
+            if(GameBoard.elementPosition.containsKey(position))
+                GameBoard.elementPosition.get(position).add(this);
+            else{
+                ArrayList<BoardElement> boardElements = new ArrayList<>();
+                boardElements.add(this);
+                GameBoard.elementPosition.put(position,boardElements);
             }
+        }
+        ArrayList<BoardElement> boardElements = new ArrayList<>();
+        boardElements.add(this);
+        GameBoard.elementPosition.put(position,boardElements);
     }
 
-    @Override
-    public List<Position> updateFlammable(GameBoard gameBoard) {
-            FireFinder fireFinder=new FireFinder();
-            List<Position> result = new ArrayList<>();
-            if (gameBoard.stepNumber() % 2 == 0) {
-                List<Position> newFirePositions = new ArrayList<>();
-                for (Map.Entry<Position, ArrayList<BoardElement>> entry : gameBoard.getElementPosition().entrySet()){
-                    for(BoardElement element : entry.getValue()){
-                        if (element.accept(fireFinder)){
-                            newFirePositions.addAll(gameBoard.neighbors(entry.getKey()));
+    @Override   // TODO: 15/11/2023
+    public void update(GameBoard gameBoard , Position position,HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition) {
+        if(extinguishPosition.contains(position)){
+            return ;
+        }
+        if (gameBoard.stepNumber() % 2 == 0) {
+            List<Position> newPositions = new ArrayList<>();
+            newPositions.addAll(gameBoard.neighbors(position));
+            if(newElementPosition.containsKey(position))
+                newElementPosition.get(position).add(this);
+            else {
+                newElementPosition.put(position,(new ArrayList<>()));
+                newElementPosition.get(position).add(this);
+            }
+            for(Position newPosition : newPositions){
+                if(extinguishPosition.contains(newPosition))
+                    continue;
+                if(GameBoard.elementPosition.containsKey(newPosition)) {
+                    for(BoardElement boardElement : GameBoard.elementPosition.get(newPosition)){
+                        if(boardElement.accept(new FireFinder()) && boardElement.accept(new CrossRoad()) && boardElement.accept(new CrossMountain())){
+                            break;
+                        }
+                        else if(!boardElement.accept( new FireFinder())&& !boardElement.accept(new CrossRoad()) && !boardElement.accept(new CrossMountain())){
+                            newElementPosition.get(newPosition).add(this);
                         }
                     }
+
                 }
-                for(Position position : newFirePositions){
-                    gameBoard.getElementPosition().get(position).add(new Fire(Color.RED));
+                else{
+                    ArrayList<BoardElement> boardElements = new ArrayList<>();
+                    boardElements.add(this);
+                    newElementPosition.put(newPosition,boardElements);
+                    //System.out.println(GameBoard.elementPosition.get(position).get(0).getColor());
                 }
-                result.addAll(newFirePositions);
+
             }
-            return result;
         }
+        else{
+            if(newElementPosition.containsKey(position))
+                newElementPosition.get(position).add(this);
+            else {
+                newElementPosition.put(position,(new ArrayList<>()));
+                newElementPosition.get(position).add(this);
+            }
+        }
+
     }
+}
+
 
 
diff --git a/src/main/java/model/Flammable/Flammable.java b/src/main/java/model/Flammable/Flammable.java
index 89887060fafc0c1685ddc93d7aa76c65e7d718bd..325c6d3012ce69d730224122c935bfd377258c7a 100644
--- a/src/main/java/model/Flammable/Flammable.java
+++ b/src/main/java/model/Flammable/Flammable.java
@@ -10,7 +10,5 @@ import java.util.List;
 
 public interface Flammable extends BoardElement{
 
-    void initialize(int initialFireCount, HashMap<Position, ArrayList<BoardElement>> elementPosition);
-
-    List<Position> updateFlammable(GameBoard gameBoard);
+    void update(GameBoard gameBoard, Position position,HashMap<Position, ArrayList<BoardElement>> newElementPosition, ArrayList<Position> extinguishPosition);
 }
diff --git a/src/main/java/model/GameBoard.java b/src/main/java/model/GameBoard.java
index 153a342a461f6a136e7370e504026c9efdd7e265..1cb840f0c4a2bb1e938be7fda3b87821d4d1b5b6 100644
--- a/src/main/java/model/GameBoard.java
+++ b/src/main/java/model/GameBoard.java
@@ -1,65 +1,92 @@
 package model;
 
-import javafx.scene.paint.Color;
-import model.ExtinguishFire.FireFighter;
-import model.Flammable.Fire;
+import model.Builder.FireFirefightersBuilder;
+import model.Builder.GameManage;
+import model.ExtinguishFire.ExtinguishFire;
+import model.Flammable.Flammable;
 import model.Visitor.FireFinder;
 import util.Position;
 
 import java.util.*;
 
-public class GameBoard implements Board<List<BoardElement>>{
+public class GameBoard implements Board{
     static  int columnCount;
     static  int rowCount;
-    private final int initialFireCount;
-    private final int initialFirefighterCount;
-
+    private int initialFireCount;
+    private int initialFirefighterCount;
+    private int initialCloudCount;
+    private int initialMotorizedFireFighterCount;
     private int step = 0;
     static Random randomGenerator = new Random();
-    private HashMap<Position, ArrayList<BoardElement>> elementPosition;
 
     public HashMap<Position, ArrayList<BoardElement>> getElementPosition() {
         return elementPosition;
     }
 
-    public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount) {
+    public static HashMap<Position, ArrayList<BoardElement>> elementPosition=new HashMap<>();
+
+    public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount,int initialCloudCount,int initialMotorizedFireFighterCount) {
         this.columnCount = columnCount;
         this.rowCount = rowCount;
         this.initialFireCount = initialFireCount;
         this.initialFirefighterCount = initialFirefighterCount;
-        initializeElements();
+        this.initialCloudCount = initialCloudCount;
+        this.initialMotorizedFireFighterCount=initialMotorizedFireFighterCount;
     }
-    public void initializeElements() {
-        elementPosition=new HashMap<>();
-        Fire fire=new Fire(Color.RED);
-        FireFighter fireFighter=new FireFighter(Color.BLUE);
-        fire.initialize(initialFireCount,elementPosition);
-        fireFighter.initialize(initialFirefighterCount,elementPosition);
+
+    public void initializeElements(){
+        FireFirefightersBuilder fireFirefighterBuilder=new FireFirefightersBuilder();
+        fireFirefighterBuilder.Build(this.initialFireCount,this.initialFirefighterCount,this.initialCloudCount,this.initialMotorizedFireFighterCount);
     }
 
     public static Position randomPosition() {
         return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
     }
     @Override
-    public List<Position> updateToNextGeneration() {
-        List<Position> result = new FireFighter(Color.BLUE).updateFirefighters(this);
-        result.addAll(new Fire(Color.RED).updateFlammable(this));
+    public void updateToNextGeneration() {
+        HashMap<Position, ArrayList<BoardElement>> newElementPosition = new HashMap<>();
+        ArrayList<Position> extinguishPosition = new ArrayList<>();
+        for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()){
+            for(BoardElement element : entry.getValue()){
+
+                if (!element.accept(new FireFinder())){
+                    ExtinguishFire element1 = (ExtinguishFire) element;
+                    element1.update(this,entry.getKey(),newElementPosition,extinguishPosition);
+                }
+            }
+        }
+        for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()){
+            for(BoardElement element : entry.getValue()){
+                if (element.accept(new FireFinder())){
+                    Flammable element1 = (Flammable) element;
+                    element1.update(this,entry.getKey(),newElementPosition,extinguishPosition);
+                }
+            }
+        }
+        elementPosition.clear();
+        extinguishPosition.clear();
+        for (Map.Entry<Position, ArrayList<BoardElement>> entry : newElementPosition.entrySet()){
+
+            if(elementPosition.containsKey(entry.getKey())){
+                elementPosition.get(entry.getKey()).addAll(entry.getValue());
+            }else{
+                elementPosition.put(entry.getKey(),entry.getValue());
+            }
+        }
         step++;
-        return result;
+
+
     }
 
 
     @Override
-    public List<BoardElement>  getState(Position position) {
-        return elementPosition.get(position);
+    public Object getState(Position position) {
+        return null;
     }
 
     @Override
-    public void setState(List<BoardElement> state, Position position) {
-         for(int index = 0 ; index<elementPosition.get(position).size() ; index++){
-             elementPosition.get(position).remove(index);
+    public void setState(Object state, Position position) {
 
-         }
     }
 
     @Override
@@ -76,6 +103,7 @@ public class GameBoard implements Board<List<BoardElement>>{
     @Override
     public void reset() {
         step = 0;
+        elementPosition.clear();
         initializeElements();
     }
 
@@ -94,6 +122,7 @@ public class GameBoard implements Board<List<BoardElement>>{
     }
 
     public  Position neighborClosestToFire(Position position) {
+
         FireFinder fireFinder = new FireFinder();
         Set<Position> firePositions = new HashSet<>();
         Set<Position> seen = new HashSet<>();
@@ -122,15 +151,22 @@ public class GameBoard implements Board<List<BoardElement>>{
         return position;
     }
 
-    public void extinguish(Position position) {
+    /*public void extinguish(Position position) {
         FireFinder fireFinder = new FireFinder();
-        for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()){
-            for(BoardElement element : entry.getValue()){
-                if (element.accept(fireFinder)){
-                    entry.getValue().remove(element);
+        HashMap<Position, ArrayList<BoardElement>> elementPositionCopie = new HashMap<>();
+        for (Map.Entry<Position, ArrayList<BoardElement>> entry : this.elementPosition.entrySet()){
+            elementPositionCopie.put(entry.getKey(),entry.getValue());
+        }
+        for (BoardElement boardElement : elementPositionCopie.get(position)){
+                if (boardElement.accept(fireFinder) && elementPosition.get(position).size()!=0){
+                    this.elementPosition.get(position).remove(boardElement);
+                    break;
+                }
+                if (boardElement.accept(fireFinder) && elementPosition.get(position).size()==0){
+                    this.elementPosition.get(position).remove(boardElement);
+                    this.elementPosition.remove(position);
                 }
             }
-        }
+        }*/
     }
 
-}
diff --git a/src/main/java/model/Visitor/CrossMountain.java b/src/main/java/model/Visitor/CrossMountain.java
index bc8097d1d97cc51209fee1c1b7ed6ddf8c707e48..79fdb61439896429e9c2a6a3f2046074ba76cbfa 100644
--- a/src/main/java/model/Visitor/CrossMountain.java
+++ b/src/main/java/model/Visitor/CrossMountain.java
@@ -1,5 +1,6 @@
 package model.Visitor;
 
+import model.ExtinguishFire.Cloud;
 import model.ExtinguishFire.FireFighter;
 import model.ExtinguishFire.MotorizedFireFighter;
 import model.Flammable.Fire;
@@ -16,7 +17,8 @@ public class CrossMountain implements Visitor {
     public boolean visit(FireFighter fireFighter) {
         return false;
     }
-
+    @Override
+    public boolean visit(Cloud cloud) {return true;}
     @Override
     public boolean visit(MotorizedFireFighter motorizedFireFighter) {
         return false;
diff --git a/src/main/java/model/Visitor/CrossRoad.java b/src/main/java/model/Visitor/CrossRoad.java
index 4a0f710dbaee13ab9a6da545501df32b23e895c1..b886335897981e4e319ac3e012eb470aff106da0 100644
--- a/src/main/java/model/Visitor/CrossRoad.java
+++ b/src/main/java/model/Visitor/CrossRoad.java
@@ -1,5 +1,6 @@
 package model.Visitor;
 
+import model.ExtinguishFire.Cloud;
 import model.ExtinguishFire.FireFighter;
 import model.ExtinguishFire.MotorizedFireFighter;
 import model.Flammable.Fire;
@@ -17,11 +18,16 @@ public class CrossRoad implements Visitor {
         return true;
     }
 
+    @Override
+    public boolean visit(Cloud cloud) {return true;}
+
     @Override
     public boolean visit(MotorizedFireFighter motorizedFireFighter) {
         return true;
     }
 
+
+
     @Override
     public boolean visit(Mountain mountain) {
         return false;
@@ -29,6 +35,6 @@ public class CrossRoad implements Visitor {
 
     @Override
     public boolean visit(Road road) {
-        return false;
+        return true;
     }
 }
diff --git a/src/main/java/model/Visitor/FireFighterFinder.java b/src/main/java/model/Visitor/FireFighterFinder.java
deleted file mode 100644
index ebef4b2b5ff00091c1ad5d615cf9adad36308131..0000000000000000000000000000000000000000
--- a/src/main/java/model/Visitor/FireFighterFinder.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package model.Visitor;
-
-import model.ExtinguishFire.FireFighter;
-import model.ExtinguishFire.MotorizedFireFighter;
-import model.Flammable.Fire;
-import model.Obstacle.Mountain;
-import model.Obstacle.Road;
-
-public class FireFighterFinder implements Visitor{
-
-    public boolean visit(Fire fire) {
-        return false;
-    }
-
-    @Override
-    public boolean visit(FireFighter fireFighter) {
-        return true;
-    }
-
-    @Override
-    public boolean visit(MotorizedFireFighter motorizedFireFighter) {
-        return false;
-    }
-
-    @Override
-    public boolean visit(Mountain mountain) {
-        return false;
-    }
-
-    @Override
-    public boolean visit(Road road) {
-        return false;
-    }
-}
diff --git a/src/main/java/model/Visitor/FireFinder.java b/src/main/java/model/Visitor/FireFinder.java
index 3718c615c60117d69188f90e6ebd628db2faefd8..dd8ed25a546046ad15ad60ad0000acd9c2ae4095 100644
--- a/src/main/java/model/Visitor/FireFinder.java
+++ b/src/main/java/model/Visitor/FireFinder.java
@@ -1,5 +1,6 @@
 package model.Visitor;
 
+import model.ExtinguishFire.Cloud;
 import model.ExtinguishFire.FireFighter;
 import model.ExtinguishFire.MotorizedFireFighter;
 import model.Flammable.Fire;
@@ -17,6 +18,9 @@ public class FireFinder implements Visitor {
         return false;
     }
 
+    @Override
+    public boolean visit(Cloud cloud) {return false;}
+
     @Override
     public boolean visit(MotorizedFireFighter motorizedFireFighter) {
         return false;
diff --git a/src/main/java/model/Visitor/Visitor.java b/src/main/java/model/Visitor/Visitor.java
index 5a324d1942b57410f4d084e7d995efac6a300c95..53cb66b6497e59ad15c9413fd55534bb849e5a3c 100644
--- a/src/main/java/model/Visitor/Visitor.java
+++ b/src/main/java/model/Visitor/Visitor.java
@@ -1,5 +1,6 @@
 package model.Visitor;
 
+import model.ExtinguishFire.Cloud;
 import model.ExtinguishFire.FireFighter;
 import model.ExtinguishFire.MotorizedFireFighter;
 import model.Flammable.Fire;
@@ -10,6 +11,7 @@ public interface Visitor {
 
     boolean visit(Fire fire);
     boolean visit(FireFighter fireFighter);
+    boolean visit(Cloud cloud);
     boolean visit(MotorizedFireFighter motorizedFireFighter);
     boolean visit(Mountain mountain);
     boolean visit(Road road);
diff --git a/src/main/java/view/FirefighterGrid.java b/src/main/java/view/FirefighterGrid.java
index e81ddfd50defe3083d66f20b14bbc4de5a700caf..042dc7b54ac7b2d11202a6d3b53727bf1c450baf 100644
--- a/src/main/java/view/FirefighterGrid.java
+++ b/src/main/java/view/FirefighterGrid.java
@@ -20,8 +20,8 @@ public class FirefighterGrid extends Canvas implements Grid<model.BoardElement>{
 
     @Override
     public void repaint(List<Pair<Position, model.BoardElement>> positionedElements) {
-        //clear(positionedElements);
-        //paint(positionedElements);
+        clear(positionedElements);
+        paint(positionedElements);
         paintLines();
     }
 
@@ -34,7 +34,7 @@ public class FirefighterGrid extends Canvas implements Grid<model.BoardElement>{
 
     private void paint(List<Pair<Position, BoardElement>> positionedElements) {
         for(Pair<Position, BoardElement> pair : positionedElements){
-            //paintElementAtPosition(pair.getValue(), pair.getKey());
+            paintElementAtPosition(pair.getValue(), pair.getKey());
         }
     }
 
diff --git a/src/test/java/model/FirefighterBoardTest.java b/src/test/java/model/FirefighterBoardTest.java
index 24c7e5d160a01c26a30497768764aba0c494c4d7..049ad8d42f03ffe5d376c26e64c0a4dc655e572f 100644
--- a/src/test/java/model/FirefighterBoardTest.java
+++ b/src/test/java/model/FirefighterBoardTest.java
@@ -7,33 +7,33 @@ import java.util.List;
 
 import static org.assertj.core.api.Assertions.*;
 
-/*public class FirefighterBoardTest {
+public class FirefighterBoardTest {/*
   @Test
   void testColumnCount(){
-    Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 1, 3);
+    Board board = new GameBoard(20, 10, 1, 3);
     assertThat(board.columnCount()).isEqualTo(20);
   }
   @Test
   void testRowCount(){
-    Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 1, 3);
+    Board<List board = new GameBoard(20, 10, 1, 3);
     assertThat(board.rowCount()).isEqualTo(10);
   }
   @Test
   void testStepNumber(){
-    Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 1, 3);
+    Board board = new GameBoard(20, 10, 1, 3);
     for(int index = 0; index < 10; index++){
       assertThat(board.stepNumber()).isEqualTo(index);
       board.updateToNextGeneration();
     }
     assertThat(board.stepNumber()).isEqualTo(10);
   }
-  @Test
- void testGetState_afterSet(){
-    Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 0, 0);
+  /*@Test
+  void testGetState_afterSet(){
+    Board<List<BoardElement>> board = new GameBoard(20, 10, 0, 0);
     Position position = new Position(1,2);
     assertThat(board.getState(position)).isEmpty();
-    board.setState(List.of(ModelElement.FIRE), position);
+    board.setState(List.of(BoardElement.FIRE), position);
     assertThat(board.getState(position)).containsExactly(ModelElement.FIRE);
-  }
+  }*/
 
-}*/
+}