Skip to content
Snippets Groups Projects
Commit 2da50ff2 authored by MEHDI's avatar MEHDI
Browse files

mehdi and mohamed : adding Obstacle abstract class and modifiying FirefighterBoard implementation

parent 08532ee2
No related branches found
No related tags found
No related merge requests found
package model; package model;
import util.Neighbour;
import util.Position; import util.Position;
import java.util.List; import java.util.List;
...@@ -35,6 +36,7 @@ public interface Board<S> { ...@@ -35,6 +36,7 @@ public interface Board<S> {
Map<Position, Extinguisher> getExtinguishers(); Map<Position, Extinguisher> getExtinguishers();
Map<Position, Fire> getFires(); Map<Position, Fire> getFires();
Neighbour getNeighbor();
/** /**
......
...@@ -13,17 +13,17 @@ public class Cloud extends Extinguisher { ...@@ -13,17 +13,17 @@ public class Cloud extends Extinguisher {
element = ModelElement.CLOUD; element = ModelElement.CLOUD;
} }
public List<Position>update(FirefighterBoard firefighterBoard){ public List<Position>update(Board<List<ModelElement>> firefighterBoard){
List<Position> modifiedPositions = new ArrayList<>(); List<Position> modifiedPositions = new ArrayList<>();
Position currentPosition = this.getPosition(); Position currentPosition = this.getPosition();
Position newPosition = firefighterBoard.randomNeighbor(currentPosition); Position newPosition = firefighterBoard.getNeighbor().randomNeighbor(currentPosition);
this.setPosition(newPosition); this.setPosition(newPosition);
modifiedPositions.add(currentPosition); modifiedPositions.add(currentPosition);
modifiedPositions.add(newPosition); modifiedPositions.add(newPosition);
firefighterBoard.extinguish(newPosition); extinguish(firefighterBoard,newPosition);
return modifiedPositions; return modifiedPositions;
} }
......
...@@ -12,6 +12,6 @@ public interface Element { ...@@ -12,6 +12,6 @@ public interface Element {
ModelElement getElement(); ModelElement getElement();
List<Position> update(FirefighterBoard firefighterBoard); List<Position> update(Board<List<ModelElement>> firefighterBoard);
} }
...@@ -37,6 +37,6 @@ public abstract class Extinguisher implements Element{ ...@@ -37,6 +37,6 @@ public abstract class Extinguisher implements Element{
} }
public abstract List<Position> update(FirefighterBoard firefighterBoard); public abstract List<Position> update(Board<List<ModelElement>> firefighterBoard);
} }
...@@ -33,15 +33,15 @@ public class Fire implements Element { ...@@ -33,15 +33,15 @@ public class Fire implements Element {
} }
public List<Position> update(FirefighterBoard firefighterBoard) { public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
List<Position> modifiedPositions = new ArrayList<>(); List<Position> modifiedPositions = new ArrayList<>();
if (firefighterBoard.stepNumber() % 2 == 0) { if (firefighterBoard.stepNumber() % 2 == 0) {
Set<Position> newFirePositions = new HashSet<>(); Set<Position> newFirePositions = new HashSet<>();
for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) { for (Position fire : new HashSet<>(firefighterBoard.getFires().keySet())) {
List<Position> neighboursAvaiable = firefighterBoard.getNeighbors().get(fire); List<Position> neighboursAvaiable = firefighterBoard.getNeighbor().getNeighbors().get(fire);
neighboursAvaiable.removeAll(firefighterBoard.getObstacles().keySet()); neighboursAvaiable.removeAll(firefighterBoard.getObstacles().keySet());
newFirePositions.addAll(firefighterBoard.getNeighbors().get(fire)); newFirePositions.addAll(firefighterBoard.getNeighbor().getNeighbors().get(fire));
} }
......
...@@ -21,20 +21,20 @@ public class FireFighter extends Extinguisher { ...@@ -21,20 +21,20 @@ public class FireFighter extends Extinguisher {
} }
public List<Position> update(FirefighterBoard firefighterBoard){ public List<Position> update(Board<List<ModelElement>> firefighterBoard){
List<Position> modifiedPositions = new ArrayList<>(); List<Position> modifiedPositions = new ArrayList<>();
Position currentPosition = this.getPosition(); Position currentPosition = this.getPosition();
Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, firefighterBoard.getFires().keySet(), firefighterBoard.getNeighbors()); Position newPosition = targetStrategy.neighborClosestToFire(currentPosition, firefighterBoard.getFires().keySet(), firefighterBoard.getNeighbor().getNeighbors());
this.setPosition(newPosition); this.setPosition(newPosition);
modifiedPositions.add(currentPosition); modifiedPositions.add(currentPosition);
modifiedPositions.add(newPosition); modifiedPositions.add(newPosition);
firefighterBoard.extinguish(newPosition); extinguish(firefighterBoard,newPosition);
for (Position neighbor : firefighterBoard.getNeighbors().get(newPosition)) { for (Position neighbor : firefighterBoard.getNeighbor().getNeighbors().get(newPosition)) {
firefighterBoard.extinguish(neighbor); extinguish(firefighterBoard,neighbor);
modifiedPositions.add(neighbor); modifiedPositions.add(neighbor);
} }
......
package model; package model;
import util.Neighbour;
import util.Position; import util.Position;
import util.TargetStrategy; import util.TargetStrategy;
...@@ -18,8 +19,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -18,8 +19,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
private Map<Position, Fire> fires = new HashMap<>(); private Map<Position, Fire> fires = new HashMap<>();
private Map<Position, Extinguisher> extinguishers = new HashMap<>(); private Map<Position, Extinguisher> extinguishers = new HashMap<>();
private Map<Position, Obstacle> obstacles = new HashMap<>(); private Map<Position, Obstacle> obstacles = new HashMap<>();
private final Neighbour neighbour;
private final Map<Position, List<Position>> neighbors = new HashMap<>();
private final Position[][] positions; private final Position[][] positions;
private int step = 0; private int step = 0;
private final Random randomGenerator = new Random(); private final Random randomGenerator = new Random();
...@@ -28,8 +29,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -28,8 +29,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
this.columnCount = columnCount; this.columnCount = columnCount;
this.rowCount = rowCount; this.rowCount = rowCount;
this.positions = new Position[rowCount][columnCount]; this.positions = new Position[rowCount][columnCount];
this.neighbour = new Neighbour(this);
initializePositionsAndNeighbors(); initializePositions();
this.initialFireCount = initialFireCount; this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount; this.initialFirefighterCount = initialFirefighterCount;
...@@ -38,61 +39,37 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -38,61 +39,37 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
initializeElements(); initializeElements();
} }
private void initializePositionsAndNeighbors() { private void initializePositions() {
for (int column = 0; column < columnCount; column++) { for (int column = 0; column < columnCount; column++) {
for (int row = 0; row < rowCount; row++) { for (int row = 0; row < rowCount; row++) {
positions[row][column] = new Position(row, column); positions[row][column] = new Position(row, column);
} }
} }
for (int column = 0; column < columnCount; column++) {
for (int row = 0; row < rowCount; row++) {
neighbors.put(positions[row][column], calculateNeighbors(row, column));
}
}
}
private List<Position> calculateNeighbors(int row, int column) {
List<Position> list = new ArrayList<>();
if (row > 0) list.add(positions[row - 1][column]);
if (column > 0) list.add(positions[row][column - 1]);
if (row < rowCount - 1) list.add(positions[row + 1][column]);
if (column < columnCount - 1) list.add(positions[row][column + 1]);
return list;
} }
public void initializeElements() { public void initializeElements() {
fires.clear(); fires.clear();
extinguishers.clear(); extinguishers.clear();
obstacles.clear(); obstacles.clear();
for (int index = 0; index < initialFireCount; index++) { for (int index = 0; index < initialFireCount; index++) {
Position position = randomPosition(); Position position = randomPosition();
fires.put(position,new Fire(position)); fires.put(position,new Fire(position));
} }
for (int index = 0; index < initialFirefighterCount; index++) { for (int index = 0; index < initialFirefighterCount; index++) {
Position position = randomPosition(); Position position = randomPosition();
extinguishers.put(position,new FireFighter(position)); extinguishers.put(position,new FireFighter(position));
} }
for (int index = 0; index < initialCloudCount; index++) { for (int index = 0; index < initialCloudCount; index++) {
Position position = randomPosition(); Position position = randomPosition();
extinguishers.put(position,new Cloud(position)); extinguishers.put(position,new Cloud(position));
} }
for (int index = 0; index < initialRoadCount; index++) { for (int index = 0; index < initialRoadCount; index++) {
Position position = randomPosition(); Position position = randomPosition();
obstacles.put(position,new Road(position)); obstacles.put(position,new Road(position));
} }
} }
...@@ -115,17 +92,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -115,17 +92,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
if (obstacle.getPosition().equals(position)) result.add(obstacle.getElement()); if (obstacle.getPosition().equals(position)) result.add(obstacle.getElement());
} }
return result; return result;
} }
Position randomNeighbor(Position position) {
List<Position> neighborPositions = neighbors.get(position);
return neighborPositions.get(randomGenerator.nextInt(neighborPositions.size()));
}
@Override @Override
public int rowCount() { public int rowCount() {
return rowCount; return rowCount;
...@@ -136,6 +105,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -136,6 +105,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
return columnCount; return columnCount;
} }
public List<Position> updateToNextGeneration() { public List<Position> updateToNextGeneration() {
Fire fire = new Fire(randomPosition()); Fire fire = new Fire(randomPosition());
...@@ -144,18 +115,15 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -144,18 +115,15 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
for(Extinguisher element : extinguishers.values()){ for(Extinguisher element : extinguishers.values()){
modifiedPositions.addAll(element.update(this)); modifiedPositions.addAll(element.update(this));
} }
modifiedPositions.addAll(fire.update(this)); modifiedPositions.addAll(fire.update(this));
step++; step++;
return modifiedPositions; return modifiedPositions;
} }
public Map<Position, List<Position>> getNeighbors() { public Neighbour getNeighbor() {
return neighbors; return neighbour;
} }
@Override @Override
...@@ -167,9 +135,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -167,9 +135,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
public Map<Position,Fire>getFires(){ public Map<Position,Fire>getFires(){
return this.fires; return this.fires;
} }
@Override @Override
...@@ -181,25 +147,22 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -181,25 +147,22 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
return obstacles; return obstacles;
} }
@Override @Override
public void reset() { public void reset() {
step = 0; step = 0;
initializeElements(); initializeElements();
} }
public void extinguish(Position position) {
if (this.fires.containsKey(position)) {
this.fires.remove(position);
}
}
@Override @Override
public void setState(List<ModelElement> state, Position position) { public void setState(List<ModelElement> state, Position position) {
extinguish(position);
if(extinguishers.containsKey(position)){ if(extinguishers.containsKey(position)){
extinguishers.remove(position); extinguishers.remove(position);
extinguishers.get(position).extinguish(this,position);
} }
......
package model; package model;
public enum ModelElement { public enum ModelElement {
FIREFIGHTER,
FIRE, FIREFIGHTER(10),
CLOUD, FIRE(10),
ROAD; CLOUD(10),
ROAD(5);
ModelElement(int initialNumber) {
}
} }
...@@ -25,10 +25,9 @@ public abstract class Obstacle implements Element{ ...@@ -25,10 +25,9 @@ public abstract class Obstacle implements Element{
return this.element; return this.element;
} }
@Override
public List<Position> update(FirefighterBoard firefighterBoard) { public List<Position> update(Board<List<ModelElement>> firefighterBoard) {
List<Position>positionList = new ArrayList<>(); return null;
return positionList;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment