Skip to content
Snippets Groups Projects
Commit 65a9316d authored by VIOLA Anthony's avatar VIOLA Anthony
Browse files

MotorFirefighter ajout des Box (fini pour Fire)

parent 5aab97ea
No related branches found
No related tags found
No related merge requests found
Pipeline #24841 passed
Showing
with 180 additions and 109 deletions
...@@ -21,6 +21,9 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -21,6 +21,9 @@ public class SimulatorApplication extends javafx.application.Application {
public static final int INITIAL_FIREFIGHTER_COUNT = 4; public static final int INITIAL_FIREFIGHTER_COUNT = 4;
public static final int INITIAL_MOTORFIREFIGHTER_COUNT = 1; public static final int INITIAL_MOTORFIREFIGHTER_COUNT = 1;
public static final int INITIAL_CLOUD_COUNT = 4; public static final int INITIAL_CLOUD_COUNT = 4;
public static final int INITIAL_MOUNTAIN_COUNT = 5;
public static final int INITIAL_ROAD_COUNT = 2;
public static final int INITIAL_ROCKERIES_COUNT = 5;
private Stage primaryStage; private Stage primaryStage;
private Parent view; private Parent view;
...@@ -46,7 +49,8 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -46,7 +49,8 @@ public class SimulatorApplication extends javafx.application.Application {
view = loader.load(); view = loader.load();
Controller controller = loader.getController(); Controller controller = loader.getController();
controller.initialize(SQUARE_WIDTH, SQUARE_HEIGHT, COLUMN_COUNT, ROW_COUNT, controller.initialize(SQUARE_WIDTH, SQUARE_HEIGHT, COLUMN_COUNT, ROW_COUNT,
INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT, INITIAL_MOTORFIREFIGHTER_COUNT); INITIAL_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT, INITIAL_MOTORFIREFIGHTER_COUNT,
INITIAL_MOUNTAIN_COUNT, INITIAL_ROAD_COUNT, INITIAL_ROCKERIES_COUNT);
} }
private void showScene() { private void showScene() {
......
...@@ -11,17 +11,13 @@ import javafx.scene.control.Label; ...@@ -11,17 +11,13 @@ import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup; import javafx.scene.control.ToggleGroup;
import javafx.util.Duration; import javafx.util.Duration;
import javafx.util.Pair;
import model.Board; import model.Board;
import model.Item; import model.Item;
import model.ModelElement;
import model.FirefighterBoard; import model.FirefighterBoard;
import util.Position; import util.Position;
import view.Grid; import view.Grid;
import view.ViewElement;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNull;
...@@ -40,9 +36,9 @@ public class Controller { ...@@ -40,9 +36,9 @@ public class Controller {
@FXML @FXML
private ToggleButton playToggleButton; private ToggleButton playToggleButton;
@FXML @FXML
private Grid<ViewElement> grid; private Grid grid;
private Timeline timeline; private Timeline timeline;
private Board<List<ModelElement>> board; private Board board;
@FXML @FXML
private void initialize() { private void initialize() {
...@@ -56,7 +52,7 @@ public class Controller { ...@@ -56,7 +52,7 @@ public class Controller {
pauseToggleButton.setSelected(true); pauseToggleButton.setSelected(true);
} }
private void setModel(FirefighterBoard firefighterBoard) { private void setBoard(FirefighterBoard firefighterBoard) {
this.board = requireNonNull(firefighterBoard, "firefighter.model is null"); this.board = requireNonNull(firefighterBoard, "firefighter.model is null");
} }
...@@ -72,26 +68,16 @@ public class Controller { ...@@ -72,26 +68,16 @@ public class Controller {
updatedSquares.add(squareState); updatedSquares.add(squareState);
} }
} }
grid.repaint(updatedSquares, updatedClearSquares); grid.repaint(updatedSquares, updatedClearSquares, board);
updateGenerationLabel(board.stepNumber()); updateGenerationLabel(board.stepNumber());
//board.testScreen(); //board.testScreen();
} }
private void repaintGrid(){ private void repaintGrid(){
grid.initialize(board.itemList()); grid.initialize(board);
updateGenerationLabel(board.stepNumber()); updateGenerationLabel(board.stepNumber());
} }
private ViewElement getViewElement(List<ModelElement> squareState) {
if(squareState.contains(ModelElement.FIREFIGHTER)){
return ViewElement.FIREFIGHTER;
}
if (squareState.contains(ModelElement.FIRE)){
return ViewElement.FIRE;
}
return ViewElement.EMPTY;
}
private void initializeTimeline() { private void initializeTimeline() {
Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS); Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS);
EventHandler<ActionEvent> eventHandler = EventHandler<ActionEvent> eventHandler =
...@@ -124,9 +110,11 @@ public class Controller { ...@@ -124,9 +110,11 @@ public class Controller {
repaintGrid(); repaintGrid();
} }
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 initialCloudCount, int initialMotorFirefighterCount) { int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudCount, int initialMotorFirefighterCount,
int initialMountainCount, int initialRoadCount, int initialRockeriesCount) {
this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount, initialCloudCount, initialMotorFirefighterCount)); this.setBoard(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount, initialCloudCount, initialMotorFirefighterCount,
initialMountainCount, initialRoadCount, initialRockeriesCount));
grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight); grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
repaintGrid(); repaintGrid();
} }
......
...@@ -9,7 +9,7 @@ import java.util.List; ...@@ -9,7 +9,7 @@ import java.util.List;
* *
* @param <S> The type of state represented on the board. * @param <S> The type of state represented on the board.
*/ */
public interface Board<S> { public interface Board {
/** /**
* Get the number of rows in the board. * Get the number of rows in the board.
...@@ -57,6 +57,7 @@ public interface Board<S> { ...@@ -57,6 +57,7 @@ public interface Board<S> {
List<Item> itemList(); List<Item> itemList();
Item getItemByPosition(Position position); Item getItemByPosition(Position position);
Box getBoxByPosition(Position position);
void testScreen(); void testScreen();
} }
package model; package model;
import util.Position;
import view.FirefighterGrid;
public interface Box { public interface Box {
Position position();
void paint(FirefighterGrid grid);
} }
...@@ -10,18 +10,18 @@ import java.util.List; ...@@ -10,18 +10,18 @@ import java.util.List;
public class Fire implements Item{ public class Fire implements Item{
private final Position position; private final Position position;
private final Color color; private final Color color = Color.RED;
private Integer fireSpread = 0;
public Fire(Position position) { public Fire(Position position) {
this.position = position; this.position = position;
this.color = Color.RED;
} }
public List<Position> update(FirefighterBoard board) { public List<Position> update(FirefighterBoard board) {
ArrayList<Position> result = new ArrayList<Position>(); ArrayList<Position> result = new ArrayList<Position>();
List<Position> neighborslist = board.neighbors(position); List<Position> neighborslist = board.neighbors(position);
for (Position neighborposition : neighborslist) { for (Position neighborposition : neighborslist) {
if (board.getItemByPosition(neighborposition) == null) { if ((board.getItemByPosition(neighborposition) == null && board.getBoxByPosition(neighborposition) == null ) || (board.getBoxByPosition(position) instanceof Rockeries && fireSpread())) {
board.itemList().add(new Fire(neighborposition)); board.itemList().add(new Fire(neighborposition));
result.add(neighborposition); result.add(neighborposition);
} }
...@@ -39,4 +39,13 @@ public class Fire implements Item{ ...@@ -39,4 +39,13 @@ public class Fire implements Item{
public String toString(){ public String toString(){
return "Feu position : [" + position.row() + ", " + position.column()+ "]"; return "Feu position : [" + position.row() + ", " + position.column()+ "]";
} }
public boolean fireSpread(){
fireSpread++;
if (fireSpread == 2){
fireSpread = 0;
return true;
}
return false;
}
} }
...@@ -18,7 +18,7 @@ public class Firefighter extends Extinguisher implements Item{ ...@@ -18,7 +18,7 @@ public class Firefighter extends Extinguisher implements Item{
HashMap<Position, Position> firstMove = new HashMap<>(); HashMap<Position, Position> firstMove = new HashMap<>();
Queue<Position> toVisit = new LinkedList<>(); Queue<Position> toVisit = new LinkedList<>();
for (Position initialMove : board.neighbors(position)) { for (Position initialMove : board.neighbors(position)) {
if (board.getItemByPosition(initialMove) == null) { if (board.getItemByPosition(initialMove) == null && !(board.getBoxByPosition(initialMove) instanceof Mountain)) {
firstMove.put(initialMove, initialMove); firstMove.put(initialMove, initialMove);
toVisit.add(initialMove); toVisit.add(initialMove);
} }
......
...@@ -5,23 +5,23 @@ import util.Position; ...@@ -5,23 +5,23 @@ import util.Position;
import java.util.*; import java.util.*;
public class FirefighterBoard implements Board<List<ModelElement>> { public class FirefighterBoard implements Board {
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 int initialMotorFirefighterCount; private final int initialMotorFirefighterCount;
private final int initialCloudCount; private final int initialCloudCount;
private final int initialMountainCount;
private final int initialRoadCount;
private final int initialRockeriesCount;
private List<Item> itemList; private List<Item> itemList;
private List<Box> boxList; private List<Box> boxList;
private List<Position> firefighterPositions;
private Set<Position> firePositions;
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, int initialCloudCount, int initialMotorFirefighterCount) { public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudCount, int initialMotorFirefighterCount,
int initialMountainCount, int initialRoadCount, int initialRockeriesCount) {
this.columnCount = columnCount; this.columnCount = columnCount;
this.rowCount = rowCount; this.rowCount = rowCount;
this.itemList = new ArrayList<>(); this.itemList = new ArrayList<>();
...@@ -30,10 +30,26 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -30,10 +30,26 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
this.initialFirefighterCount = initialFirefighterCount; this.initialFirefighterCount = initialFirefighterCount;
this.initialCloudCount = initialCloudCount; this.initialCloudCount = initialCloudCount;
this.initialMotorFirefighterCount = initialMotorFirefighterCount; this.initialMotorFirefighterCount = initialMotorFirefighterCount;
initializeElements(); this.initialMountainCount = initialMountainCount;
this.initialRoadCount = initialRoadCount;
this.initialRockeriesCount = initialRockeriesCount;
initializeBox();
initializeItems();
} }
public void initializeElements() { public void initializeBox() {
for (int i = 0; i < initialMountainCount; i++){
boxList.add(new Mountain(randomEmptyPosition()));
}
for (int i = 0; i < initialRoadCount; i++){
boxList.add(new Road(randomEmptyPosition()));
}
for (int i = 0; i < initialRockeriesCount; i++){
boxList.add(new Rockeries(randomEmptyPosition()));
}
}
public void initializeItems() {
for (int i = 0; i < initialFireCount; i++){ for (int i = 0; i < initialFireCount; i++){
itemList.add(new Fire(randomEmptyPosition())); itemList.add(new Fire(randomEmptyPosition()));
} }
...@@ -48,18 +64,18 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -48,18 +64,18 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
} }
} }
private Position randomPosition() {
return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
}
private Position randomEmptyPosition() { private Position randomEmptyPosition() {
Position result; Position result;
for(;;){ for(;;){
result = new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount)); result = randomPosition();
if (getItemByPosition(result) == null) return result; if (getItemByPosition(result) == null && getBoxByPosition(result) == null) return result;
} }
} }
private Position randomPosition() {
return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
}
@Override @Override
public int rowCount() { public int rowCount() {
return rowCount; return rowCount;
...@@ -90,6 +106,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -90,6 +106,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
public int stepNumber() { return step; } public int stepNumber() { return step; }
public List<Item> itemList() { return itemList; } public List<Item> itemList() { return itemList; }
public List<Box> boxList() { return boxList; }
public Item getItemByPosition(Position position) { public Item getItemByPosition(Position position) {
for (Item item : itemList) { for (Item item : itemList) {
...@@ -100,14 +117,22 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -100,14 +117,22 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
return null; return null;
} }
public List<Box> boxList() { return boxList; } public Box getBoxByPosition(Position position) {
for (Box box : boxList) {
if (box.position().equals(position)) {
return box;
}
}
return null;
}
@Override @Override
public void reset() { public void reset() {
step = 0; step = 0;
itemList.clear(); itemList.clear();
boxList.clear(); boxList.clear();
initializeElements(); initializeBox();
initializeItems();
} }
public List<Position> neighbors(Position position) { public List<Position> neighbors(Position position) {
......
package model;
public enum ModelElement {
FIREFIGHTER, FIRE
}
package model; package model;
import javafx.scene.paint.Color;
import util.Position;
import view.FirefighterGrid;
public class Mountain implements Box{ public class Mountain implements Box{
private final Position position;
private final Color color = Color.DARKGRAY;
public Mountain(Position position) {
this.position = position;
}
@Override
public Position position() {
return position;
}
public void paint(FirefighterGrid grid){
grid.paintSquare(position.row(), position.column(), color);
}
public String toString(){
return "Montagne position : [" + position.row() + ", " + position.column()+ "]";
}
} }
package model; package model;
import javafx.scene.paint.Color;
import util.Position;
import view.FirefighterGrid;
public class Road implements Box{ public class Road implements Box{
private Position position;
private final Color color = Color.BLACK;
public Road(Position position){
this.position = position;
}
public Position position() {
return position;
}
public void paint(FirefighterGrid grid){
grid.paintSquare(position.row(), position.column(), color);
}
public String toString(){
return "Route position : [" + position.row() + ", " + position.column()+ "]";
}
} }
package model; package model;
import javafx.scene.paint.Color;
import util.Position;
import view.FirefighterGrid;
public class Rockeries implements Box{ public class Rockeries implements Box{
private final Position position;
private final Color color = Color.BROWN;
public Rockeries(Position position) {
this.position = position;
}
@Override
public Position position() {
return position;
}
public void paint(FirefighterGrid grid){
grid.paintSquare(position.row(), position.column(), color);
}
public String toString(){
return "Rocailles position : [" + position.row() + ", " + position.column()+ "]";
}
} }
...@@ -2,7 +2,8 @@ package view; ...@@ -2,7 +2,8 @@ package view;
import javafx.scene.canvas.Canvas; import javafx.scene.canvas.Canvas;
import javafx.scene.paint.Color; import javafx.scene.paint.Color;
import javafx.util.Pair; import model.Board;
import model.Box;
import model.Fire; import model.Fire;
import model.Item; import model.Item;
import util.Position; import util.Position;
...@@ -11,56 +12,55 @@ import java.util.ArrayList; ...@@ -11,56 +12,55 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
public class FirefighterGrid extends Canvas implements Grid<ViewElement>{ public class FirefighterGrid extends Canvas implements Grid{
private void paintElementAtPosition(ViewElement element, Position position) {
paintSquare(position.row(), position.column(), element.color);
}
private int squareWidth; private int squareWidth;
private int squareHeight; private int squareHeight;
private int columnCount; private int columnCount;
private int rowCount; private int rowCount;
public void repaint(List<Item> itemList, List<Position> clearList) { public void repaint(List<Item> itemList, List<Position> clearList, Board board) {
clear(clearList); clear(clearList, board);
paint(itemList); paintItems(itemList);
paintLines(); paintLines();
} }
private void clear(List<Position> positions) { private void clear(List<Position> positions, Board board) {
Box box;
for (Position position : positions) { for (Position position : positions) {
clearSquare(position.row(), position.column()); clearSquare(position.row(), position.column());
box = board.getBoxByPosition(position);
if (box != null){
box.paint(this);
}else {
paintSquare(position.row(), position.column(), Color.WHITE); paintSquare(position.row(), position.column(), Color.WHITE);
} }
} }
}
private void paint(List<Item> itemList) { private void paintItems(List<Item> itemList) {
for (Item item : itemList) { for (Item item : itemList) {
item.paint(this); item.paint(this);
} }
} }
public void initialize(List<Item> itemList) { private void paintBox(Board board){
Box box;
for (int row = 0; row < rowCount; row++){ for (int row = 0; row < rowCount; row++){
for (int column = 0; column < columnCount; column++){ for (int column = 0; column < columnCount; column++){
box = board.getBoxByPosition(new Position(row, column));
if (box != null){
box.paint(this);
}else {
paintSquare(row, column, Color.WHITE); paintSquare(row, column, Color.WHITE);
} }
} }
paintLines();
paint(itemList);
} }
private void clear() {
getGraphicsContext2D().clearRect(0,0,getWidth(), getHeight());
} }
private void paint(ViewElement[][] elements) { public void initialize(Board board) {
for(int column = 0; column < columnCount; column++) paintBox(board);
for(int row = 0; row < rowCount; row++){ paintLines();
paintElementAtPosition(elements[row][column], new Position(row, column)); paintItems(board.itemList());
}
} }
public int columnCount() { public int columnCount() {
...@@ -97,7 +97,7 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{ ...@@ -97,7 +97,7 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
getGraphicsContext2D().strokeLine(0, row*squareHeight, getWidth(), row*squareHeight); getGraphicsContext2D().strokeLine(0, row*squareHeight, getWidth(), row*squareHeight);
} }
private void paintSquare(int row, int column, Color color){ public void paintSquare(int row, int column, Color color){
getGraphicsContext2D().setFill(color); getGraphicsContext2D().setFill(color);
getGraphicsContext2D().fillRect(column*squareWidth,row*squareHeight, squareWidth, squareHeight); getGraphicsContext2D().fillRect(column*squareWidth,row*squareHeight, squareWidth, squareHeight);
} }
......
...@@ -14,9 +14,9 @@ import java.util.List; ...@@ -14,9 +14,9 @@ import java.util.List;
* *
* @param <E> The type of elements stored in the grid. * @param <E> The type of elements stored in the grid.
*/ */
public interface Grid<E> { public interface Grid {
void repaint(List<Item> itemList, List<Position> clearList); void repaint(List<Item> itemList, List<Position> clearList, Board board);
/** /**
* Set the dimensions of the grid to the specified number of columns, number of rows, square width, * Set the dimensions of the grid to the specified number of columns, number of rows, square width,
...@@ -43,6 +43,6 @@ public interface Grid<E> { ...@@ -43,6 +43,6 @@ public interface Grid<E> {
*/ */
int rowCount(); int rowCount();
void initialize(List<Item> itemList); void initialize(Board board);
} }
package view;
import javafx.scene.paint.Color;
public enum ViewElement {
FIREFIGHTER(Color.BLUE), FIRE(Color.RED), EMPTY(Color.WHITE);
final Color color;
ViewElement(Color color) {
this.color = color;
}
}
...@@ -10,29 +10,29 @@ import static org.assertj.core.api.Assertions.*; ...@@ -10,29 +10,29 @@ 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, 0, 0); Board board = new FirefighterBoard(20, 10, 1, 3, 0, 0, 0, 0, 0);
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, 0, 0); Board board = new FirefighterBoard(20, 10, 1, 3, 0, 0, 0, 0, 0);
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, 0, 0); Board board = new FirefighterBoard(20, 10, 1, 3, 0, 0, 0, 0, 0);
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();
} }
assertThat(board.stepNumber()).isEqualTo(10); assertThat(board.stepNumber()).isEqualTo(10);
} }
@Test /* @Test
void testGetState_afterSet(){ void testGetState_afterSet(){
Board<List<ModelElement>> board = new FirefighterBoard(20, 10, 0, 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);
assertThat(board.getState(position)).containsExactly(ModelElement.FIRE);*/ assertThat(board.getState(position)).containsExactly(ModelElement.FIRE);
} }*/
} }
...@@ -5,16 +5,5 @@ import org.junit.jupiter.api.Test; ...@@ -5,16 +5,5 @@ import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
public class FirefighterGridTest { public class FirefighterGridTest {
@Test
void testColumnCount(){
Grid<ViewElement> grid = new FirefighterGrid();
grid.setDimensions(20,10,10,10);
assertThat(grid.columnCount()).isEqualTo(20);
}
@Test
void testRowCount(){
Grid<ViewElement> grid = new FirefighterGrid();
grid.setDimensions(20,10,10,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