diff --git a/src/main/java/app/SimulatorApplication.java b/src/main/java/app/SimulatorApplication.java index 9d51e4f6dd14958b63d96327a9aa7cb1c90649a8..40ef807f9a57264c61a4925096958424f29e99fa 100644 --- a/src/main/java/app/SimulatorApplication.java +++ b/src/main/java/app/SimulatorApplication.java @@ -22,8 +22,11 @@ public class SimulatorApplication extends javafx.application.Application { public static final int INITIAL_CLOUD_COUNT = 2; public static final int INITIAL_FIRETRUCK_COUNT = 1; - public static final int[] elementsCount = new int[]{INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT, INITIAL_FIRETRUCK_COUNT}; + public static final int INITIAL_MOUNTAIN_COUNT = 8; + public static final int INITIAL_ROAD_COUNT = 10; + + public static final int[] elementsCount = {INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT, INITIAL_FIRETRUCK_COUNT, INITIAL_MOUNTAIN_COUNT, INITIAL_ROAD_COUNT}; private Stage primaryStage; private Parent view; private void initializePrimaryStage(Stage primaryStage) { diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 154f82b80d8b950689dee1106fa170058027696e..4ac6e759562163a72e60b8e71f99a0337def6807 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -94,6 +94,12 @@ public class Controller { if (squareState.contains(ModelElement.FIRETRUCK)){ return ViewElement.FIRETRUCK; } + if (squareState.contains(ModelElement.MOUNTAIN)){ + return ViewElement.MOUNTAIN; + } + if (squareState.contains(ModelElement.ROAD)){ + return ViewElement.ROAD; + } return ViewElement.EMPTY; } diff --git a/src/main/java/model/AbstractElements.java b/src/main/java/model/AbstractElements.java index 8581e4579813c4882bd0b09ced0722dc2db9f04c..ff56d574e6c812f1f150fafbe4b822c75845ed5e 100644 --- a/src/main/java/model/AbstractElements.java +++ b/src/main/java/model/AbstractElements.java @@ -6,16 +6,25 @@ import java.util.*; public abstract class AbstractElements implements Elements { final Random randomGenerator = new Random(); - int rowCount = 0; - int columnCount = 0; + int rowCount; + int columnCount; ModelElement modelElement; List<Position> elementsPositions; + AbstractElements(int columnCount, int rowCount,ModelElement modelElement){ + this.columnCount = columnCount; + this.rowCount = rowCount; + this.modelElement = modelElement; + } public abstract void nextMove(); - public abstract void initializeElements(int count, int rowCount, int columnCount); + public void initializeElements(int count, int rowCount, int columnCount) { + elementsPositions = new ArrayList<>(); + for(int i = 0; i < count; i++) + elementsPositions.add(randomPosition(rowCount, columnCount)); + } protected Position randomPosition(int rowCount, int columnCount) { return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount)); @@ -30,6 +39,22 @@ public abstract class AbstractElements implements Elements { return list; } + protected List<Position> neighborsWithoutSelectedElements(Position position, Elements... elements) { + + List<Position> list = new ArrayList<>(); + for (Position neighbor : neighbors(position)) { + boolean isNeighbor = true; + for (Elements element : elements) { + if (element.getElementsPositions().contains(neighbor)) { + isNeighbor = false; + break; + } + } + if (isNeighbor) list.add(neighbor); + } + return list; + } + public List<Position> getElementsPositions() { return elementsPositions; } diff --git a/src/main/java/model/AbstractFireFighters.java b/src/main/java/model/AbstractFireFighters.java index 7681ebd00741e05c7ff40df55533f0afb628b127..83bc9203f903de9bf8dcd9e0beadb2f3a92ab7c3 100644 --- a/src/main/java/model/AbstractFireFighters.java +++ b/src/main/java/model/AbstractFireFighters.java @@ -4,14 +4,14 @@ import util.Position; import java.util.*; public abstract class AbstractFireFighters extends AbstractElements{ - public List<Position> elementsPositions; + public Fire fire; + public Mountain mountain; - public AbstractFireFighters(int columnCount, int rowCount, Fire fire){ - elementsPositions = new ArrayList<>(); - this.columnCount = columnCount; - this.rowCount = rowCount; + public AbstractFireFighters(int columnCount, int rowCount, Fire fire, Mountain mountain, ModelElement modelElement){ + super(columnCount, rowCount,modelElement); this.fire = fire; + this.mountain = mountain; } @@ -19,7 +19,7 @@ public abstract class AbstractFireFighters extends AbstractElements{ protected Position neighborClosestToFire(Position position) { Set<Position> seen = new HashSet<>(); HashMap<Position, Position> firstMove = new HashMap<>(); - Queue<Position> toVisit = new LinkedList<>(neighbors(position)); + Queue<Position> toVisit = new LinkedList<>(neighborsWithoutSelectedElements(position, mountain)); for (Position initialMove : toVisit) firstMove.put(initialMove, initialMove); @@ -27,7 +27,7 @@ public abstract class AbstractFireFighters extends AbstractElements{ Position current = toVisit.poll(); if (fire.elementsPositions.contains(current)){ return firstMove.get(current);} - for (Position adjacent : neighbors(current)) { + for (Position adjacent : neighborsWithoutSelectedElements(current, mountain)) { if (seen.contains(adjacent)) continue; toVisit.add(adjacent); seen.add(adjacent); @@ -39,9 +39,5 @@ public abstract class AbstractFireFighters extends AbstractElements{ - public void initializeElements(int count, int rowCount, int columnCount){ - elementsPositions = new ArrayList<>(); - for(int i = 0; i < count; i++) - elementsPositions.add(randomPosition(rowCount, columnCount)); - } + } diff --git a/src/main/java/model/Cloud.java b/src/main/java/model/Cloud.java index 119eb4f87121985a29d55b105464fb496bbc340c..9703fec7fb3328eb5e4048e003b7c4e0430c5c4d 100644 --- a/src/main/java/model/Cloud.java +++ b/src/main/java/model/Cloud.java @@ -6,15 +6,12 @@ import java.util.ArrayList; import java.util.List; public class Cloud extends AbstractElements{ - List<Position> elementsPositions; Fire fire; public Cloud(int columnCount, int rowCount, Fire fire) { - this.columnCount = columnCount; - this.rowCount = rowCount; + super(columnCount, rowCount, ModelElement.CLOUD); this.fire = fire; - this.modelElement = ModelElement.CLOUD; } @Override public void nextMove() { @@ -28,12 +25,4 @@ public class Cloud extends AbstractElements{ } - @Override - public void initializeElements(int count, int rowCount, int columnCount) { - elementsPositions = new ArrayList<>(); - for (int i = 0; i < count; i++) { - elementsPositions.add(randomPosition(rowCount, columnCount)); - } - System.out.println(elementsPositions); - } } diff --git a/src/main/java/model/Elements.java b/src/main/java/model/Elements.java index bd739a3a3c97bbdcb40c81edd3a754ccf7864039..dd0a0ea850f01f4c658c5422a5381c6ab829a111 100644 --- a/src/main/java/model/Elements.java +++ b/src/main/java/model/Elements.java @@ -18,4 +18,5 @@ public interface Elements { ModelElement getModelElement(); + } diff --git a/src/main/java/model/Fire.java b/src/main/java/model/Fire.java index 7ac5d24cb7cf56737f6a492ad39410a5eefa4479..5436603751aced8b6d73a58529f4169b3c13a7c3 100644 --- a/src/main/java/model/Fire.java +++ b/src/main/java/model/Fire.java @@ -4,13 +4,14 @@ import util.Position; import java.util.*; public class Fire extends AbstractElements{ - public List<Position> elementsPositions; - public Fire(int columnCount, int rowCount){ - elementsPositions = new ArrayList<>(); - this.columnCount = columnCount; - this.rowCount = rowCount; - this.modelElement = ModelElement.FIRE; + Mountain mountain; + Road road; + + public Fire(int columnCount, int rowCount, Mountain mountain,Road road){ + super(columnCount, rowCount, ModelElement.FIRE); + this.mountain = mountain; + this.road = road; } public void nextMove(){ @@ -18,7 +19,7 @@ public class Fire extends AbstractElements{ // propagate the fire to the adjacent cells List<Position> newelementsPositions = new ArrayList<>(); for (Position firePosition : elementsPositions) { - List<Position> neighborPositions = neighbors(firePosition); + List<Position> neighborPositions = neighborsWithoutSelectedElements(firePosition, mountain, road); newelementsPositions.addAll(neighborPositions); } // check if the new fire positions are not already on fire @@ -27,13 +28,6 @@ public class Fire extends AbstractElements{ elementsPositions.add(newFirePosition); } - @Override - public void initializeElements(int count, int rowCount, int columnCount) { - elementsPositions = new ArrayList<>(); - for(int i = 0; i < count; i++) - elementsPositions.add(randomPosition(rowCount, columnCount)); - } - public void extinguishs(List<Position> firefighterPositions){ for (Position firefighterPosition : firefighterPositions) { diff --git a/src/main/java/model/FireFighterPerson.java b/src/main/java/model/FireFighterPerson.java index 5f5f22c431f23449b2ed14f93ce6bbfe66472d69..51b416146e8b6c3fa962c794f71492da3e1ba5da 100644 --- a/src/main/java/model/FireFighterPerson.java +++ b/src/main/java/model/FireFighterPerson.java @@ -6,9 +6,8 @@ import java.util.ArrayList; import java.util.List; public class FireFighterPerson extends AbstractFireFighters{ - public FireFighterPerson(int columnCount, int rowCount, Fire fire) { - super(columnCount, rowCount, fire); - this.modelElement = ModelElement.FIREFIGHTER; + public FireFighterPerson(int columnCount, int rowCount, Fire fire, Mountain mountain) { + super(columnCount, rowCount, fire, mountain, ModelElement.FIREFIGHTER); } @Override diff --git a/src/main/java/model/FireTruck.java b/src/main/java/model/FireTruck.java index 74a46b1263bea9e638f15411f565f595712fe9ae..0ac935a5235f39027be67900514052bdecfd7732 100644 --- a/src/main/java/model/FireTruck.java +++ b/src/main/java/model/FireTruck.java @@ -6,9 +6,9 @@ import java.util.ArrayList; import java.util.List; public class FireTruck extends AbstractFireFighters{ - public FireTruck(int columnCount, int rowCount, Fire fire) { - super(columnCount, rowCount, fire); - this.modelElement = ModelElement.FIRETRUCK; + public FireTruck(int columnCount, int rowCount, Fire fire, Mountain mountain) { + super(columnCount, rowCount, fire, mountain, ModelElement.FIRETRUCK); + } public void nextMove(){ diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java index ec6762caf2716b9f92d1c74f680c2ff274ab6874..414496858aaf12a782c8794eb0c313628f41bfee 100644 --- a/src/main/java/model/FirefighterBoard.java +++ b/src/main/java/model/FirefighterBoard.java @@ -16,6 +16,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> { private final int initialFirefighterCount; private final int initialCloudCount; private final int initialFireTruckCount; + private final int initialMountainCount; + private final int initialRoadCount; private int step = 0; @@ -25,6 +27,10 @@ public class FirefighterBoard implements Board<List<ModelElement>> { public FireTruck fireTrucks; public Cloud cloud; + public Mountain mountain; + + public Road road; + public FirefighterBoard(int columnCount, int rowCount, int[] elementsCount) { this.columnCount = columnCount; this.rowCount = rowCount; @@ -33,13 +39,18 @@ public class FirefighterBoard implements Board<List<ModelElement>> { this.initialFirefighterCount = elementsCount[1]; this.initialCloudCount = elementsCount[2]; this.initialFireTruckCount = elementsCount[3]; + this.initialMountainCount = elementsCount[4]; + this.initialRoadCount = elementsCount[5]; - fire = new Fire(columnCount, rowCount); - fireFighters = new FireFighterPerson(columnCount, rowCount, fire); + mountain = new Mountain(columnCount, rowCount); + road = new Road(columnCount, rowCount); + fire = new Fire(columnCount, rowCount, mountain, road); + fireFighters = new FireFighterPerson(columnCount, rowCount, fire, mountain); cloud = new Cloud(columnCount, rowCount, fire); - fireTrucks = new FireTruck(columnCount, rowCount, fire); + fireTrucks = new FireTruck(columnCount, rowCount, fire, mountain); + - elements = new Elements[]{fire, fireFighters, cloud, fireTrucks}; + elements = new Elements[]{fire, fireFighters, cloud, fireTrucks, mountain, road}; initializeElements(); } @@ -49,6 +60,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> { fireFighters.initializeElements(initialFirefighterCount, rowCount, columnCount); cloud.initializeElements(initialCloudCount, rowCount, columnCount); fireTrucks.initializeElements(initialFireTruckCount, rowCount, columnCount); + mountain.initializeElements(initialMountainCount, rowCount, columnCount); + road.initializeElements(initialRoadCount, rowCount, columnCount); } @@ -75,6 +88,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { public List<Position> updateToNextGeneration() { + List<Position> modifiedElements = new ArrayList<>(); for (Elements element : elements) { @@ -92,6 +106,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { fire.extinguishs(fireTrucks.getElementsPositions()); fire.extinguishs(cloud.getElementsPositions()); + if (step % 2 == 0) fire.nextMove(); @@ -101,6 +116,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { modifiedElements.addAll(element.getElementsPositions()); } + return modifiedElements; } @@ -129,6 +145,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> { case FIREFIGHTER -> fireFighters.addElement(position); case CLOUD -> cloud.addElement(position); case FIRETRUCK -> fireTrucks.addElement(position); + case MOUNTAIN -> mountain.addElement(position); + case ROAD -> road.addElement(position); } } } diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java index 4170a339d21d0e0d0c59d41bfdd584413893f9ca..666ee3291df52184406cf4be1ee19e8511f50db6 100644 --- a/src/main/java/model/ModelElement.java +++ b/src/main/java/model/ModelElement.java @@ -1,5 +1,5 @@ package model; public enum ModelElement { - FIREFIGHTER, FIRE, CLOUD, FIRETRUCK + FIREFIGHTER, FIRE, CLOUD, FIRETRUCK, MOUNTAIN, ROAD } diff --git a/src/main/java/model/Mountain.java b/src/main/java/model/Mountain.java new file mode 100644 index 0000000000000000000000000000000000000000..d83320aca0af36002df2737bfed60f0e02d4a73a --- /dev/null +++ b/src/main/java/model/Mountain.java @@ -0,0 +1,12 @@ +package model; + +public class Mountain extends AbstractElements{ + + public Mountain(int columnCount, int rowCount){ + super(columnCount, rowCount, ModelElement.MOUNTAIN); + } + @Override + public void nextMove() { + } + +} diff --git a/src/main/java/model/Road.java b/src/main/java/model/Road.java new file mode 100644 index 0000000000000000000000000000000000000000..686a4324b08fbe6a6a88416184f18d77061388a8 --- /dev/null +++ b/src/main/java/model/Road.java @@ -0,0 +1,12 @@ +package model; + +public class Road extends AbstractElements{ + + public Road(int columnCount, int rowCount){ + super(columnCount, rowCount, ModelElement.ROAD); + } + @Override + public void nextMove() { + + } +} diff --git a/src/main/java/view/ViewElement.java b/src/main/java/view/ViewElement.java index 0c8330f8e54ef34166479591f1e46e39c483488d..5370d54a426132fe73180f42014f5dc888a1cd38 100644 --- a/src/main/java/view/ViewElement.java +++ b/src/main/java/view/ViewElement.java @@ -3,7 +3,7 @@ package view; import javafx.scene.paint.Color; public enum ViewElement { - FIREFIGHTER(Color.BLUE), FIRE(Color.RED), EMPTY(Color.WHITE), CLOUD(Color.GRAY), FIRETRUCK(Color.CYAN); + FIREFIGHTER(Color.BLUE), FIRE(Color.RED), EMPTY(Color.WHITE), CLOUD(Color.GRAY), FIRETRUCK(Color.CYAN), MOUNTAIN(Color.BROWN), ROAD(Color.BLACK); final Color color; ViewElement(Color color) { this.color = color;