Skip to content
Snippets Groups Projects
Commit 565e3537 authored by BACHTARZI Imed eddine's avatar BACHTARZI Imed eddine
Browse files

cloud DONE

parent 698cbfaa
Branches
No related tags found
No related merge requests found
Pipeline #39331 passed
...@@ -18,7 +18,7 @@ public class FFBoard implements Board<List<ModelElement>> { ...@@ -18,7 +18,7 @@ public class FFBoard implements Board<List<ModelElement>> {
private final Random randomGenerator = new Random(); private final Random randomGenerator = new Random();
public FFBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) { public FFBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
boardData=new FFBoardData(); boardData=new FFBoardData(columnCount,rowCount);
FFUpdater=new FFUpdater(); FFUpdater=new FFUpdater();
this.columnCount = columnCount; this.columnCount = columnCount;
this.rowCount = rowCount; this.rowCount = rowCount;
...@@ -42,9 +42,11 @@ public class FFBoard implements Board<List<ModelElement>> { ...@@ -42,9 +42,11 @@ public class FFBoard implements Board<List<ModelElement>> {
public void initializeElements() { public void initializeElements() {
boardData.initialize(); boardData.initialize();
FFUpdater= new FFUpdater();
for (int index = 0; index < initialFireCount; index++) for (int index = 0; index < initialFireCount; index++)
boardData.getPositions().get(ModelElement.FIRE.ordinal()).add(randomPosition()); boardData.getPositions().get(ModelElement.FIRE.ordinal()).add(randomPosition());
//for (int index = 0; index < initialFireCount; index++)
//boardData.getPositions().get(ModelElement.CLOUD.ordinal()).add(randomPosition());
for (int index = 0; index < initialFirefighterCount; index++) for (int index = 0; index < initialFirefighterCount; index++)
boardData.getPositions().get(ModelElement.FIREFIGHTER.ordinal()).add(randomPosition()); boardData.getPositions().get(ModelElement.FIREFIGHTER.ordinal()).add(randomPosition());
} }
...@@ -56,11 +58,15 @@ public class FFBoard implements Board<List<ModelElement>> { ...@@ -56,11 +58,15 @@ public class FFBoard implements Board<List<ModelElement>> {
@Override @Override
public List<ModelElement> getState(Position position) { public List<ModelElement> getState(Position position) {
List<Position> firefighterPositions=boardData.getPositions().get(ModelElement.FIREFIGHTER.ordinal()); List<Position> firefighterPositions=boardData.getPositions().get(ModelElement.FIREFIGHTER.ordinal());
List<Position> cloudPositions=boardData.getPositions().get(ModelElement.CLOUD.ordinal());
List<Position> firePositions =boardData.getPositions().get(ModelElement.FIRE.ordinal()); List<Position> firePositions =boardData.getPositions().get(ModelElement.FIRE.ordinal());
List<ModelElement> result = new ArrayList<>(); List<ModelElement> result = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions) for (Position firefighterPosition : firefighterPositions)
if (firefighterPosition.equals(position)) if (firefighterPosition.equals(position))
result.add(ModelElement.FIREFIGHTER); result.add(ModelElement.FIREFIGHTER);
for (Position cloudPosition : cloudPositions)
if (cloudPosition.equals(position))
result.add(ModelElement.CLOUD);
if (firePositions.contains(position)) if (firePositions.contains(position))
result.add(ModelElement.FIRE); result.add(ModelElement.FIRE);
return result; return result;
...@@ -81,6 +87,7 @@ public class FFBoard implements Board<List<ModelElement>> { ...@@ -81,6 +87,7 @@ public class FFBoard implements Board<List<ModelElement>> {
modifiedPositions.addAll(updateFires()); modifiedPositions.addAll(updateFires());
boardData.setStep(boardData.getStep()+1); boardData.setStep(boardData.getStep()+1);
return modifiedPositions;*/ return modifiedPositions;*/
List<Position> modifiedPositions = FFUpdater.updateAll(boardData); List<Position> modifiedPositions = FFUpdater.updateAll(boardData);
boardData.setStep(boardData.getStep()+1); boardData.setStep(boardData.getStep()+1);
return modifiedPositions; return modifiedPositions;
...@@ -117,24 +124,17 @@ public class FFBoard implements Board<List<ModelElement>> { ...@@ -117,24 +124,17 @@ public class FFBoard implements Board<List<ModelElement>> {
@Override @Override
public void reset() { public void reset() {
boardData.setStep(0);
initializeElements(); initializeElements();
} }
@Override @Override
public void setState(List<ModelElement> state, Position position) { public void setState(List<ModelElement> state, Position position) {
List<Position> firefighterPositions = boardData.getPositions().get(ModelElement.FIREFIGHTER.ordinal()); for (ModelElement e:state) {
List<Position> firePositions = boardData.getPositions().get(ModelElement.FIRE.ordinal()); boardData.getPositions().get(e.ordinal()).remove(position);
firePositions.remove(position);
for (; ; ) {
if (!firefighterPositions.remove(position)) break;
}
for (ModelElement element : state) {
switch (element) {
case FIRE -> firePositions.add(position);
case FIREFIGHTER -> firefighterPositions.add(position);
} }
for (ModelElement e:state) {
boardData.getPositions().get(e.ordinal()).add(position);
} }
} }
} }
\ No newline at end of file
...@@ -6,14 +6,31 @@ import java.util.*; ...@@ -6,14 +6,31 @@ import java.util.*;
public class FFBoardData implements BoardData{ public class FFBoardData implements BoardData{
private List<List<Position>> positions; private List<List<Position>> positions;
private final Map<Position, List<Position>> neighbors = new HashMap<Position, List<Position>>(); private Map<Position, List<Position>> neighbors = new HashMap<Position, List<Position>>();
private int step; private int step;
private int columnCount,rowCount;
public FFBoardData() { public FFBoardData(int columnCount, int rowCount) {
this.columnCount=columnCount;
this.rowCount=rowCount;
initialize(); initialize();
} }
public void initialize(){ public void initialize(){
step=0; step=0;
neighbors = new HashMap<Position, List<Position>>();
Position[][] ps = new Position[rowCount][columnCount];
for (int column = 0; column < columnCount; column++)
for (int row = 0; row < rowCount; row++)
ps[row][column] = new Position(row, column);
for (int column = 0; column < columnCount; column++)
for (int row = 0; row < rowCount; row++) {
List<Position> list = new ArrayList<>();
if (row > 0) list.add(ps[row - 1][column]);
if (column > 0) list.add(ps[row][column - 1]);
if (row < rowCount - 1) list.add(ps[row + 1][column]);
if (column < columnCount - 1) list.add(ps[row][column + 1]);
getNeighbors().put(ps[row][column], list);
}
positions = new ArrayList<>(); positions = new ArrayList<>();
for (int i = 0; i < ModelElement.values().length; i++) { for (int i = 0; i < ModelElement.values().length; i++) {
positions.add(new ArrayList<>()); positions.add(new ArrayList<>());
......
...@@ -16,8 +16,10 @@ public class Fire extends Element{ ...@@ -16,8 +16,10 @@ public class Fire extends Element{
public List<Position> Update(BoardData boardData, List<Position> modifPositions) { public List<Position> Update(BoardData boardData, List<Position> modifPositions) {
List<Position> firePositions = boardData.getPositions().get(this.type.ordinal()); List<Position> firePositions = boardData.getPositions().get(this.type.ordinal());
List<Position> modifiedPositions = new ArrayList<Position>(modifPositions); List<Position> modifiedPositions = new ArrayList<Position>(modifPositions);
List<Position> newFirePositions = behavior.getNext(boardData,firePositions); List<Position> newFirePositions = behavior.getNext(boardData);
firePositions.removeAll(newFirePositions);
firePositions.addAll(newFirePositions); firePositions.addAll(newFirePositions);
modifiedPositions.removeAll(newFirePositions);
modifiedPositions.addAll(newFirePositions); modifiedPositions.addAll(newFirePositions);
return modifiedPositions; return modifiedPositions;
} }
......
...@@ -13,13 +13,15 @@ public class FireBehavior extends FFBehavior { ...@@ -13,13 +13,15 @@ public class FireBehavior extends FFBehavior {
} }
@Override @Override
public List<Position> getNext(BoardData boardData, List<Position> positions) { public List<Position> getNext(BoardData boardData) {
List<Position> firePositions = boardData.getPositions().get(element.ordinal()); List<Position> firePositions = boardData.getPositions().get(element.ordinal());
List<Position> newFirePositions = new ArrayList<>(); List<Position> newFirePositions = new ArrayList<>();
if (boardData.getStep() % 2 == 0) { if (boardData.getStep() % 2 == 0) {
for (Position fire : firePositions) { for (Position fire : firePositions) {
boardData.getNeighbors().get(fire).removeAll(newFirePositions); for (Position neighbor:boardData.getNeighbors().get(fire)) {
newFirePositions.addAll(boardData.getNeighbors().get(fire)); if (!newFirePositions.contains(neighbor))
newFirePositions.add(neighbor);
}
} }
} }
return newFirePositions; return newFirePositions;
......
...@@ -8,7 +8,6 @@ import java.util.List; ...@@ -8,7 +8,6 @@ import java.util.List;
import java.util.ListIterator; import java.util.ListIterator;
public class FirefighterBehavior extends FFBehavior implements TangibleBehavior<ModelElement>,RemoverBehavior<ModelElement> { public class FirefighterBehavior extends FFBehavior implements TangibleBehavior<ModelElement>,RemoverBehavior<ModelElement> {
ModelElement element;
List<ModelElement> obstacles=new ArrayList<>(List.of(ModelElement.MOUNTAIN)); List<ModelElement> obstacles=new ArrayList<>(List.of(ModelElement.MOUNTAIN));
ModelElement removedElement=ModelElement.FIRE; ModelElement removedElement=ModelElement.FIRE;
TargetStrategy targetStrategy=new TargetStrategy(); TargetStrategy targetStrategy=new TargetStrategy();
...@@ -19,27 +18,26 @@ public class FirefighterBehavior extends FFBehavior implements TangibleBehavior< ...@@ -19,27 +18,26 @@ public class FirefighterBehavior extends FFBehavior implements TangibleBehavior<
@Override @Override
public List<Position> getNext(BoardData boardData, List<Position> modifiedPositions) { public List<Position> getNext(BoardData boardData) {
List<Position> modifiedPosition = new ArrayList<>();
List<Position> firefighterPositions = boardData.getPositions().get(element.ordinal()); List<Position> firefighterPositions = boardData.getPositions().get(element.ordinal());
List<Position> firePositions = boardData.getPositions().get(getElementToRemove().ordinal()); List<Position> firePositions = new ArrayList<>(List.copyOf(boardData.getPositions().get(ModelElement.FIRE.ordinal())));
List<Position> firefighterNewPositions = new ArrayList<>(); List<Position> firefighterNewPositions = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions) { for (Position firefighterPosition : firefighterPositions) {
Position newFirefighterPosition = Position newFirefighterPosition = targetStrategy.neighborClosestToFire(firefighterPosition,firePositions, boardData.getNeighbors());
targetStrategy.neighborClosestToFire(firefighterPosition,
firePositions, boardData.getNeighbors());
firefighterNewPositions.add(newFirefighterPosition); firefighterNewPositions.add(newFirefighterPosition);
remove(boardData,newFirefighterPosition); firePositions.remove(newFirefighterPosition);
modifiedPosition.add(firefighterPosition); firePositions.remove(boardData.getNeighbors().get(newFirefighterPosition));
modifiedPosition.add(newFirefighterPosition); }
List<Position> neighborFirePositions = boardData.getNeighbors().get(newFirefighterPosition).stream() return firefighterNewPositions;
}
public List<Position> remove(BoardData boardData,Position p){
List<Position> firePositions = boardData.getPositions().get(getElementToRemove().ordinal());
List<Position> neighborFirePositions = boardData.getNeighbors().get(p).stream()
.filter(firePositions::contains).toList(); .filter(firePositions::contains).toList();
removePartial(boardData,p);
for (Position firePosition : neighborFirePositions) for (Position firePosition : neighborFirePositions)
remove(boardData,firePosition); removePartial(boardData,firePosition);
modifiedPosition.addAll(neighborFirePositions); return neighborFirePositions;
}
firefighterPositions = firefighterNewPositions;
return modifiedPosition;
} }
@Override @Override
...@@ -53,7 +51,7 @@ public class FirefighterBehavior extends FFBehavior implements TangibleBehavior< ...@@ -53,7 +51,7 @@ public class FirefighterBehavior extends FFBehavior implements TangibleBehavior<
} }
@Override @Override
public void remove(BoardData boardData,Position p) { public void removePartial(BoardData boardData,Position p) {
List<Position> firePositions = boardData.getPositions().get(getElementToRemove().ordinal()); List<Position> firePositions = boardData.getPositions().get(getElementToRemove().ordinal());
firePositions.remove(p); firePositions.remove(p);
} }
......
...@@ -5,6 +5,7 @@ import java.lang.reflect.InvocationTargetException; ...@@ -5,6 +5,7 @@ import java.lang.reflect.InvocationTargetException;
public enum ModelElement { public enum ModelElement {
FIREFIGHTER(StandardFirefighter.class), FIREFIGHTER(StandardFirefighter.class),
FIRE(Fire.class), FIRE(Fire.class),
CLOUD(Cloud.class),
MOUNTAIN(Mountain.class); MOUNTAIN(Mountain.class);
public final Class<?> c; public final Class<?> c;
......
...@@ -12,8 +12,7 @@ public class NoBehavior extends FFBehavior { ...@@ -12,8 +12,7 @@ public class NoBehavior extends FFBehavior {
} }
@Override @Override
public List<Position> getNext(BoardData boardData, List<Position> positions) { public List<Position> getNext(BoardData boardData) {
return positions; return null;
} }
} }
...@@ -5,6 +5,8 @@ import util.Position; ...@@ -5,6 +5,8 @@ import util.Position;
import java.util.List; import java.util.List;
public interface RemoverBehavior<E> extends Behavior { public interface RemoverBehavior<E> extends Behavior {
public void remove(BoardData boardData,Position p); public void removePartial(BoardData boardData,Position p);
public List<Position> remove(BoardData boardData,Position p);
public E getElementToRemove(); public E getElementToRemove();
} }
...@@ -26,23 +26,19 @@ public class StandardFirefighter extends Element { ...@@ -26,23 +26,19 @@ public class StandardFirefighter extends Element {
firePositions.addAll(modifiedList); firePositions.addAll(modifiedList);
return modifiedList;*/ return modifiedList;*/
List<Position> firefighterPositions = boardData.getPositions().get(type.ordinal()); List<Position> firefighterPositions = boardData.getPositions().get(type.ordinal());
List<Position> firePositions = boardData.getPositions().get(ModelElement.FIRE.ordinal()); List<Position> firefighterNewPositions = behavior.getNext(boardData);
List<Position> firefighterNewPositions = new ArrayList<>(); List<Position> neighborFirePositions = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions) {
Position newFirefighterPosition = modifiedPositions.removeAll(firefighterPositions);
targetStrategy.neighborClosestToFire(firefighterPosition, modifiedPositions.removeAll(firefighterNewPositions);
firePositions, boardData.getNeighbors()); modifiedPositions.addAll(firefighterPositions);
firefighterNewPositions.add(newFirefighterPosition); modifiedPositions.addAll(firefighterNewPositions);
remove(boardData,newFirefighterPosition); for (Position p :firefighterNewPositions) {
modifiedPositions.add(firefighterPosition); neighborFirePositions.addAll(((RemoverBehavior)behavior).remove(boardData,p));
modifiedPositions.add(newFirefighterPosition);
List<Position> neighborFirePositions = boardData.getNeighbors().get(newFirefighterPosition).stream()
.filter(firePositions::contains).toList();
for (Position firePosition : neighborFirePositions)
remove(boardData,firePosition);
modifiedPositions.addAll(neighborFirePositions);
} }
firefighterPositions = firefighterNewPositions; modifiedPositions.removeAll(neighborFirePositions);
modifiedPositions.addAll(neighborFirePositions);
boardData.getPositions().set(type.ordinal(),firefighterNewPositions);
return modifiedPositions; return modifiedPositions;
} }
......
...@@ -3,7 +3,7 @@ package view; ...@@ -3,7 +3,7 @@ package view;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
public enum ViewElement { public enum ViewElement {
FIREFIGHTER(Color.BLUE), FIRE(Color.RED),MOUNTAIN(Color.BROWN) , EMPTY(Color.WHITE); FIREFIGHTER(Color.BLUE), FIRE(Color.RED),CLOUD(Color.GRAY) ,MOUNTAIN(Color.BROWN) , EMPTY(Color.WHITE);
final Color color; final Color color;
ViewElement(Color color) { ViewElement(Color color) {
this.color = color; this.color = color;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment