Skip to content
Snippets Groups Projects
Commit d16b0732 authored by Yanis O's avatar Yanis O
Browse files

[Refac] Délégation de la logique de Fire à sa propre class

parent 98c6136c
No related branches found
No related tags found
No related merge requests found
Pipeline #38911 failed
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?> <?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.control.ToggleButton?>
<?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import view.FirefighterGrid?> <?import view.FirefighterGrid?>
<?import javafx.scene.control.ToggleButton?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.control.Label?>
<HBox styleClass="background" stylesheets="@DarkTheme.css" <HBox styleClass="background" stylesheets="@DarkTheme.css"
xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="controller.Controller"> fx:controller="controller.Controller">
<VBox> <VBox>
<Separator maxHeight="-Infinity" maxWidth="-Infinity" <Separator maxHeight="-Infinity" maxWidth="-Infinity"
prefHeight="24.0" prefWidth="200.0" /> prefHeight="24.0" prefWidth="200.0" />
<Label maxHeight="-Infinity" maxWidth="-Infinity" alignment="CENTER" prefHeight="24.0" prefWidth="200.0" <Label maxHeight="-Infinity" maxWidth="-Infinity"
alignment="CENTER" prefHeight="24.0" prefWidth="200.0"
text="Generation number" /> text="Generation number" />
<Label fx:id="generationNumberLabel" alignment="CENTER" contentDisplay="TEXT_ONLY" <Label fx:id="generationNumberLabel"
maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="24.0" prefWidth="200.0"/> alignment="CENTER" contentDisplay="TEXT_ONLY"
maxHeight="-Infinity" maxWidth="-Infinity"
prefHeight="24.0" prefWidth="200.0" />
<Separator maxHeight="-Infinity" maxWidth="-Infinity" <Separator maxHeight="-Infinity" maxWidth="-Infinity"
prefHeight="24.0" prefWidth="200.0" /> prefHeight="24.0" prefWidth="200.0" />
<Button fx:id="restartButton" maxHeight="-Infinity" maxWidth="-Infinity" <Button fx:id="restartButton" maxHeight="-Infinity" maxWidth="-Infinity"
mnemonicParsing="false" onAction="#restartButtonAction" prefHeight="24.0" prefWidth="200.0" mnemonicParsing="false" onAction="#restartButtonAction"
text="Restart"/> prefHeight="24.0" prefWidth="200.0" text="Restart" />
<Button fx:id="oneStepButton" maxHeight="-Infinity" maxWidth="-Infinity" <Button fx:id="oneStepButton" maxHeight="-Infinity" maxWidth="-Infinity"
mnemonicParsing="false" onAction="#oneStepButtonAction" prefHeight="24.0" prefWidth="200.0" mnemonicParsing="false" onAction="#oneStepButtonAction"
text="One step"/> prefHeight="24.0" prefWidth="200.0" text="One step" />
<ToggleButton fx:id="playToggleButton" maxHeight="-Infinity" maxWidth="-Infinity" <ToggleButton fx:id="playToggleButton" maxHeight="-Infinity" maxWidth="-Infinity"
mnemonicParsing="false" onAction="#playToggleButtonAction" prefHeight="24.0" mnemonicParsing="false" onAction="#playToggleButtonAction"
prefWidth="200.0" styleClass="button" text="Play"/> prefHeight="24.0" prefWidth="200.0"
styleClass="button" text="Play" />
<ToggleButton fx:id="pauseToggleButton" maxHeight="-Infinity" maxWidth="-Infinity" <ToggleButton fx:id="pauseToggleButton" maxHeight="-Infinity" maxWidth="-Infinity"
mnemonicParsing="false" onAction="#pauseToggleButtonAction" prefHeight="24.0" mnemonicParsing="false" onAction="#pauseToggleButtonAction"
prefWidth="200.0" styleClass="button" text="Pause"/> prefHeight="24.0" prefWidth="200.0"
styleClass="button" text="Pause" />
</VBox> </VBox>
<FirefighterGrid fx:id="grid" <FirefighterGrid fx:id="grid"
xmlns="http://javafx.com/javafx" xmlns="http://javafx.com/javafx"
......
...@@ -15,8 +15,8 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -15,8 +15,8 @@ public class SimulatorApplication extends javafx.application.Application {
private static final String APP_NAME = "Firefighter simulator"; private static final String APP_NAME = "Firefighter simulator";
private static final int ROW_COUNT = 20; private static final int ROW_COUNT = 20;
private static final int COLUMN_COUNT = 20; private static final int COLUMN_COUNT = 20;
private static final int BOX_WIDTH = 50; private static final int BOX_WIDTH = 25;
private static final int BOX_HEIGHT = 50; 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;
......
...@@ -64,5 +64,7 @@ public interface Board<S> { ...@@ -64,5 +64,7 @@ public interface Board<S> {
// Le booléen replaceState permet de forcer le remplacement des cases vides // Le booléen replaceState permet de forcer le remplacement des cases vides
public void setState(Entity state, Position position, boolean replaceStates); public void setState(Entity state, Position position, boolean replaceStates);
public boolean doesPositionExist(Position position);
} }
package model; package model;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import util.Position; import util.Position;
...@@ -12,8 +16,27 @@ public class Fire implements Entity{ ...@@ -12,8 +16,27 @@ public class Fire implements Entity{
@Override @Override
public void nextTurn(Board<Entity> board) { public void nextTurn(Board<Entity> board) {
List<Position> positions = generateAdjacentPosition();
for(Position p : positions){
board.setState(new Fire(p, board), p);
}
}
private List<Position> generateAdjacentPosition(){
int x = position.x();
int y = position.y();
return Stream.of(
new Position(x, y + 1),
new Position(x + 1, y),
new Position(x, y - 1),
new Position(x - 1, y)
)
.filter(p -> b.doesPositionExist(p))
.collect(Collectors.toList());
} }
@Override @Override
public void setPosition(Position p) { public void setPosition(Position p) {
this.position = p; this.position = p;
......
...@@ -5,9 +5,11 @@ import util.Position; ...@@ -5,9 +5,11 @@ import util.Position;
public class FireFighter implements Entity{ public class FireFighter implements Entity{
private Position position; private Position position;
private final Color viewColor = Color.BLUE; private final Color viewColor = Color.BLUE;
private Board<Entity> board;
public FireFighter(Position position){ public FireFighter(Position position, Board<Entity> b){
this.position = position; this.position = position;
this.board = b;
} }
public void nextTurn(Board<Entity> b){ public void nextTurn(Board<Entity> b){
......
package model; package model;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Random;
import util.Matrix; import util.Matrix;
import util.Position; import util.Position;
public class FireFighterScenario extends EntityScenario implements Board<Entity> { public class FireFighterScenario extends EntityScenario implements Board<Entity> {
private Matrix<Entity> matrix; private Matrix<Entity> matrix;
private int step; private int step;
public FireFighterScenario(int columns, int rows, int initialFireCount, int initialFireFightersCount) { public FireFighterScenario(int columns, int rows, int initialFireCount, int initialFireFightersCount) {
this.matrix = new Matrix<Entity>(columns, rows); this.matrix = new Matrix<Entity>(columns, rows);
initScenario(matrix);
placeInitialActors(initialFireCount, initialFireFightersCount);
this.step = 0; this.step = 0;
} }
private void placeInitialActors(int initialFireCount, int initialFireFightersCount) {
int fireCount = 0;
int fireFighterCount = 0;
int chance = 5; // Chance initiale en pourcentage
Random random = new Random();
List<Position> positions = new ArrayList<>();
for (int x = 0; x < matrix.getRows(); x++) {
for (int y = 0; y < matrix.getColumns(); y++) {
positions.add(new Position(x, y));
}
}
while (fireCount < initialFireCount || fireFighterCount < initialFireFightersCount) {
Collections.shuffle(positions); // Mélange les positions pour un parcours aléatoire
for (Position pos : positions) {
if (getState(pos) instanceof EmptySquare) {
if (fireCount < initialFireCount && random.nextInt(100) < chance) {
setState(new Fire(pos, this), pos);
fireCount++;
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) {
return;
}
continue;
}
if (fireFighterCount < initialFireFightersCount && random.nextInt(100) < chance) {
setState(new FireFighter(pos, this), pos);
fireFighterCount++;
if (fireCount == initialFireCount && fireFighterCount == initialFireFightersCount) {
return;
}
}
}
}
// Augmente la chance de placement après chaque parcours complet
chance = Math.min(chance + 5, 100); // Ne dépasse pas 100%
}
}
public Entity getState(Position position) { public 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("The position x:" + position.x() + " y:" + position.y() + " is out of the board."); throw new IllegalArgumentException(
"The position x:" + position.x() + " y:" + position.y() + " is out of the board.");
} }
return matrix.get(position.x(), position.y()); return matrix.get(position.x(), position.y());
} }
...@@ -30,7 +79,6 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -30,7 +79,6 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
matrix.set(position.x(), position.y(), state); matrix.set(position.x(), position.y(), state);
} }
// Le booléen replaceState permet de forcer le remplacement des cases vides
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) instanceof EmptySquare) && !replaceStates) {
return; return;
...@@ -38,7 +86,6 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -38,7 +86,6 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
matrix.set(position.x(), position.y(), state); matrix.set(position.x(), position.y(), state);
} }
public int rowCount() { public int rowCount() {
return matrix.getRows(); return matrix.getRows();
} }
...@@ -63,15 +110,17 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity> ...@@ -63,15 +110,17 @@ public class FireFighterScenario extends EntityScenario implements Board<Entity>
return changedPositions; return changedPositions;
} }
public void reset() { public void reset() {
matrix.clear(); matrix.clear();
} }
public int stepNumber() { public int stepNumber() {
this.step++; this.step++;
return this.step; return this.step;
} }
@Override
public boolean doesPositionExist(Position position) {
return matrix.validateIndexes(position);
}
} }
...@@ -56,6 +56,8 @@ public class Matrix<E> implements Iterable<E> { ...@@ -56,6 +56,8 @@ public class Matrix<E> implements Iterable<E> {
public int getRows(){ public int getRows(){
return this.rows; return this.rows;
} }
/*
public void displayMatrix() { public void displayMatrix() {
System.out.print(" "); System.out.print(" ");
for (int j = 0; j < columns; j++) { for (int j = 0; j < columns; j++) {
...@@ -80,6 +82,7 @@ public class Matrix<E> implements Iterable<E> { ...@@ -80,6 +82,7 @@ public class Matrix<E> implements Iterable<E> {
System.out.println(); System.out.println();
} }
} }
*/
private void validateIndexes(int x, int y) { private void validateIndexes(int x, int y) {
if (x < 0 || x >= rows || y < 0 || y >= columns) { if (x < 0 || x >= rows || y < 0 || y >= columns) {
...@@ -87,6 +90,10 @@ public class Matrix<E> implements Iterable<E> { ...@@ -87,6 +90,10 @@ public class Matrix<E> implements Iterable<E> {
} }
} }
public boolean validateIndexes(Position position){
return position.x() < 0 || position.x() >= rows || position.y() < 0 || position.y() >= columns;
}
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?> <?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.control.ToggleButton?>
<?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?> <?import javafx.scene.layout.VBox?>
<?import view.FirefighterGrid?> <?import view.FirefighterGrid?>
<?import javafx.scene.control.ToggleButton?>
<?import javafx.scene.control.Separator?>
<?import javafx.scene.control.Label?>
<HBox styleClass="background" stylesheets="@DarkTheme.css" <HBox styleClass="background" stylesheets="@DarkTheme.css"
xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="controller.Controller"> fx:controller="controller.Controller">
<VBox> <VBox>
<Separator maxHeight="-Infinity" maxWidth="-Infinity" <Separator maxHeight="-Infinity" maxWidth="-Infinity"
prefHeight="24.0" prefWidth="200.0" /> prefHeight="24.0" prefWidth="200.0" />
<Label maxHeight="-Infinity" maxWidth="-Infinity" alignment="CENTER" prefHeight="24.0" prefWidth="200.0" <Label maxHeight="-Infinity" maxWidth="-Infinity"
alignment="CENTER" prefHeight="24.0" prefWidth="200.0"
text="Generation number" /> text="Generation number" />
<Label fx:id="generationNumberLabel" alignment="CENTER" contentDisplay="TEXT_ONLY" <Label fx:id="generationNumberLabel"
maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="24.0" prefWidth="200.0"/> alignment="CENTER" contentDisplay="TEXT_ONLY"
maxHeight="-Infinity" maxWidth="-Infinity"
prefHeight="24.0" prefWidth="200.0" />
<Separator maxHeight="-Infinity" maxWidth="-Infinity" <Separator maxHeight="-Infinity" maxWidth="-Infinity"
prefHeight="24.0" prefWidth="200.0" /> prefHeight="24.0" prefWidth="200.0" />
<Button fx:id="restartButton" maxHeight="-Infinity" maxWidth="-Infinity" <Button fx:id="restartButton" maxHeight="-Infinity" maxWidth="-Infinity"
mnemonicParsing="false" onAction="#restartButtonAction" prefHeight="24.0" prefWidth="200.0" mnemonicParsing="false" onAction="#restartButtonAction"
text="Restart"/> prefHeight="24.0" prefWidth="200.0" text="Restart" />
<Button fx:id="oneStepButton" maxHeight="-Infinity" maxWidth="-Infinity" <Button fx:id="oneStepButton" maxHeight="-Infinity" maxWidth="-Infinity"
mnemonicParsing="false" onAction="#oneStepButtonAction" prefHeight="24.0" prefWidth="200.0" mnemonicParsing="false" onAction="#oneStepButtonAction"
text="One step"/> prefHeight="24.0" prefWidth="200.0" text="One step" />
<ToggleButton fx:id="playToggleButton" maxHeight="-Infinity" maxWidth="-Infinity" <ToggleButton fx:id="playToggleButton" maxHeight="-Infinity" maxWidth="-Infinity"
mnemonicParsing="false" onAction="#playToggleButtonAction" prefHeight="24.0" mnemonicParsing="false" onAction="#playToggleButtonAction"
prefWidth="200.0" styleClass="button" text="Play"/> prefHeight="24.0" prefWidth="200.0"
styleClass="button" text="Play" />
<ToggleButton fx:id="pauseToggleButton" maxHeight="-Infinity" maxWidth="-Infinity" <ToggleButton fx:id="pauseToggleButton" maxHeight="-Infinity" maxWidth="-Infinity"
mnemonicParsing="false" onAction="#pauseToggleButtonAction" prefHeight="24.0" mnemonicParsing="false" onAction="#pauseToggleButtonAction"
prefWidth="200.0" styleClass="button" text="Pause"/> prefHeight="24.0" prefWidth="200.0"
styleClass="button" text="Pause" />
</VBox> </VBox>
<FirefighterGrid fx:id="grid" <FirefighterGrid fx:id="grid"
xmlns="http://javafx.com/javafx" xmlns="http://javafx.com/javafx"
......
package view; package view;
import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat; import org.junit.jupiter.api.Test;
public class FirefighterGridTest { public class FirefighterGridTest {
@Test @Test
void testColumnCount(){ void testColumnCount(){
Grid<ViewElement> grid = new FirefighterGrid(); Grid<ViewElement> grid = new FirefighterGrid();
grid.setDimensions(20,10,10,10); grid.setDimensions(20,10,5,5);
assertThat(grid.columnCount()).isEqualTo(20); assertThat(grid.columnCount()).isEqualTo(20);
} }
@Test @Test
void testRowCount(){ void testRowCount(){
Grid<ViewElement> grid = new FirefighterGrid(); Grid<ViewElement> grid = new FirefighterGrid();
grid.setDimensions(20,10,10,10); grid.setDimensions(20,10,5,5);
assertThat(grid.rowCount()).isEqualTo(10); assertThat(grid.rowCount()).isEqualTo(10);
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment