Skip to content
Snippets Groups Projects
Commit c6c509e0 authored by Anthony Viola's avatar Anthony Viola
Browse files

Firefighter rebuild

parent 66bbe873
Branches
No related tags found
No related merge requests found
Pipeline #24537 passed
...@@ -18,7 +18,9 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -18,7 +18,9 @@ public class SimulatorApplication extends javafx.application.Application {
private static final int SQUARE_WIDTH = 50; private static final int SQUARE_WIDTH = 50;
private static final int SQUARE_HEIGHT = 50; private static final int SQUARE_HEIGHT = 50;
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 = 0;
public static final int INITIAL_CLOUD_COUNT = 3;
private Stage primaryStage; private Stage primaryStage;
private Parent view; private Parent view;
...@@ -44,7 +46,7 @@ public class SimulatorApplication extends javafx.application.Application { ...@@ -44,7 +46,7 @@ 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_FIRE_COUNT, INITIAL_FIREFIGHTER_COUNT, INITIAL_CLOUD_COUNT);
} }
private void showScene() { private void showScene() {
......
...@@ -21,6 +21,7 @@ import view.Grid; ...@@ -21,6 +21,7 @@ import view.Grid;
import view.ViewElement; 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;
...@@ -72,13 +73,18 @@ public class Controller { ...@@ -72,13 +73,18 @@ public class Controller {
} }
private void updateBoard2(){ private void updateBoard2(){
board.testScreen();
List<Position> updatedPositions = board.updateToNextGeneration2(); List<Position> updatedPositions = board.updateToNextGeneration2();
List<Position> updatedClearSquares = new ArrayList<>();
List<Item> updatedSquares = new ArrayList<>(); List<Item> updatedSquares = new ArrayList<>();
for(Position updatedPosition : updatedPositions){ for(Position updatedPosition : updatedPositions){
Item squareState = board.getItemByPosition(updatedPosition); Item squareState = board.getItemByPosition(updatedPosition);
updatedClearSquares.add(updatedPosition);
if (squareState != null){
updatedSquares.add(squareState); updatedSquares.add(squareState);
} }
grid.repaint(updatedSquares); }
grid.repaint2(updatedSquares, updatedClearSquares);
updateGenerationLabel(board.stepNumber()); updateGenerationLabel(board.stepNumber());
} }
...@@ -93,6 +99,12 @@ public class Controller { ...@@ -93,6 +99,12 @@ public class Controller {
updateGenerationLabel(board.stepNumber()); updateGenerationLabel(board.stepNumber());
} }
private void repaintGrid2(){
grid.initialize(board.itemList());
updateGenerationLabel(board.stepNumber());
}
private ViewElement getViewElement(List<ModelElement> squareState) { private ViewElement getViewElement(List<ModelElement> squareState) {
if(squareState.contains(ModelElement.FIREFIGHTER)){ if(squareState.contains(ModelElement.FIREFIGHTER)){
return ViewElement.FIREFIGHTER; return ViewElement.FIREFIGHTER;
...@@ -106,7 +118,7 @@ public class Controller { ...@@ -106,7 +118,7 @@ public class Controller {
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 =
event -> updateBoard(); event -> updateBoard2();
KeyFrame keyFrame = new KeyFrame(duration, eventHandler); KeyFrame keyFrame = new KeyFrame(duration, eventHandler);
timeline = new Timeline(keyFrame); timeline = new Timeline(keyFrame);
timeline.setCycleCount(Animation.INDEFINITE); timeline.setCycleCount(Animation.INDEFINITE);
...@@ -132,7 +144,7 @@ public class Controller { ...@@ -132,7 +144,7 @@ public class Controller {
this.pause(); this.pause();
board.reset(); board.reset();
pauseToggleButton.setSelected(true); pauseToggleButton.setSelected(true);
repaintGrid(); repaintGrid2();
} }
public void initialize(int squareWidth, int squareHeight, int columnCount, public void initialize(int squareWidth, int squareHeight, int columnCount,
...@@ -142,9 +154,17 @@ public class Controller { ...@@ -142,9 +154,17 @@ public class Controller {
repaintGrid(); repaintGrid();
} }
public void initialize(int squareWidth, int squareHeight, int columnCount,
int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudCount) {
this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount, initialCloudCount));
grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
repaintGrid2();
}
public void oneStepButtonAction() { public void oneStepButtonAction() {
this.pause(); this.pause();
updateBoard(); updateBoard2();
} }
private void updateGenerationLabel(int value){ private void updateGenerationLabel(int value){
......
...@@ -71,6 +71,9 @@ public interface Board<S> { ...@@ -71,6 +71,9 @@ public interface Board<S> {
*/ */
int stepNumber(); int stepNumber();
List<Item> itemList();
Item getItemByPosition(Position position); Item getItemByPosition(Position position);
void testScreen();
} }
package model; package model;
import javafx.scene.paint.Color;
import util.Position; import util.Position;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -9,6 +10,7 @@ import java.util.Random; ...@@ -9,6 +10,7 @@ import java.util.Random;
public class Cloud extends Extinguisher implements Item { public class Cloud extends Extinguisher implements Item {
public Cloud(Position position) { public Cloud(Position position) {
super(position); super(position);
color = Color.GREY;
} }
...@@ -29,4 +31,9 @@ public class Cloud extends Extinguisher implements Item { ...@@ -29,4 +31,9 @@ public class Cloud extends Extinguisher implements Item {
result.add(position); result.add(position);
return result; return result;
} }
public String toString(){
return "Nuage position : [" + position.row() + ", " + position.column()+ "]";
}
} }
package model; package model;
import javafx.scene.paint.Color;
import util.Position; import util.Position;
import view.FirefighterGrid;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public abstract class Extinguisher { public abstract class Extinguisher {
protected Position position; protected Position position;
protected Color color;
public Extinguisher(Position position){ public Extinguisher(Position position){
this.position = position; this.position = position;
...@@ -41,4 +45,11 @@ public abstract class Extinguisher { ...@@ -41,4 +45,11 @@ public abstract class Extinguisher {
} }
abstract List<Position> move(FirefighterBoard board); abstract List<Position> move(FirefighterBoard board);
public void paint(FirefighterGrid grid){
grid.paintCircle(position.row(), position.column(), color);
}
public abstract String toString();
} }
package model; package model;
import javafx.scene.paint.Color;
import util.Position; import util.Position;
import view.FirefighterGrid;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -8,9 +10,11 @@ import java.util.List; ...@@ -8,9 +10,11 @@ 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;
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) {
...@@ -22,9 +26,17 @@ public class Fire implements Item{ ...@@ -22,9 +26,17 @@ public class Fire implements Item{
result.add(neighborposition); result.add(neighborposition);
} }
} }
return neighborslist; return result;
} }
public Position position() { public Position position() {
return position; return position;
} }
public void paint(FirefighterGrid grid){
grid.paintTriangle(position.row(), position.column(), color);
}
public String toString(){
return "Feu position : [" + position.row() + ", " + position.column()+ "]";
}
} }
package model; package model;
import javafx.scene.paint.Color;
import util.Position; import util.Position;
import java.util.List;
import java.util.*; import java.util.*;
public class Firefighter extends Extinguisher implements Item{ public class Firefighter extends Extinguisher implements Item{
public Firefighter(Position position) { public Firefighter(Position position) {
super(position); super(position);
this.color = Color.BLUE;
} }
public List<Position> move(FirefighterBoard board) { public List<Position> move(FirefighterBoard board) {
...@@ -38,4 +41,9 @@ public class Firefighter extends Extinguisher implements Item{ ...@@ -38,4 +41,9 @@ public class Firefighter extends Extinguisher implements Item{
} }
return null; return null;
} }
public String toString(){
return "Pompier position : [" + position.row() + ", " + position.column()+ "]";
}
} }
...@@ -11,6 +11,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -11,6 +11,8 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
private final int initialFireCount; private final int initialFireCount;
private final int initialFirefighterCount; private final int initialFirefighterCount;
private final int initialCloudCount;
private List<Item> itemList; private List<Item> itemList;
private List<Box> boxList; private List<Box> boxList;
private List<Position> firefighterPositions; private List<Position> firefighterPositions;
...@@ -23,9 +25,21 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -23,9 +25,21 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
this.rowCount = rowCount; this.rowCount = rowCount;
this.initialFireCount = initialFireCount; this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount; this.initialFirefighterCount = initialFirefighterCount;
this.initialCloudCount = 0;
initializeElements(); initializeElements();
} }
public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount, int initialCloudCount) {
this.columnCount = columnCount;
this.rowCount = rowCount;
this.itemList = new ArrayList<>();
this.boxList = new ArrayList<>();
this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount;
this.initialCloudCount = initialCloudCount;
initializeElements2();
}
public void initializeElements() { public void initializeElements() {
firefighterPositions = new ArrayList<>(); firefighterPositions = new ArrayList<>();
firePositions = new HashSet<>(); firePositions = new HashSet<>();
...@@ -35,10 +49,30 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -35,10 +49,30 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
firefighterPositions.add(randomPosition()); firefighterPositions.add(randomPosition());
} }
public void initializeElements2() {
for (int i = 0; i < initialFireCount; i++){
itemList.add(new Fire(randomEmptyPosition()));
}
for (int i = 0; i < initialFirefighterCount; i++){
itemList.add(new Firefighter(randomEmptyPosition()));
}
for (int i = 0; i < initialCloudCount; i++){
itemList.add(new Cloud(randomEmptyPosition()));
}
}
private Position randomPosition() { private Position randomPosition() {
return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount)); return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
} }
private Position randomEmptyPosition() {
Position result;
for(;;){
result = new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
if (getItemByPosition(result) == null) return result;
}
}
@Override @Override
public List<ModelElement> getState(Position position) { public List<ModelElement> getState(Position position) {
List<ModelElement> result = new ArrayList<>(); List<ModelElement> result = new ArrayList<>();
...@@ -70,11 +104,13 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -70,11 +104,13 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
public List<Position> updateToNextGeneration2() { public List<Position> updateToNextGeneration2() {
List<Position> result = new ArrayList<Position>(); List<Position> result = new ArrayList<Position>();
for (Item item: itemList) { List<Item> actualItemList = new ArrayList<Item>(itemList);
for (Item item: actualItemList) {
if (!(item instanceof Fire)) result.addAll(item.update(this)); if (!(item instanceof Fire)) result.addAll(item.update(this));
} }
if (step%2 == 0){ actualItemList = new ArrayList<Item>(itemList);
for (Item item: itemList) { if (step % 2 == 1){
for (Item item: actualItemList) {
if (item instanceof Fire) result.addAll(item.update(this)); if (item instanceof Fire) result.addAll(item.update(this));
} }
} }
...@@ -103,7 +139,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -103,7 +139,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
public Item getItemByPosition(Position position) { public Item getItemByPosition(Position position) {
for (Item item : itemList) { for (Item item : itemList) {
if (item.position() == position){ if (item.position().equals(position)) {
return item; return item;
} }
} }
...@@ -134,7 +170,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -134,7 +170,9 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
@Override @Override
public void reset() { public void reset() {
step = 0; step = 0;
initializeElements(); itemList.clear();
boxList.clear();
initializeElements2();
} }
private void extinguish(Position position) { private void extinguish(Position position) {
...@@ -184,4 +222,24 @@ public class FirefighterBoard implements Board<List<ModelElement>> { ...@@ -184,4 +222,24 @@ public class FirefighterBoard implements Board<List<ModelElement>> {
} }
} }
} }
public void testScreen(){
Position position;
for (int row = 0; row < rowCount; row++){
for (int column = 0; column < columnCount; column++){
position = new Position(row,column);
if (getItemByPosition(position) == null){
System.out.print("□ ");
} else if (getItemByPosition(position) instanceof Fire) {
System.out.print("f ");
} else if (getItemByPosition(position) instanceof Cloud) {
System.out.print("c ");
} else if (getItemByPosition(position) instanceof Firefighter) {
System.out.print("F ");
}
}
System.out.println();
}
System.out.println();
}
} }
\ No newline at end of file
package model; package model;
import util.Position; import util.Position;
import view.FirefighterGrid;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -9,4 +11,8 @@ public interface Item { ...@@ -9,4 +11,8 @@ public interface Item {
List<Position> update(FirefighterBoard board); List<Position> update(FirefighterBoard board);
Position position(); Position position();
void paint(FirefighterGrid grid);
String toString();
} }
...@@ -3,8 +3,12 @@ package view; ...@@ -3,8 +3,12 @@ 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 javafx.util.Pair;
import model.Fire;
import model.Item;
import util.Position; import util.Position;
import java.util.ArrayList;
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<ViewElement>{
...@@ -24,6 +28,19 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{ ...@@ -24,6 +28,19 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
paintLines(); paintLines();
} }
@Override
public void repaint(ViewElement[][] elements) {
clear();
paint(elements);
paintLines();
}
public void repaint2(List<Item> itemList, List<Position> clearList) {
clear2(clearList);
paint2(itemList);
paintLines();
}
private void clear(List<Pair<Position, ViewElement>> positionedElements) { private void clear(List<Pair<Position, ViewElement>> positionedElements) {
for (Pair<Position, ViewElement> positionElement : positionedElements) { for (Pair<Position, ViewElement> positionElement : positionedElements) {
Position position = positionElement.getKey(); Position position = positionElement.getKey();
...@@ -31,19 +48,37 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{ ...@@ -31,19 +48,37 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
} }
} }
private void clear2(List<Position> positions) {
for (Position position : positions) {
clearSquare(position.row(), position.column());
paintSquare(position.row(), position.column(), Color.WHITE);
}
}
private void paint(List<Pair<Position, ViewElement>> positionedElements) { private void paint(List<Pair<Position, ViewElement>> positionedElements) {
for(Pair<Position, ViewElement> pair : positionedElements){ for(Pair<Position, ViewElement> pair : positionedElements){
paintElementAtPosition(pair.getValue(), pair.getKey()); paintElementAtPosition(pair.getValue(), pair.getKey());
} }
} }
@Override private void paint2(List<Item> itemList) {
public void repaint(ViewElement[][] elements) { for (Item item : itemList) {
clear(); item.paint(this);
paint(elements); }
}
public void initialize(List<Item> itemList) {
for (int row = 0; row < rowCount; row++){
for (int column = 0; column < columnCount; column++){
paintSquare(row, column, Color.WHITE);
}
}
paintLines(); paintLines();
paint2(itemList);
} }
private void clear() { private void clear() {
getGraphicsContext2D().clearRect(0,0,getWidth(), getHeight()); getGraphicsContext2D().clearRect(0,0,getWidth(), getHeight());
} }
...@@ -91,6 +126,18 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{ ...@@ -91,6 +126,18 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
getGraphicsContext2D().fillRect(row*squareHeight,column*squareWidth,squareHeight,squareWidth); getGraphicsContext2D().fillRect(row*squareHeight,column*squareWidth,squareHeight,squareWidth);
} }
public void paintTriangle(int row, int column, Color color){
getGraphicsContext2D().setFill(color);
getGraphicsContext2D().fillPolygon(new double[]{row*squareHeight , row*squareHeight + squareHeight/2, (row+1)*squareHeight},
new double[]{(column+1)*squareWidth , column*squareHeight, (column+1)*squareHeight},
3);
}
public void paintCircle(int row, int column, Color color){
getGraphicsContext2D().setFill(color);
getGraphicsContext2D().fillOval(row*squareHeight, column*squareWidth, squareHeight, squareWidth);
}
private void clearSquare(int row, int column){ private void clearSquare(int row, int column){
getGraphicsContext2D().clearRect(row*squareHeight,column*squareWidth,squareHeight,squareWidth); getGraphicsContext2D().clearRect(row*squareHeight,column*squareWidth,squareHeight,squareWidth);
} }
......
package view; package view;
import javafx.util.Pair; import javafx.util.Pair;
import model.Item;
import util.Position; import util.Position;
import model.Board;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
/** /**
...@@ -27,6 +31,8 @@ public interface Grid<E> { ...@@ -27,6 +31,8 @@ public interface Grid<E> {
*/ */
void repaint(E[][] elements); void repaint(E[][] elements);
void repaint2(List<Item> itemList, List<Position> clearList);
/** /**
* 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,
* and square height. * and square height.
...@@ -51,5 +57,7 @@ public interface Grid<E> { ...@@ -51,5 +57,7 @@ public interface Grid<E> {
* @return The number of rows in the grid. * @return The number of rows in the grid.
*/ */
int rowCount(); int rowCount();
void initialize(List<Item> itemList);
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment