Skip to content
Snippets Groups Projects
Commit 7f1284a7 authored by HEBBACHE Mohamed's avatar HEBBACHE Mohamed
Browse files

Merge remote-tracking branch 'origin/main'

# Conflicts:
#	src/main/java/model/Board.java
#	src/main/java/model/Builder/ConcreteGameBuilder.java
#	src/main/java/model/Builder/FireFirefighterBuilder.java
#	src/main/java/model/Builder/GameBuilder.java
#	src/main/java/model/Builder/GameManage.java
#	src/main/java/model/ExtinguishFire/ExtinguishFire.java
#	src/main/java/model/ExtinguishFire/FireFighter.java
#	src/main/java/model/Flammable/Fire.java
#	src/main/java/model/Flammable/Flammable.java
#	src/main/java/model/GameBoard.java
parents 20414c59 a0080968
No related branches found
No related tags found
No related merge requests found
Showing with 197 additions and 146 deletions
...@@ -51,9 +51,9 @@ public class Controller { ...@@ -51,9 +51,9 @@ public class Controller {
pauseToggleButton.setSelected(true); pauseToggleButton.setSelected(true);
} }
private void setModel(GameBoard gameBoard) { /* private void setModel(GameBoard gameBoard) {
this.board = requireNonNull(gameBoard, "GameBoard.model is null"); this.board = requireNonNull(gameBoard, "GameBoard.model is null");
} }*/
private void updateBoard(){ private void updateBoard(){
board.updateToNextGeneration(); board.updateToNextGeneration();
...@@ -111,7 +111,8 @@ public class Controller { ...@@ -111,7 +111,8 @@ public class Controller {
public void initialize(int squareWidth, int squareHeight, int columnCount, 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); grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
this.setModel(new GameBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount)); board = new GameBoard(rowCount,columnCount,initialFireCount,initialFirefighterCount);
board.initializeElements();
repaintGrid(); repaintGrid();
} }
......
package model.Builder; package model.Builder;
import model.GameBoard;
public class FireFirefighterBuilder { public class FireFirefighterBuilder {
public void Build(int fires, int firefighters) { public void Build(int fires, int firefighters) {
ConcreteGameBuilder concreteGameBuilder; ConcreteGameBuilder concreteGameBuilder;
concreteGameBuilder =new ConcreteGameBuilder(); concreteGameBuilder =new ConcreteGameBuilder();
......
package model.Builder; package model.Builder;
public interface GameBuilder { public interface GameBuilder {
GameBuilder setFire(int fire);
GameBuilder setFireFighter(int fireFighter); model.Builder.GameBuilder setFire(int fire);
GameBuilder setCloud(int cloud); model.Builder.GameBuilder setFireFighter(int fireFighter);
GameBuilder setMotorizedFireFighter(int motorizedFireFighter); model.Builder.GameBuilder setCloud(int cloud);
GameBuilder setMountain(int mountain); model.Builder.GameBuilder setMotorizedFireFighter(int motorizedFireFighter);
model.Builder.GameBuilder setMountain(int mountain);
// TODO: 15/11/2023 la suite // TODO: 15/11/2023 la suite
GameManage build(); GameManage build();
......
package model.Builder; package model.Builder;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import model.BoardElement;
import model.ExtinguishFire.Cloud;
import model.ExtinguishFire.FireFighter; import model.ExtinguishFire.FireFighter;
import model.Flammable.Fire; import model.Flammable.Fire;
import model.GameBoard;
import util.Position;
import java.util.ArrayList;
import java.util.HashMap;
public class GameManage { public class GameManage {
private final int fires; private final int fires;
...@@ -28,10 +21,10 @@ public class GameManage { ...@@ -28,10 +21,10 @@ public class GameManage {
this.motorizedFireFighters = motorizedFireFighters; this.motorizedFireFighters = motorizedFireFighters;
this.roads = roads; this.roads = roads;
this.mountains = mountains; this.mountains = mountains;
Initialise(); Initialize();
} }
public void Initialise(){ public void Initialize(){
for(int i=0;i<fires;i++) { for(int i=0;i<fires;i++) {
new Fire(Color.RED); new Fire(Color.RED);
} }
...@@ -45,3 +38,4 @@ public class GameManage { ...@@ -45,3 +38,4 @@ public class GameManage {
} }
} }
package model.ExtinguishFire; package model.ExtinguishFire;
import model.BoardElement; import model.BoardElement;
import model.GameBoard;
import util.Position; import util.Position;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -9,7 +10,6 @@ import java.util.List; ...@@ -9,7 +10,6 @@ import java.util.List;
public interface ExtinguishFire extends BoardElement { public interface ExtinguishFire extends BoardElement {
void update(GameBoard gameBoard , Position position);
void update();
} }
...@@ -2,7 +2,6 @@ package model.ExtinguishFire; ...@@ -2,7 +2,6 @@ package model.ExtinguishFire;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import model.BoardElement; import model.BoardElement;
import model.Flammable.Fire;
import model.GameBoard; import model.GameBoard;
import model.Visitor.CrossMountain; import model.Visitor.CrossMountain;
import model.Visitor.FireFinder; import model.Visitor.FireFinder;
...@@ -12,6 +11,7 @@ import util.Position; ...@@ -12,6 +11,7 @@ import util.Position;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import static model.GameBoard.elementPosition; import static model.GameBoard.elementPosition;
...@@ -66,7 +66,47 @@ public class FireFighter implements ExtinguishFire{ ...@@ -66,7 +66,47 @@ public class FireFighter implements ExtinguishFire{
} }
@Override @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);
}
}
}
...@@ -93,3 +93,6 @@ public class Fire implements Flammable{ ...@@ -93,3 +93,6 @@ public class Fire implements Flammable{
} }
} }
...@@ -10,7 +10,5 @@ import java.util.List; ...@@ -10,7 +10,5 @@ import java.util.List;
public interface Flammable extends BoardElement{ public interface Flammable extends BoardElement{
void initialize();
void update(GameBoard gameBoard, Position position); void update(GameBoard gameBoard, Position position);
} }
package model; package model;
import javafx.scene.paint.Color;
import model.Builder.FireFirefighterBuilder; import model.Builder.FireFirefighterBuilder;
import model.Builder.GameManage; import model.Builder.GameManage;
import model.ExtinguishFire.FireFighter; import model.ExtinguishFire.ExtinguishFire;
import model.Flammable.Fire;
import model.Flammable.Flammable; import model.Flammable.Flammable;
import model.Visitor.FireFinder; import model.Visitor.FireFinder;
import util.Position; import util.Position;
...@@ -14,7 +12,8 @@ import java.util.*; ...@@ -14,7 +12,8 @@ import java.util.*;
public class GameBoard implements Board{ public class GameBoard implements Board{
static int columnCount; static int columnCount;
static int rowCount; static int rowCount;
private int initialFireCount;
private int initialFirefighterCount;
private int step = 0; private int step = 0;
static Random randomGenerator = new Random(); static Random randomGenerator = new Random();
...@@ -27,8 +26,13 @@ public class GameBoard implements Board{ ...@@ -27,8 +26,13 @@ public class GameBoard implements Board{
public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount) { public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount) {
this.columnCount = columnCount; this.columnCount = columnCount;
this.rowCount = rowCount; this.rowCount = rowCount;
this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount;
}
public void initializeElements(){
FireFirefighterBuilder fireFirefighterBuilder=new FireFirefighterBuilder(); FireFirefighterBuilder fireFirefighterBuilder=new FireFirefighterBuilder();
fireFirefighterBuilder.Build(initialFireCount,initialFirefighterCount); fireFirefighterBuilder.Build(this.initialFireCount,this.initialFirefighterCount);
} }
public static Position randomPosition() { public static Position randomPosition() {
...@@ -37,18 +41,27 @@ public class GameBoard implements Board{ ...@@ -37,18 +41,27 @@ public class GameBoard implements Board{
@Override @Override
public void updateToNextGeneration() { public void updateToNextGeneration() {
HashMap<Position, ArrayList<BoardElement>> elementPositionCopie = new HashMap<>(); 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()); elementPositionCopie.put(entry.getKey(),entry.getValue());
} }
for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPositionCopie.entrySet()){ for (Map.Entry<Position, ArrayList<BoardElement>> entry : elementPositionCopie.entrySet()){
for(BoardElement element : entry.getValue()){ for(BoardElement element : entry.getValue()){
if (element.accept(new FireFinder())){ if (!element.accept(new FireFinder())){
Flammable element1 = (Flammable) element; ExtinguishFire element1 = (ExtinguishFire) element;
element1.update(this,entry.getKey()); 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++; step++;
...@@ -79,7 +92,9 @@ public class GameBoard implements Board{ ...@@ -79,7 +92,9 @@ public class GameBoard implements Board{
@Override @Override
public void reset() { public void reset() {
step = 0;
elementPosition.clear();
initializeElements();
} }
@Override @Override
...@@ -96,5 +111,43 @@ public class GameBoard implements Board{ ...@@ -96,5 +111,43 @@ public class GameBoard implements Board{
return list; 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;
}
}
} }
}
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;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment