Skip to content
Snippets Groups Projects
Commit b4ea5aad authored by Yanis OUALAN's avatar Yanis OUALAN
Browse files

Merge branch 'melissa' into yanis

parents add7f37b 809fc561
No related branches found
No related tags found
No related merge requests found
Pipeline #40263 passed
Showing with 303 additions and 21 deletions
......@@ -13,15 +13,18 @@ import javafx.stage.Stage;
public class SimulatorApplication extends javafx.application.Application {
private static final String VIEW_RESOURCE_PATH = "/view/view.fxml";
private static final String APP_NAME = "Firefighter simulator";
private static final int ROW_COUNT = 20;
private static final int COLUMN_COUNT = 20;
private static final int ROW_COUNT = 22;
private static final int COLUMN_COUNT = 22;
private static final int BOX_WIDTH = 25;
private static final int BOX_HEIGHT = 25;
public static final int INITIAL_FIRE_COUNT = 3;
public static final int INITIAL_FIREFIGHTER_COUNT = 6;
public static final int INITIAL_CLOUD_COUNT = 6;
public static final int INITIAL_MOUNTAIN_COUNT= 30;
private Stage primaryStage;
private Parent view;
private void initializePrimaryStage(Stage primaryStage) {
this.primaryStage = primaryStage;
this.primaryStage.setTitle(APP_NAME);
......@@ -44,7 +47,7 @@ public class SimulatorApplication extends javafx.application.Application {
view = loader.load();
Controller controller = loader.getController();
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, INITIAL_MOUNTAIN_COUNT);
}
private void showScene() {
......
......@@ -5,6 +5,8 @@ import static java.util.Objects.*;
import java.util.ArrayList;
import java.util.List;
import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
......@@ -117,9 +119,9 @@ public class Controller {
}
public void initialize(int squareWidth, int squareHeight, int columnCount,
int rowCount, int initialFireCount, int initialFirefighterCount) {
int rowCount, int initialFireCount, int initialFirefighterCount, int initialcloudCount, int initialmountaincount) {
grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
this.setModel(new FireFighterScenario(columnCount, rowCount, initialFireCount, initialFirefighterCount));
this.setModel(new FireFighterScenario(columnCount, rowCount, initialFireCount, initialFirefighterCount, initialcloudCount, initialmountaincount));
repaintGrid();
}
......
package model;
import javafx.geometry.Pos;
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 Position position;
private final Color viewColor = Color.GREEN;
private final int priority = 3;
public Cloud(Position position, Board<Square> b){
this.age = 0;
this.position = position;
}
public Cloud(Position position, Board<Square> b, int age){
this.age = age;
this.position = position;
}
@Override
public List<Position> nextTurn(Board<Square> b) {
List<Position> adjacentPositions = PositionUtil.generateAdjacentPositions(position, b);
adjacentPositions.removeIf( p -> b.doesSquareContainEntity(p, Cloud.class));
adjacentPositions.removeIf( p -> b.doesSquareContainEntity(p, Mountain.class));
// Filtrer pour obtenir uniquement les positions qui ne contiennent pas de pompier
adjacentPositions.removeIf(p -> b.doesSquareContainEntity(p, FireFighter.class));
// Choisir une position aléatoire parmi les mouvements possibles
Position next_position = adjacentPositions.get(new Random().nextInt(adjacentPositions.size()));
// Si la nouvelle position contient un feu, éteindre le feu
if (b.getStates(next_position).getEntities().stream().anyMatch(element -> element instanceof Fire) ){
extinguish(next_position, b);
}
Position old_position = this.position;
this.position = next_position;
b.addEntityAtSquare(this, next_position);
b.clearCaseFrom(this, old_position);
return List.of(old_position, this.position);
}
private Position extinguish(Position p, Board<Square> b) {
b.getStates(p).getEntities().removeIf(element -> element instanceof Fire);
List<Entity> entities = b.getStates(p).getEntities();
for (Entity e : entities) {
if (e instanceof EmptyEntity) {
e.setAge(b.stepNumber() + 1);
}
}
return p;
}
@Override
public Position getPosition() {
return this.position;
}
@Override
public void setPosition(Position p) {
this.position = p;
}
@Override
public int getAge() {
return age;
}
@Override
public void setAge(int age) {
this.age =age;
}
@Override
public void incrementAge() {
this.age += 1;
}
@Override
public Color getViewColor() {
return this.viewColor;
}
@Override
public int getPriority(){ return this.priority;}
}
......@@ -8,7 +8,7 @@ import util.Position;
public class EmptyEntity implements Entity{
private final int priority=3;
private Position position;
private int age;
public EmptyEntity(Position position){
......@@ -56,4 +56,7 @@ public class EmptyEntity implements Entity{
return Color.WHITE;
}
@Override
public int getPriority(){return this.priority;}
}
\ No newline at end of file
package model;
import java.util.ArrayList;
import java.util.List;
import javafx.scene.paint.Color;
import util.Position;
public class EmptySquare implements Entity {
private Position position;
private final Color viewColor = Color.WHITE;
private int age;
private final int priotity = 0;
public EmptySquare(Position p) {
this.position = p;
this.age = -999;
}
public EmptySquare(Position p, int age) {
this.position = p;
this.age = age;
}
@Override
public List<Position> nextTurn(Board<Square> board) {
return new ArrayList<Position>();
}
@Override
public Position getPosition() {
return position;
}
@Override
public void setPosition(Position p) {
this.position = p;
}
public Color getViewColor() {
return this.viewColor;
}
@Override
public int getAge() {
return this.age;
}
@Override
public void incrementAge() {
age = age + 1;
}
@Override
public void setAge(int age) {
this.age = age;
}
@Override
public int getPriority(){
return this.priotity;
}
}
......@@ -5,6 +5,7 @@ import java.util.List;
import javafx.scene.paint.Color;
import util.Position;
public interface Entity {
/**
* Exécute un tour de jeu, en vérifiant les cases adjacentes pour des instances de Fire.
......@@ -19,4 +20,5 @@ public interface Entity {
public void setAge(int age);
public void incrementAge();
public Color getViewColor();
public int getPriority();
}
......@@ -6,12 +6,14 @@ import java.util.List;
import javafx.scene.paint.Color;
import util.Position;
import util.PositionUtil;
import util.PositionUtil;
public class Fire implements Entity {
Board<Square> b;
private Position position;
private final Color viewColor = Color.RED;
private int age;
private final int priority = 0;
public Fire(Position position, Board<Square> b) {
this.b = b;
......@@ -34,8 +36,9 @@ public class Fire implements Entity {
return new ArrayList<Position>();
}
List<Position> positions = PositionUtil.generateAdjacentPositions(position, board);
positions.removeIf( p -> b.doesSquareContainEntity(p, Mountain.class));
for (Position p : positions) {
if (b.getStates(p).isEmpty()) {
if (b.getStates(p).isEmpty() && !b.getStates(p).getEntities().contains(Cloud.class)) {
if (b.getStates(p).getMaxAge() < b.getStepNumber()
&& PositionUtil.getManhattanDistance(position, p) == 1) {
board.addEntityAtSquare(new Fire(p, board), p);
......@@ -76,4 +79,7 @@ public class Fire implements Entity {
public void setAge(int age) {
this.age = age;
}
@Override
public int getPriority(){ return this.priority;}
}
package model;
import java.util.*;
import javafx.scene.paint.Color;
import util.*;
import java.util.ArrayList;
import java.util.List;
import javafx.scene.paint.Color;
import util.Position;
import util.PositionUtil;
public class FireFighter implements Entity {
private int age;
private Position position;
private final Color viewColor = Color.BLUE;
private final int priority = 1;
public FireFighter(Position position, Board<Square> b) {
this.position = position;
......@@ -27,6 +26,7 @@ public class FireFighter implements Entity {
// Générer les positions adjacentes
List<Position> adjacentPositions = PositionUtil.generateAdjacentPositions(position, b);
adjacentPositions.removeIf( p -> b.doesSquareContainEntity(p, Mountain.class));
// Vérifier s'il y a du feu dans une des positions adjacentes
boolean hasFire = adjacentPositions.stream()
......@@ -137,4 +137,6 @@ public class FireFighter implements Entity {
public void setAge(int age) {
this.age = age;
}
public int getPriority(){ return this.priority;}
}
......@@ -3,12 +3,16 @@ package model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Random;
import util.Matrix;
import util.Position;
import util.PositionUtil;
import util.PositionUtil;
public class FireFighterScenario extends EntityScenario implements Board<Square> {
......@@ -17,19 +21,25 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
private int initialFireCount;
private int initialFireFightersCount;
private int intialCloudCount;
private int initialMoutainCount;
public FireFighterScenario(int columns, int rows, int initialFireCount, int initialFireFightersCount) {
public FireFighterScenario(int columns, int rows, int initialFireCount, int initialFireFightersCount, int initialCloudCount, int initialMoutainCount) {
this.matrix = new Matrix<Square>(columns, rows);
this.initialFireCount = initialFireCount;
this.initialFireFightersCount = initialFireFightersCount;
this.intialCloudCount = initialCloudCount;
this.initialMoutainCount = initialMoutainCount;
initScenario(matrix);
placeInitialActors(initialFireCount, initialFireFightersCount);
placeInitialActors(initialFireCount, initialFireFightersCount, initialCloudCount, initialMoutainCount);
this.step = 0;
}
private void placeInitialActors(int initialFireCount, int initialFireFightersCount) {
private void placeInitialActors(int initialFireCount, int initialFireFightersCount, int initialCloudCount, int initialMoutainCount) {
int fireCount = 0;
int fireFighterCount = 0;
int cloudCount = 0;
int moutainCount = 0;
int chance = 5; // Chance initiale en pourcentage
Random random = new Random();
List<Position> positions = new ArrayList<>();
......@@ -39,7 +49,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
}
}
while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount) {
while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount || cloudCount < intialCloudCount) {
Collections.shuffle(positions); // Mélange les positions pour un parcours aléatoire
for (Position pos : positions) {
......@@ -47,7 +57,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
if (fireCount < initialFireCount && random.nextInt(100) < chance) {
setSquare(new Square(pos, new Fire(pos, this, 1)));
fireCount++;
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) {
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount && moutainCount == initialMoutainCount) {
return;
}
continue;
......@@ -56,7 +66,23 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
if (fireFighterCount < initialFireFightersCount && random.nextInt(100) < chance) {
setSquare(new Square(pos, new FireFighter(pos, this, 1)));
fireFighterCount++;
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) {
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount && moutainCount == initialMoutainCount) {
return;
}
}
if (cloudCount < intialCloudCount && random.nextInt(100) < chance) {
setSquare(new Square(pos, new Cloud(pos, this, 1)));
cloudCount++;
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount && moutainCount == initialMoutainCount) {
return;
}
}
if (moutainCount < initialMoutainCount && random.nextInt(100) < chance) {
setSquare(new Square(pos, new Mountain(pos, 1)));
moutainCount++;
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount && cloudCount == initialCloudCount && moutainCount == initialMoutainCount) {
return;
}
}
......@@ -182,7 +208,7 @@ public class FireFighterScenario extends EntityScenario implements Board<Square>
step = 0;
matrix.clear();
initScenario(matrix);
placeInitialActors(initialFireCount, initialFireFightersCount);
placeInitialActors(initialFireCount, initialFireFightersCount, intialCloudCount, initialMoutainCount);
}
public int stepNumber() {
......
package model;
import javafx.scene.paint.Color;
import util.Position;
import java.util.List;
public class Mountain implements Entity{
private final int priority = 3;
Position position;
private int age;
private final Color viewColor = Color.YELLOW;
public Mountain(Position p ){
this.position = p;
}
public Mountain(Position p , int age){
this.position = p;
this.age = age;
}
@Override
public List<Position> nextTurn(Board<Square> board) {
return List.of();
}
@Override
public Position getPosition() {
return this.position;
}
@Override
public void setPosition(Position p) {
this.position = p;
}
@Override
public int getAge() {
return this.age;
}
@Override
public void setAge(int age) {
this.age = age;
}
@Override
public void incrementAge() {
this.age += 1;
}
@Override
public Color getViewColor() {
return this.viewColor;
}
@Override
public int getPriority() {
return this.priority;
}
}
......@@ -4,4 +4,5 @@ import util.Matrix;
public interface Scenario {
public void initScenario(Matrix<Square> matrix);
}
\ No newline at end of file
......@@ -77,6 +77,9 @@ public class Square {
for (Entity e : entities) {
Color color = e.getViewColor();
if (color != null) {
if(sumRed == 255 & sumGreen == 255 & sumBlue == 255){
continue;
}
sumRed += color.getRed();
sumGreen += color.getGreen();
sumBlue += color.getBlue();
......
......@@ -2,6 +2,7 @@ module firefighter {
requires javafx.controls;
requires javafx.fxml;
requires javafx.graphics;
requires java.sql;
opens controller to javafx.fxml;
exports app;
opens app to javafx.fxml;
......
package util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.NoSuchElementException;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment