Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • main
  • variant
2 results

Target

Select target project
  • l22015417/firefighterstarter
  • m19023837/firefighter-starter-mansour-chadi-chahine-rami
  • r24025701/firefighterstarter
  • n24026202/firefighterstarter
  • couetoux.b/firefighterstarter
  • b23027938/firefighterstarter
  • z20039716/fire-fighter
  • a18023913/firefighterstarter
  • o22010261/firefighterstarter
  • b22015516/firefighterstarter
  • alaboure/firefighter-template
  • p21211679/firefighter-luis-parra-yanis-lounadi
  • v23014723/firefighter-project
  • k20014011/firefighter-template
  • m23022217/firefighter-template
  • p20006624/firefighter-template
  • l21221596/firefighter-template
  • s21232465/firefighter-template
  • y21224754/firefighter-template
  • w21225935/firefighter-template
  • h22023886/firefighter-template
  • b21221604/firefighter-template-boucenna-yacine-zeghar-mohamed-lamine
  • c23025119/firefighterstarter
  • b20031964/firefighterstarter
24 results
Select Git revision
  • main
  • variant
2 results
Show changes
Commits on Source (21)
...@@ -88,6 +88,9 @@ public class Controller { ...@@ -88,6 +88,9 @@ public class Controller {
if (squareState.contains(ModelElement.FIRE)){ if (squareState.contains(ModelElement.FIRE)){
return ViewElement.FIRE; return ViewElement.FIRE;
} }
if (squareState.contains(ModelElement.CLOUD)){
return ViewElement.CLOUD;
}
return ViewElement.EMPTY; return ViewElement.EMPTY;
} }
...@@ -126,7 +129,7 @@ public class Controller { ...@@ -126,7 +129,7 @@ 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 FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount)); this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount, initialFireCount));
repaintGrid(); repaintGrid();
} }
......
package model;
import util.Position;
import java.util.*;
import java.util.Map;
public class Cloud {
private Position position;
private final Map<Position, List<Position>> neighbors;
private final Random randomGenerator = new Random();
public Cloud(Position startPosition, Map<Position, List<Position>> neighbors) {
this.position = startPosition;
this.neighbors = neighbors;
}
public void moveAndExtinguishFire(Fire fire) {
Position newPosition = moveToNewPosition();
this.position = newPosition;
extinguishNeighboringFires(fire);
}
private Position moveToNewPosition() {
List<Position> neighborsList = neighbors.get(position);
return neighborsList.get((int) (Math.random() * neighborsList.size()));
}
private void extinguishNeighboringFires(Fire fire) {
List<Position> neighboringPositions = neighbors.get(position);
for (Position neighbor : neighboringPositions) {
if (fire.getFirePositions().contains(neighbor)) {
fire.extinguishFire(neighbor);
}
}
}
public Position getPosition() {
return position;
}
public void extinguishFireCloud(Fire fire) {
fire.getFirePositions().remove(position);
}
}
package model;
import util.Position;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Fire {
private Set<Position> firePositions;
private Map<Position, List<Position>> neighbors;
// private int step =0;
public Fire(Set<Position> firePositions, Map<Position, List<Position>> neighbors) {
this.firePositions = firePositions;
this.neighbors = neighbors;
}
public Set<Position> getFirePositions() {
return firePositions;
}
public List<Position> spreadFire() {
List<Position> modifiedPositions = new ArrayList<>();
List<Position> newFirePositions = new ArrayList<>();
for (Position fire : firePositions) {
newFirePositions.addAll(neighbors.get(fire));
}
firePositions.addAll(newFirePositions);
modifiedPositions.addAll(newFirePositions);
return newFirePositions;
}
public void extinguishFire(Position neighbor) {
firePositions.remove(neighbor);
}
}
package model;
import model.TargetStrategy;
import util.Position;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Firefighter {
private Position position;
public Firefighter(Position position) {
//this.firefighterPositions = firefighterPositions;
this.position = position;
//this.neighbors = neighbors;
}
public Position getPosition() {
return position;
}
public void setPosition(Position position) {
this.position = position;
}
public Position moveToBestPosition(TargetStrategy targetStrategy, Set<Position> firePositions, Map<Position, List<Position>> neighbors) {
return targetStrategy.neighborClosestToFire(position, firePositions, neighbors);
}
public void extinguish(Position position, Set<Position> firePositions) {
firePositions.remove(position);
}
}
...@@ -4,21 +4,24 @@ import util.Position; ...@@ -4,21 +4,24 @@ import util.Position;
import java.util.*; import java.util.*;
public class FirefighterBoard implements Board<List<ModelElement>> { public class FirefighterBoard implements Board<List<ModelElement>> {
private final int columnCount; private final int columnCount;
private final int rowCount; private final int rowCount;
private final int initialFireCount; private final int initialFireCount;
private final int initialFirefighterCount; private final int initialFirefighterCount;
private final TargetStrategy targetStrategy = new TargetStrategy(); private final int initialCloudCount;
private List<Position> firefighterPositions; private final int initialMountainCount = 3;
private Set<Position> firePositions; private final model.TargetStrategy targetStrategy = new model.TargetStrategy();
private Map<Position, List<Position>> neighbors = new HashMap(); private List<Firefighter> firefighters;
private Fire fire;
private final Map<Position, List<Position>> neighbors = new HashMap<>();
private List<Cloud> clouds;
private List<Mountain> mountains;
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();
public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) { public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudCount, int initialMountainCount) {
this.columnCount = columnCount; this.columnCount = columnCount;
this.rowCount = rowCount; this.rowCount = rowCount;
this.positions = new Position[rowCount][columnCount]; this.positions = new Position[rowCount][columnCount];
...@@ -36,16 +39,46 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -36,16 +39,46 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
} }
this.initialFireCount = initialFireCount; this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount; this.initialFirefighterCount = initialFirefighterCount;
this.initialCloudCount = initialCloudCount;
initializeElements(); initializeElements();
} }
public void initializeElements() { public void initializeElements() {
firefighterPositions = new ArrayList<>(); firefighters = new ArrayList<>();
firePositions = new HashSet<>(); clouds = new ArrayList<>();
mountains = new ArrayList<>();
Set<Position> firePositions = new HashSet<>();
for (int index = 0; index < initialCloudCount; index++) {
clouds.add(new Cloud(randomPosition(), neighbors));
}
for (int index = 0; index < initialFireCount; index++) for (int index = 0; index < initialFireCount; index++)
firePositions.add(randomPosition()); firePositions.add(randomPosition());
fire = new Fire(firePositions, neighbors);
for (int index = 0; index < initialFirefighterCount; index++) for (int index = 0; index < initialFirefighterCount; index++)
firefighterPositions.add(randomPosition()); firefighters.add(new Firefighter(randomPosition()));
for (int index = 0; index < initialCloudCount; index++) {
clouds.add(new Cloud(randomPosition(), neighbors));
}
for (int i = 0; i < initialMountainCount; i++) {
Position position = randomPosition();
if (isPositionOccupied(position)) continue;
mountains.add(new Mountain(position));
}
}
private boolean isPositionOccupied(Position position) {
// Vérifie si la position est occupée par une montagne
for (Mountain mountain : mountains) {
if (mountain.getPosition().equals(position)) return true;
}
// Vérifie les autres éléments
for (Firefighter firefighter : firefighters) {
if (firefighter.getPosition().equals(position)) return true;
}
for (Cloud cloud : clouds) {
if (cloud.getPosition().equals(position)) return true;
}
return fire.getFirePositions().contains(position);
} }
private Position randomPosition() { private Position randomPosition() {
...@@ -55,10 +88,22 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -55,10 +88,22 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
@Override @Override
public List<ModelElement> getState(Position position) { public List<ModelElement> getState(Position position) {
List<ModelElement> result = new ArrayList<>(); List<ModelElement> result = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions) for (Cloud cloud : clouds) {
if (firefighterPosition.equals(position)) if (cloud.getPosition().equals(position)) {
result.add(ModelElement.CLOUD);
}
}
for (Mountain mountain : mountains){
if(mountain.getPosition().equals(position)){
result.add(ModelElement.MOUNTAIN);
}
}
for (Firefighter firefighter : firefighters)
if (firefighter.getPosition().equals(position))
result.add(ModelElement.FIREFIGHTER); result.add(ModelElement.FIREFIGHTER);
if (firePositions.contains(position))
if (fire.getFirePositions().contains(position))
result.add(ModelElement.FIRE); result.add(ModelElement.FIRE);
return result; return result;
} }
...@@ -75,23 +120,17 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -75,23 +120,17 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
public List<Position> updateToNextGeneration() { public List<Position> updateToNextGeneration() {
List<Position> modifiedPositions = updateFirefighters(); List<Position> modifiedPositions = updateFirefighters();
modifiedPositions.addAll(updateFires());
step++;
return modifiedPositions;
}
private List<Position> updateFires() {
List<Position> modifiedPositions = new ArrayList<>();
if (step % 2 == 0){ if (step % 2 == 0){
List<Position> newFirePositions = new ArrayList<>(); modifiedPositions.addAll(fire.spreadFire());
for (Position fire : firePositions) {
newFirePositions.addAll(neighbors.get(fire));
} }
firePositions.addAll(newFirePositions); // Déplacer les nuages et éteindre les feux
modifiedPositions.addAll(newFirePositions); for (Cloud cloud : clouds) {
cloud.moveAndExtinguishFire(fire);
cloud.extinguishFireCloud(fire);
} }
return modifiedPositions; step++;
return modifiedPositions;
} }
@Override @Override
...@@ -101,22 +140,27 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -101,22 +140,27 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
private List<Position> updateFirefighters() { private List<Position> updateFirefighters() {
List<Position> modifiedPosition = new ArrayList<>(); List<Position> modifiedPosition = new ArrayList<>();
List<Position> firefighterNewPositions = new ArrayList<>(); for (Firefighter firefighter : firefighters) {
for (Position firefighterPosition : firefighterPositions) {
Position newFirefighterPosition = modifiedPosition.add(firefighter.getPosition());
targetStrategy.neighborClosestToFire(firefighterPosition,
firePositions, neighbors); Position newPosition = firefighter.moveToBestPosition(targetStrategy, fire.getFirePositions(), neighbors);
firefighterNewPositions.add(newFirefighterPosition); firefighter.setPosition(newPosition);
extinguish(newFirefighterPosition);
modifiedPosition.add(firefighterPosition); modifiedPosition.add(newPosition);
modifiedPosition.add(newFirefighterPosition);
List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream() firefighter.extinguish(newPosition, fire.getFirePositions());
.filter(firePositions::contains).toList();
for (Position firePosition : neighborFirePositions) // Éteindre les feux dans les positions voisines
extinguish(firePosition); List<Position> adjacentFires = neighbors.get(newPosition).stream()
modifiedPosition.addAll(neighborFirePositions); .filter(fire.getFirePositions()::contains)
} .toList();
firefighterPositions = firefighterNewPositions; for (Position firePosition : adjacentFires) {
firefighter.extinguish(firePosition, fire.getFirePositions());
modifiedPosition.add(firePosition);
}
}
return modifiedPosition; return modifiedPosition;
} }
...@@ -126,21 +170,18 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -126,21 +170,18 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
initializeElements(); initializeElements();
} }
private void extinguish(Position position) {
firePositions.remove(position);
}
@Override @Override
public void setState(List<ModelElement> state, Position position) { public void setState(List<ModelElement> state, Position position) {
firePositions.remove(position); fire.getFirePositions().remove(position);
for (; ; ) { firefighters.removeIf(f -> f.getPosition().equals(position));
if (!firefighterPositions.remove(position)) break; clouds.removeIf(c -> c.getPosition().equals(position));
}
for (ModelElement element : state) { for (ModelElement element : state) {
switch (element) { switch (element) {
case FIRE -> firePositions.add(position); case FIRE -> fire.getFirePositions().add(position);
case FIREFIGHTER -> firefighterPositions.add(position); case FIREFIGHTER -> firefighters.add(new Firefighter(position));
case CLOUD -> clouds.add(new Cloud(position, neighbors));
case MOUNTAIN -> mountains.add(new Mountain(position));
} }
} }
} }
......
package model; package model;
public enum ModelElement { public enum ModelElement {
FIREFIGHTER, FIRE FIREFIGHTER, FIRE, CLOUD, MOUNTAIN
} }
package model;
import util.Position;
public class Mountain {
private final Position position;
public Mountain(Position position) {
this.position = position;
}
public Position getPosition(){
return position;
}
}
/*package model;
import util.Position;
import java.util.*;
public class FirefighterBoard implements Board<List<ModelElement>> {
private final int columnCount;
private final int rowCount;
private final int initialFireCount;
private final int initialFirefighterCount;
private final model.TargetStrategy targetStrategy = new model.TargetStrategy();
private List<Position> firefighterPositions;
private Set<Position> firePositions;
private Map<Position, List<Position>> neighbors = new HashMap();
private final Position[][] positions;
private int step = 0;
private final Random randomGenerator = new Random();
public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
this.columnCount = columnCount;
this.rowCount = rowCount;
this.positions = new Position[rowCount][columnCount];
for (int column = 0; column < columnCount; column++)
for (int row = 0; row < rowCount; row++)
positions[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(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]);
neighbors.put(positions[row][column], list);
}
this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount;
initializeElements();
}
public void initializeElements() {
firefighterPositions = new ArrayList<>();
firePositions = new HashSet<>();
for (int index = 0; index < initialFireCount; index++)
firePositions.add(randomPosition());
for (int index = 0; index < initialFirefighterCount; index++)
firefighterPositions.add(randomPosition());
}
private Position randomPosition() {
return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
}
@Override
public List<ModelElement> getState(Position position) {
List<ModelElement> result = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions)
if (firefighterPosition.equals(position))
result.add(ModelElement.FIREFIGHTER);
if (firePositions.contains(position))
result.add(ModelElement.FIRE);
return result;
}
@Override
public int rowCount() {
return rowCount;
}
@Override
public int columnCount() {
return columnCount;
}
public List<Position> updateToNextGeneration() {
List<Position> modifiedPositions = updateFirefighters();
modifiedPositions.addAll(updateFires());
step++;
return modifiedPositions;
}
private List<Position> updateFires() {
List<Position> modifiedPositions = new ArrayList<>();
if (step % 2 == 0) {
List<Position> newFirePositions = new ArrayList<>();
for (Position fire : firePositions) {
newFirePositions.addAll(neighbors.get(fire));
}
firePositions.addAll(newFirePositions);
modifiedPositions.addAll(newFirePositions);
}
return modifiedPositions;
}
@Override
public int stepNumber() {
return step;
}
private List<Position> updateFirefighters() {
List<Position> modifiedPosition = new ArrayList<>();
List<Position> firefighterNewPositions = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions) {
Position newFirefighterPosition =
targetStrategy.neighborClosestToFire(firefighterPosition,
firePositions, neighbors);
firefighterNewPositions.add(newFirefighterPosition);
extinguish(newFirefighterPosition);
modifiedPosition.add(firefighterPosition);
modifiedPosition.add(newFirefighterPosition);
List<Position> neighborFirePositions = neighbors.get(newFirefighterPosition).stream()
.filter(firePositions::contains).toList();
for (Position firePosition : neighborFirePositions)
extinguish(firePosition);
modifiedPosition.addAll(neighborFirePositions);
}
firefighterPositions = firefighterNewPositions;
return modifiedPosition;
}
@Override
public void reset() {
step = 0;
initializeElements();
}
private void extinguish(Position position) {
firePositions.remove(position);
}
@Override
public void setState(List<ModelElement> state, Position 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);
}
}
}
}*/
\ No newline at end of file
...@@ -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), EMPTY(Color.WHITE); FIREFIGHTER(Color.BLUE), FIRE(Color.RED), CLOUD(Color.GREY),MOUNTAIN(Color.CHOCOLATE), EMPTY(Color.WHITE);
final Color color; final Color color;
ViewElement(Color color) { ViewElement(Color color) {
this.color = color; this.color = color;
......
...@@ -10,17 +10,17 @@ import static org.assertj.core.api.Assertions.*; ...@@ -10,17 +10,17 @@ import static org.assertj.core.api.Assertions.*;
public class FirefighterBoardTest { public class FirefighterBoardTest {
@Test @Test
void testColumnCount(){ void testColumnCount(){
Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 1, 3); Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 1, 3, 3);
assertThat(board.columnCount()).isEqualTo(20); assertThat(board.columnCount()).isEqualTo(20);
} }
@Test @Test
void testRowCount(){ void testRowCount(){
Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 1, 3); Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 1, 3, 3);
assertThat(board.rowCount()).isEqualTo(10); assertThat(board.rowCount()).isEqualTo(10);
} }
@Test @Test
void testStepNumber(){ void testStepNumber(){
Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 1, 3); Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 1, 3, 3);
for(int index = 0; index < 10; index++){ for(int index = 0; index < 10; index++){
assertThat(board.stepNumber()).isEqualTo(index); assertThat(board.stepNumber()).isEqualTo(index);
board.updateToNextGeneration(); board.updateToNextGeneration();
...@@ -29,7 +29,7 @@ public class FirefighterBoardTest { ...@@ -29,7 +29,7 @@ public class FirefighterBoardTest {
} }
@Test @Test
void testGetState_afterSet(){ void testGetState_afterSet(){
Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 0, 0); Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 0, 0, 0);
Position position = new Position(1,2); Position position = new Position(1,2);
assertThat(board.getState(position)).isEmpty(); assertThat(board.getState(position)).isEmpty();
board.setState(List.of(ModelElement.FIRE), position); board.setState(List.of(ModelElement.FIRE), position);
......