Skip to content
Snippets Groups Projects
Commit 51d1cdf6 authored by melizzzz's avatar melizzzz
Browse files

changement sur matrice de matrice et initiation de cloud

parent d72e30df
No related branches found
No related tags found
No related merge requests found
Pipeline #39073 failed
...@@ -19,6 +19,7 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -19,6 +19,7 @@ public class SimulatorApplication extends javafx.application.Application {
private static final int BOX_HEIGHT = 25; private static final int BOX_HEIGHT = 25;
public static final int INITIAL_FIRE_COUNT = 3; public static final int INITIAL_FIRE_COUNT = 3;
public static final int INITIAL_FIREFIGHTER_COUNT = 6; public static final int INITIAL_FIREFIGHTER_COUNT = 6;
public static final int INITIAL_CLOUD_COUNT = 6;
private Stage primaryStage; private Stage primaryStage;
private Parent view; private Parent view;
...@@ -44,7 +45,7 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -44,7 +45,7 @@ public class SimulatorApplication extends javafx.application.Application {
view = loader.load(); view = loader.load();
Controller controller = loader.getController(); Controller controller = loader.getController();
controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT, controller.initialize(BOX_WIDTH, BOX_HEIGHT, COLUMN_COUNT, ROW_COUNT,
INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT); INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT);
} }
private void showScene() { private void showScene() {
......
...@@ -62,9 +62,12 @@ public class Controller { ...@@ -62,9 +62,12 @@ public class Controller {
List<Position> updatedPositions = board.updateToNextGeneration(); List<Position> updatedPositions = board.updateToNextGeneration();
List<Pair<Position, ViewElement>> updatedSquares = new ArrayList<>(); List<Pair<Position, ViewElement>> updatedSquares = new ArrayList<>();
for(Position updatedPosition : updatedPositions){ for(Position updatedPosition : updatedPositions){
Entity squareState = board.getState(updatedPosition); for (Entity e : board.getState(updatedPosition )){
Entity squareState = e;
ViewElement viewElement = getViewElement(squareState); ViewElement viewElement = getViewElement(squareState);
updatedSquares.add(new Pair<>(updatedPosition, viewElement)); updatedSquares.add(new Pair<>(updatedPosition, viewElement));}
} }
grid.repaint(updatedSquares); grid.repaint(updatedSquares);
updateGenerationLabel(board.stepNumber()); updateGenerationLabel(board.stepNumber());
...@@ -76,7 +79,9 @@ public class Controller { ...@@ -76,7 +79,9 @@ public class Controller {
ViewElement[][] viewElements = new ViewElement[rowCount][columnCount]; ViewElement[][] viewElements = new ViewElement[rowCount][columnCount];
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++)
viewElements[row][column] = getViewElement(board.getState(new Position(row, column))); for (Entity e : board.getState(new Position(row, column))) {
viewElements[row][column] = getViewElement(e);
}
grid.repaint(viewElements); grid.repaint(viewElements);
updateGenerationLabel(board.stepNumber()); updateGenerationLabel(board.stepNumber());
} }
...@@ -118,9 +123,9 @@ public class Controller { ...@@ -118,9 +123,9 @@ 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, int initialCloudCount) {
grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight); grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
this.setModel(new FireFighterScenario(columnCount, rowCount, initialFireCount, initialFirefighterCount)); this.setModel(new FireFighterScenario(columnCount, rowCount, initialFireCount, initialFirefighterCount, initialCloudCount));
repaintGrid(); repaintGrid();
} }
......
package model; package model;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import util.Position; import util.Position;
...@@ -17,7 +18,7 @@ public interface Board<S> { ...@@ -17,7 +18,7 @@ public interface Board<S> {
* @param position The position on the board for which to retrieve the state. * @param position The position on the board for which to retrieve the state.
* @return The state at the specified position. * @return The state at the specified position.
*/ */
S getState(Position position); ArrayList<S> getState(Position position);
/** /**
* Set the state of a specific position on the board to the specified state. * Set the state of a specific position on the board to the specified state.
......
...@@ -27,8 +27,8 @@ public class Fire implements Entity{ ...@@ -27,8 +27,8 @@ public class Fire implements Entity{
if(board.getStepNumber() % 2 == 0)return new ArrayList<Position>(); if(board.getStepNumber() % 2 == 0)return new ArrayList<Position>();
List<Position> positions = PositionUtil.generateAdjacentPositions(position, board); List<Position> positions = PositionUtil.generateAdjacentPositions(position, board);
for(Position p : positions){ for(Position p : positions){
if(b.getState(p) instanceof EmptySquare){ if(b.getState(p).contains(Fire.class)){
if(b.getState(p).getAge() < b.getStepNumber()){ if(b.getState(p).get(b.getState(p).indexOf(Fire.class)).getAge() < b.getStepNumber()){
board.setState(new Fire(p, board), p); board.setState(new Fire(p, board), p);
} }
} }
...@@ -60,6 +60,7 @@ public class Fire implements Entity{ ...@@ -60,6 +60,7 @@ public class Fire implements Entity{
return this.age; return this.age;
} }
@Override @Override
public void incrementAge() { public void incrementAge() {
this.age = age + 1 ; this.age = age + 1 ;
......
...@@ -29,7 +29,7 @@ public class FireFighter implements Entity{ ...@@ -29,7 +29,7 @@ public class FireFighter implements Entity{
// Vérifier s'il y a du feu dans une des positions adjacentes // Vérifier s'il y a du feu dans une des positions adjacentes
boolean hasFire = adjacentPositions.stream() boolean hasFire = adjacentPositions.stream()
.anyMatch(p -> b.getState(p) instanceof Fire); .anyMatch(p -> b.getState(p).contains(Fire.class));
if (hasFire) { if (hasFire) {
// Si du feu est trouvé, on éteint les feux adjacents // Si du feu est trouvé, on éteint les feux adjacents
...@@ -62,7 +62,7 @@ public class FireFighter implements Entity{ ...@@ -62,7 +62,7 @@ public class FireFighter implements Entity{
private List<Position> extinguish(List<Position> adjacentPositions, Board<Entity> b) { private List<Position> extinguish(List<Position> adjacentPositions, Board<Entity> b) {
List<Position> extinguishedPositions = new ArrayList<>(); List<Position> extinguishedPositions = new ArrayList<>();
for (Position p : adjacentPositions) { for (Position p : adjacentPositions) {
if (b.getState(p) instanceof Fire) { if (b.getState(p).contains(Fire.class)) {
b.clearCase(p); b.clearCase(p);
extinguishedPositions.add(p); // Ajouter la position où le feu a été éteint extinguishedPositions.add(p); // Ajouter la position où le feu a été éteint
} }
...@@ -75,7 +75,7 @@ public class FireFighter implements Entity{ ...@@ -75,7 +75,7 @@ public class FireFighter implements Entity{
List<Position> possibleMoves = PositionUtil.generateAllAdjacentPositions(currentPos, b); List<Position> possibleMoves = PositionUtil.generateAllAdjacentPositions(currentPos, b);
// Filtrer les positions qui sont libres // Filtrer les positions qui sont libres
possibleMoves.removeIf(p -> !(b.getState(p) instanceof EmptySquare)); possibleMoves.removeIf(p -> !(b.getState(p).contains(Fire.class)));
// Si aucune position libre n'est disponible, retourner null // Si aucune position libre n'est disponible, retourner null
if (possibleMoves.isEmpty()) { if (possibleMoves.isEmpty()) {
......
...@@ -15,20 +15,24 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -15,20 +15,24 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
private Matrix<Entity> matrix; private Matrix<Entity> matrix;
private int step; private int step;
private int initialCloudCount;
private int initialFireCount; private int initialFireCount;
private int initialFireFightersCount; private int initialFireFightersCount;
public FireFighterScenario(int columns, int rows, int initialFireCount, int initialFireFightersCount) {
public FireFighterScenario(int columns, int rows, int initialFireCount, int initialFireFightersCount, int initialCloudCount) {
this.matrix = new Matrix<Entity>(columns, rows); this.matrix = new Matrix<Entity>(columns, rows);
this.initialFireCount = initialFireCount; this.initialFireCount = initialFireCount;
this.initialFireFightersCount = initialFireFightersCount; this.initialFireFightersCount = initialFireFightersCount;
this.initialCloudCount = initialCloudCount; //ajout de l'init cloud
initScenario(matrix); initScenario(matrix);
placeInitialActors(initialFireCount, initialFireFightersCount); placeInitialActors();
this.step = 0; this.step = 0;
} }
private void placeInitialActors(int initialFireCount, int initialFireFightersCount) { private void placeInitialActors() {
int fireCount = 0; int fireCount = 0;
int fireFighterCount = 0; int fireFighterCount = 0;
int cloudCount =0;
int chance = 5; // Chance initiale en pourcentage int chance = 5; // Chance initiale en pourcentage
Random random = new Random(); Random random = new Random();
...@@ -39,15 +43,15 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -39,15 +43,15 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
} }
} }
while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount) { while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount || cloudCount < initialCloudCount) {
Collections.shuffle(positions); // Mélange les positions pour un parcours aléatoire Collections.shuffle(positions); // Mélange les positions pour un parcours aléatoire
for (Position pos : positions) { for (Position pos : positions) {
if (getState(pos) instanceof EmptySquare) { if (getState(pos).contains(EmptySquare.class)) {
if (fireCount < initialFireCount && random.nextInt(100) < chance) { if (fireCount < initialFireCount && random.nextInt(100) < chance) {
setState(new Fire(pos, this, 1), pos); setState(new Fire(pos, this, 1), pos);
fireCount++; fireCount++;
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) { if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount) {
return; return;
} }
continue; continue;
...@@ -56,7 +60,15 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -56,7 +60,15 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
if (fireFighterCount < initialFireFightersCount && random.nextInt(100) < chance) { if (fireFighterCount < initialFireFightersCount && random.nextInt(100) < chance) {
setState(new FireFighter(pos, this, 1), pos); setState(new FireFighter(pos, this, 1), pos);
fireFighterCount++; fireFighterCount++;
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) { if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount) {
return;
}
}
if (cloudCount < initialCloudCount && random.nextInt(100) < chance) {
setState(new cloud(pos, this, 1), pos);
cloudCount++;
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount) {
return; return;
} }
} }
...@@ -68,7 +80,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -68,7 +80,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
} }
} }
public Entity getState(Position position) { public ArrayList<Entity> getState(Position position) {
if (position.x() > matrix.size() || position.y() > matrix.size()) { if (position.x() > matrix.size() || position.y() > matrix.size()) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"The position x:" + position.x() + " y:" + position.y() + " is out of the board."); "The position x:" + position.x() + " y:" + position.y() + " is out of the board.");
...@@ -77,7 +89,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -77,7 +89,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
} }
public void setState(Entity state, Position position) { public void setState(Entity state, Position position) {
if (!(getState(position) instanceof EmptySquare)) { if (!(getState(position).getFirst() instanceof EmptySquare)) {
return; return;
} }
if (doesPositionExist(position)) { if (doesPositionExist(position)) {
...@@ -86,7 +98,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -86,7 +98,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
} }
public void setState(Entity state, Position position, boolean replaceStates) { public void setState(Entity state, Position position, boolean replaceStates) {
if (!(getState(position) instanceof EmptySquare) && !replaceStates) { if (!(getState(position).getFirst() instanceof EmptySquare) && !replaceStates) {
return; return;
} }
matrix.set(position.x(), position.y(), state); matrix.set(position.x(), position.y(), state);
...@@ -108,7 +120,9 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -108,7 +120,9 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
ArrayList<Position> changedPositions = new ArrayList<>(); ArrayList<Position> changedPositions = new ArrayList<>();
Iterator<Entity> iterator = matrix.iterator(); Iterator<Entity> iterator = matrix.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
Entity e = iterator.next();
ArrayList<Entity> entities = (ArrayList<Entity>) iterator.next();
for (Entity e : entities) {
if (e instanceof EmptySquare) if (e instanceof EmptySquare)
continue; continue;
if (e.getAge() == 0) { if (e.getAge() == 0) {
...@@ -122,6 +136,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -122,6 +136,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
e.incrementAge(); e.incrementAge();
changedPositions.addAll(entityUpdatedPositions); changedPositions.addAll(entityUpdatedPositions);
} }
}
return changedPositions; return changedPositions;
} }
...@@ -136,15 +151,17 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -136,15 +151,17 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
// Parcourir les distances croissantes à partir de 1 // Parcourir les distances croissantes à partir de 1
for (int distance = 1; distance < maxDistance; distance++) { for (int distance = 1; distance < maxDistance; distance++) {
List<Position> positionsAtDistance = PositionUtil.getPositionsAtManhattanDistance(fromPos, distance, rows, cols); List<Position> positionsAtDistance = PositionUtil.getPositionsAtManhattanDistance(fromPos, distance, rows, cols);
//ligne a verifier
for (Position currentPos : positionsAtDistance) { for (Position currentPos : positionsAtDistance) {
Entity currentEntity = matrix.get(currentPos.x(), currentPos.y()); ArrayList<Entity> entitiesAtPos = matrix.get(currentPos.x(), currentPos.y());
if (!entitiesAtPos.isEmpty()) {
Entity currentEntity = entitiesAtPos.get(0); // Récupérer le premier élément de la liste
if (entityType.isInstance(currentEntity)) { if (entityType.isInstance(currentEntity)) {
// Dès qu'une entité est trouvée à cette distance, elle est la plus proche
// possible
return currentPos; return currentPos;
} }
} }
}
} }
return nearestPosition; // Retourne null si aucune entité n'est trouvée return nearestPosition; // Retourne null si aucune entité n'est trouvée
...@@ -155,7 +172,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -155,7 +172,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
step = 0; step = 0;
matrix.clear(); matrix.clear();
initScenario(matrix); initScenario(matrix);
placeInitialActors(initialFireCount, initialFireFightersCount); placeInitialActors();
} }
public int stepNumber() { public int stepNumber() {
......
package model;
import javafx.scene.paint.Color;
import util.Position;
import util.PositionUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class cloud implements Entity{
private int age;
private final Color viewColor = Color.GREY;
private Position position;
Board<Entity> b;
public cloud (Position position, Board<Entity> b, int age){
this.age = age;
this.position = position;
this.b = b;
}
@Override
public List<Position> nextTurn(Board<Entity> b) {
List<Position> positions = new ArrayList<>();
// Générer les positions adjacentes valides
List<Position> possibleMoves = PositionUtil.generateAllAdjacentPositions(position, b);
// Sélectionner une position aléatoire parmi les mouvements possibles
Position next_pos = possibleMoves.get(new Random().nextInt(possibleMoves.size()));
// Vérifier l'état de la nouvelle position
ArrayList<Entity> nextEntities = b.getState(next_pos);
positions.add(position);
positions.add(next_pos);
// Si la nouvelle position contient un feu, éteindre le feu
if (nextEntities.contains(Fire.class)) {
extinguish(List.of(next_pos), b);
}
b.setState(this, next_pos);
// Retourner la position mise à jour pour affichage ou suivi
return positions;
}
private List<Position> extinguish(List<Position> next_pos, Board<Entity> b) {
List<Position> extinguishedPositions = new ArrayList<>();
if (b.getState(next_pos.get(0)).contains(Fire.class)) {
b.clearCase(next_pos.get(0));
extinguishedPositions.add(next_pos.get(0));
}
return extinguishedPositions;
}
@Override
public Position getPosition() {
return position;
}
@Override
public void setPosition(Position p) {
this.position = p;
}
@Override
public int getAge() {
return this.age;
}
@Override
public void incrementAge() {
this.age += 1;
}
@Override
public Color getViewColor() {
return viewColor;
}
}
...@@ -2,6 +2,7 @@ module firefighter { ...@@ -2,6 +2,7 @@ module firefighter {
requires javafx.controls; requires javafx.controls;
requires javafx.fxml; requires javafx.fxml;
requires javafx.graphics; requires javafx.graphics;
requires java.sql;
opens controller to javafx.fxml; opens controller to javafx.fxml;
exports app; exports app;
opens app to javafx.fxml; opens app to javafx.fxml;
......
...@@ -5,7 +5,7 @@ import java.util.Iterator; ...@@ -5,7 +5,7 @@ import java.util.Iterator;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
public class Matrix<E> implements Iterable<E> { public class Matrix<E> implements Iterable<E> {
private ArrayList<ArrayList<E>> matrix; private ArrayList<ArrayList<ArrayList<E>>> matrix;
private final int rows; private final int rows;
private final int columns; private final int columns;
...@@ -16,33 +16,37 @@ public class Matrix<E> implements Iterable<E> { ...@@ -16,33 +16,37 @@ public class Matrix<E> implements Iterable<E> {
// Initialiser chaque ligne de la matrice // Initialiser chaque ligne de la matrice
for (int i = 0; i < rows; i++) { for (int i = 0; i < rows; i++) {
ArrayList<E> row = new ArrayList<>(columns); ArrayList<ArrayList<E>> row = new ArrayList<>(columns);
// Initialiser chaque colonne avec des valeurs nulles // Initialiser chaque colonne avec des valeurs nulles
for (int j = 0; j < columns; j++) { for (int j = 0; j < columns; j++) {
row.add(null); row.add(new ArrayList<E>());
} }
this.matrix.add(row); this.matrix.add(row);
} }
} }
public E get(int x, int y) { public ArrayList<E> get(int x, int y) {
validateIndex(x, y); validateIndex(x, y);
return matrix.get(x).get(y); return matrix.get(x).get(y);
} }
public E set(int x, int y, E object) { public ArrayList<E> set(int x, int y, E object) {
validateIndex(x, y); validateIndex(x, y);
return matrix.get(x).set(y, object); ArrayList<E> previous_Entities = matrix.get(x).get(y);
matrix.get(x).get(y).add(object);
return previous_Entities;
} }
public void clear() { public void clear() {
this.matrix = new ArrayList<>(rows); this.matrix = new ArrayList<>(rows);
// Initialiser chaque ligne de la matrice // Initialiser chaque ligne de la matrice
for (int i = 0; i < rows; i++) { for (int i = 0; i < rows; i++) {
ArrayList<E> row = new ArrayList<>(columns); ArrayList<ArrayList<E>> row = new ArrayList<>(columns);
// Initialiser chaque colonne avec des valeurs nulles // Initialiser chaque colonne avec des valeurs nulles
for (int j = 0; j < columns; j++) { for (int j = 0; j < columns; j++) {
row.add(null); row.add(new ArrayList<E>());
} }
this.matrix.add(row); this.matrix.add(row);
} }
...@@ -126,7 +130,19 @@ public class Matrix<E> implements Iterable<E> { ...@@ -126,7 +130,19 @@ public class Matrix<E> implements Iterable<E> {
if (!hasNext()) { if (!hasNext()) {
throw new NoSuchElementException(); throw new NoSuchElementException();
} }
E element = matrix.get(row).get(col); ArrayList<E> element = matrix.get(row).get(col);
col++;
if (col >= columns) {
col = 0;
row++;
}
return element.getFirst();
}
/* public ArrayList<E> next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
ArrayList<E> element = matrix.get(row).get(col);
col++; col++;
if (col >= columns) { if (col >= columns) {
col = 0; col = 0;
...@@ -134,5 +150,8 @@ public class Matrix<E> implements Iterable<E> { ...@@ -134,5 +150,8 @@ public class Matrix<E> implements Iterable<E> {
} }
return element; return element;
} }
*/
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment