diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index bbd0ac35915d976a3cf79e3b8258858a91fe1220..260a1df48eae1a5eb6b71d1df5d95b561da5e66c 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -51,9 +51,9 @@ 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(){ board.updateToNextGeneration(); @@ -109,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) { grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight); - this.setModel(new GameBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount)); + board = new GameBoard(rowCount,columnCount,initialFireCount,initialFirefighterCount); + board.initializeElements(); repaintGrid(); } diff --git a/src/main/java/model/Board.java b/src/main/java/model/Board.java index 08848cccaecdaccabbe70db966a5534e8aac4964..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. */ - void updateToNextGeneration(); + void updateToNextGeneration(); /** * Reset the board to its initial state. diff --git a/src/main/java/model/Builder/ConcreteGameBuilder.java b/src/main/java/model/Builder/ConcreteGameBuilder.java index 2a07975b0ef8747d4ada9e0d2524d2e375a65b5f..0c367e38c7129e93b09c75108aa6571cc8c95a2b 100644 --- a/src/main/java/model/Builder/ConcreteGameBuilder.java +++ b/src/main/java/model/Builder/ConcreteGameBuilder.java @@ -41,4 +41,4 @@ public class ConcreteGameBuilder implements GameBuilder{ 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/FireFirefighterBuilder.java b/src/main/java/model/Builder/FireFirefighterBuilder.java index 45e1167f6c97486125d90f6896ce65d735bb9397..5af512c580daf48dd3a43f94d3dd962127381e29 100644 --- a/src/main/java/model/Builder/FireFirefighterBuilder.java +++ b/src/main/java/model/Builder/FireFirefighterBuilder.java @@ -1,16 +1,11 @@ package model.Builder; -import model.GameBoard; - public class FireFirefighterBuilder { - - - public void Build(int fires, int firefighters) { ConcreteGameBuilder concreteGameBuilder; concreteGameBuilder =new ConcreteGameBuilder(); concreteGameBuilder.setFire(fires) - .setFireFighter(firefighters) - .build(); + .setFireFighter(firefighters) + .build(); } } diff --git a/src/main/java/model/Builder/GameBuilder.java b/src/main/java/model/Builder/GameBuilder.java index 3898f3ccb6dbf5e018f063df2f48d413e5d652f8..603ed19ba8f6b57d6b97439f6f5fef42e56c9488 100644 --- a/src/main/java/model/Builder/GameBuilder.java +++ b/src/main/java/model/Builder/GameBuilder.java @@ -1,13 +1,14 @@ package model.Builder; - public interface GameBuilder { - GameBuilder setFire(int fire); - GameBuilder setFireFighter(int fireFighter); - GameBuilder setCloud(int cloud); - GameBuilder setMotorizedFireFighter(int motorizedFireFighter); - GameBuilder setMountain(int mountain); - - // TODO: 15/11/2023 la suite - GameManage build(); +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 index 12e699bf04e33fb756d0f880560a503842edd3d1..2a8c2d8759b48eb74e604c441d473ab4fe3e7b86 100644 --- a/src/main/java/model/Builder/GameManage.java +++ b/src/main/java/model/Builder/GameManage.java @@ -1,15 +1,8 @@ package model.Builder; import javafx.scene.paint.Color; -import model.BoardElement; -import model.ExtinguishFire.Cloud; import model.ExtinguishFire.FireFighter; import model.Flammable.Fire; -import model.GameBoard; -import util.Position; - -import java.util.ArrayList; -import java.util.HashMap; public class GameManage { private final int fires; @@ -28,10 +21,10 @@ public class GameManage { this.motorizedFireFighters = motorizedFireFighters; this.roads = roads; this.mountains = mountains; - Initialise(); + Initialize(); } - public void Initialise(){ + public void Initialize(){ for(int i=0;i<fires;i++) { new Fire(Color.RED); } @@ -45,3 +38,4 @@ public class GameManage { } } + diff --git a/src/main/java/model/ExtinguishFire/ExtinguishFire.java b/src/main/java/model/ExtinguishFire/ExtinguishFire.java index d6f980821be13562578e43eefee5b210c7e78704..4e5e787dffbd8188a33ba9729a5aed8aa8aa4011 100644 --- a/src/main/java/model/ExtinguishFire/ExtinguishFire.java +++ b/src/main/java/model/ExtinguishFire/ExtinguishFire.java @@ -1,6 +1,7 @@ package model.ExtinguishFire; import model.BoardElement; +import model.GameBoard; import util.Position; import java.util.ArrayList; @@ -9,7 +10,6 @@ import java.util.List; public interface ExtinguishFire extends BoardElement { - - void update(); + void update(GameBoard gameBoard , Position position); } diff --git a/src/main/java/model/ExtinguishFire/FireFighter.java b/src/main/java/model/ExtinguishFire/FireFighter.java index 5fa47da19c17b3e6237df5535c59c0551cda12b5..0d7aa63706ebff471c18b73527a9f708c2d18126 100644 --- a/src/main/java/model/ExtinguishFire/FireFighter.java +++ b/src/main/java/model/ExtinguishFire/FireFighter.java @@ -2,7 +2,6 @@ package model.ExtinguishFire; import javafx.scene.paint.Color; import model.BoardElement; -import model.Flammable.Fire; import model.GameBoard; import model.Visitor.CrossMountain; import model.Visitor.FireFinder; @@ -12,10 +11,11 @@ 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 FireFighter implements ExtinguishFire{ +public class FireFighter implements ExtinguishFire { Color color; public FireFighter(Color color){ this.color=color; @@ -35,38 +35,78 @@ public class FireFighter implements ExtinguishFire{ 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) { + 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(this); - else { - ArrayList<BoardElement> boardElements = new ArrayList<>(); - boardElements.add(this); - elementPosition.put(position, boardElements); + if (canInitialise) { + break; } - + position = GameBoard.randomPosition(); + if (!elementPosition.containsKey(position)) break; } - ArrayList<BoardElement> boardElements = new ArrayList<>(); - boardElements.add(this); - 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 void update() { + public void update(GameBoard gameBoard, Position position) { - } + HashMap<Position, ArrayList<BoardElement>> elementPositionCopie = new HashMap<>(); + for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()){ + elementPositionCopie.put(entry.getKey(),entry.getValue()); + } + List<Position> firePositions = new ArrayList<>(); + for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPositionCopie.entrySet()) { + for (BoardElement element : entry.getValue()) { + if (element.accept(new FireFinder())) { + firePositions.add(entry.getKey()); + } + } + } + Position newFirefighterPosition = gameBoard.neighborClosestToFire(position); + if(elementPositionCopie.containsKey(newFirefighterPosition)){ + elementPositionCopie.get(newFirefighterPosition).add(new FireFighter(Color.BLUE)); + } + else{ + ArrayList<BoardElement> boardElements = new ArrayList<>(); + boardElements.add(new FireFighter(Color.BLUE)); + elementPosition.put(newFirefighterPosition,boardElements); + } + gameBoard.extinguish(newFirefighterPosition); + List<Position> neighborFirePositions = gameBoard.neighbors(newFirefighterPosition).stream() + .filter(firePositions::contains).toList(); + for(Position newposition : neighborFirePositions){ + if(elementPositionCopie.containsKey(newposition)){ + elementPosition.get(newposition).add(new FireFighter(Color.BLUE)); + } + else{ + ArrayList<BoardElement> boardElements = new ArrayList<>(); + boardElements.add(new FireFighter(Color.BLUE)); + elementPosition.put(newposition,boardElements); + } + } + + for(Position firePosition : neighborFirePositions) { + gameBoard.extinguish(firePosition); + } + + } } + diff --git a/src/main/java/model/Flammable/Fire.java b/src/main/java/model/Flammable/Fire.java index aa9641ce07b735da8c7895da9bf1590395e9c242..e3bee196be794157e60e9a463f70cda724448502 100644 --- a/src/main/java/model/Flammable/Fire.java +++ b/src/main/java/model/Flammable/Fire.java @@ -35,32 +35,32 @@ public class Fire implements Flammable{ FireFinder fireFinder=new FireFinder(); Position position = GameBoard.randomPosition(); boolean canInitialise; - if(GameBoard.elementPosition.containsKey(position)) { - for (;;) { - canInitialise=true; - for (BoardElement element : GameBoard.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(!GameBoard.elementPosition.containsKey(position))break; - } - 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); - } + } + if(canInitialise){ + break; + } + position = GameBoard.randomPosition(); + if(!GameBoard.elementPosition.containsKey(position))break; } - ArrayList<BoardElement> boardElements = new ArrayList<>(); - boardElements.add(this); - GameBoard.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 // TODO: 15/11/2023 @@ -69,27 +69,30 @@ public class Fire implements Flammable{ if (gameBoard.stepNumber() % 2 == 0) { List<Position> newFirePositions = new ArrayList<>(); newFirePositions.addAll(gameBoard.neighbors(position)); - for(Position newPosition : newFirePositions){ - 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())){ - GameBoard.elementPosition.get(newPosition).add(this); + for(Position newPosition : newFirePositions){ + 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())){ + GameBoard.elementPosition.get(newPosition).add(this); + } } + + } + else{ + ArrayList<BoardElement> boardElements = new ArrayList<>(); + boardElements.add(this); + GameBoard.elementPosition.put(newPosition,boardElements); + System.out.println(GameBoard.elementPosition.get(position).get(0).getColor()); } } - else{ - ArrayList<BoardElement> boardElements = new ArrayList<>(); - boardElements.add(this); - GameBoard.elementPosition.put(newPosition,boardElements); - System.out.println(GameBoard.elementPosition.get(position).get(0).getColor()); - } - - } } } } + + + diff --git a/src/main/java/model/Flammable/Flammable.java b/src/main/java/model/Flammable/Flammable.java index 744b2dc702817ac5390573eaaa5bd5e45f63e3ae..b21f82b9a9ddc487a95a82902a89d4631ae608ce 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(); - void update(GameBoard gameBoard, Position position); } diff --git a/src/main/java/model/GameBoard.java b/src/main/java/model/GameBoard.java index ad5f6672f177344d6be6cb43fdd7eccd5fcc8dc2..216b267c9659dee78e790d0bb092e3ea284f2546 100644 --- a/src/main/java/model/GameBoard.java +++ b/src/main/java/model/GameBoard.java @@ -1,10 +1,8 @@ package model; -import javafx.scene.paint.Color; import model.Builder.FireFirefighterBuilder; import model.Builder.GameManage; -import model.ExtinguishFire.FireFighter; -import model.Flammable.Fire; +import model.ExtinguishFire.ExtinguishFire; import model.Flammable.Flammable; import model.Visitor.FireFinder; import util.Position; @@ -14,11 +12,12 @@ import java.util.*; public class GameBoard implements Board{ static int columnCount; static int rowCount; - + private int initialFireCount; + private int initialFirefighterCount; private int step = 0; static Random randomGenerator = new Random(); - public HashMap<Position, ArrayList<BoardElement>> getElementPosition() { + public HashMap<Position, ArrayList<BoardElement>> getElementPosition() { return elementPosition; } @@ -27,8 +26,13 @@ public class GameBoard implements Board{ public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount) { this.columnCount = columnCount; this.rowCount = rowCount; + this.initialFireCount = initialFireCount; + this.initialFirefighterCount = initialFirefighterCount; + } + + public void initializeElements(){ FireFirefighterBuilder fireFirefighterBuilder=new FireFirefighterBuilder(); - fireFirefighterBuilder.Build(initialFireCount,initialFirefighterCount); + fireFirefighterBuilder.Build(this.initialFireCount,this.initialFirefighterCount); } public static Position randomPosition() { @@ -37,18 +41,27 @@ public class GameBoard implements Board{ @Override public void updateToNextGeneration() { HashMap<Position, ArrayList<BoardElement>> elementPositionCopie = new HashMap<>(); - for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPosition.entrySet()){ + for (Map.Entry<Position, ArrayList<BoardElement>> entry : this.elementPosition.entrySet()){ elementPositionCopie.put(entry.getKey(),entry.getValue()); } for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPositionCopie.entrySet()){ for(BoardElement element : entry.getValue()){ - if (element.accept(new FireFinder())){ - Flammable element1 = (Flammable) element; + if (!element.accept(new FireFinder())){ + ExtinguishFire element1 = (ExtinguishFire) element; element1.update(this,entry.getKey()); } } } + /*for (Map.Entry<Position, ArrayList<BoardElement>> entryCopie : elementPositionCopie.entrySet()){ + for(BoardElement element : entryCopie.getValue()){ + + if (element.accept(new FireFinder())){ + Flammable element1 = (Flammable) element; + element1.update(this,entryCopie.getKey()); + } + } + }*/ step++; @@ -79,7 +92,9 @@ public class GameBoard implements Board{ @Override public void reset() { - + step = 0; + elementPosition.clear(); + initializeElements(); } @Override @@ -96,5 +111,43 @@ public class GameBoard implements Board{ return list; } + public Position neighborClosestToFire(Position position) { + FireFinder fireFinder = new FireFinder(); + Set<Position> firePositions = new HashSet<>(); + Set<Position> seen = new HashSet<>(); + HashMap<Position, Position> firstMove = new HashMap<>(); + Queue<Position> toVisit = new LinkedList<>(neighbors(position)); + for (Map.Entry<Position, ArrayList<BoardElement>> entry : this.elementPosition.entrySet()){ + for(BoardElement element : entry.getValue()){ + if (element.accept(fireFinder)){ + firePositions.add(entry.getKey()); + } + } + } + for (Position initialMove : toVisit) + firstMove.put(initialMove, initialMove); + while (!toVisit.isEmpty()) { + Position current = toVisit.poll(); + if (firePositions.contains(current)) + return firstMove.get(current); + for (Position adjacent : neighbors(current)) { + if (seen.contains(adjacent)) continue; + toVisit.add(adjacent); + seen.add(adjacent); + firstMove.put(adjacent, firstMove.get(current)); + } + } + return position; + } + + public void extinguish(Position position) { + FireFinder fireFinder = new FireFinder(); + for (BoardElement boardElement : elementPosition.get(position)){ + if (boardElement.accept(fireFinder)){ + this.elementPosition.get(position).remove(boardElement); + break; + } + } + } + } -} 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; - } -}