Skip to content
Snippets Groups Projects
Commit 40fffab0 authored by HEBBACHE Mohamed's avatar HEBBACHE Mohamed
Browse files

change ViewElement with BoardElement

parent bc0be0e0
No related branches found
No related tags found
No related merge requests found
Pipeline #24035 failed
......@@ -12,12 +12,9 @@ import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.util.Duration;
import javafx.util.Pair;
import model.Board;
import model.ModelElement;
import model.FirefighterBoard;
import model.*;
import util.Position;
import view.Grid;
import view.ViewElement;
import java.util.ArrayList;
import java.util.List;
......@@ -38,9 +35,9 @@ public class Controller {
@FXML
private ToggleButton playToggleButton;
@FXML
private Grid<ViewElement> grid;
private Grid<BoardElement> grid;
private Timeline timeline;
private Board<List<ModelElement>> board;
private GameBoard board;
@FXML
private void initialize() {
......@@ -54,17 +51,17 @@ public class Controller {
pauseToggleButton.setSelected(true);
}
private void setModel(FirefighterBoard firefighterBoard) {
this.board = requireNonNull(firefighterBoard, "firefighter.model is null");
private void setModel(GameBoard gameBoard) {
this.board = requireNonNull(gameBoard, "GameBoard.model is null");
}
private void updateBoard(){
List<Position> updatedPositions = board.updateToNextGeneration();
List<Pair<Position, ViewElement>> updatedSquares = new ArrayList<>();
List<Pair<Position, BoardElement>> updatedSquares = new ArrayList<>();
for(Position updatedPosition : updatedPositions){
List<ModelElement> squareState = board.getState(updatedPosition);
ViewElement viewElement = getViewElement(squareState);
updatedSquares.add(new Pair<>(updatedPosition, viewElement));
//List<ModelElement> squareState = board.getState(updatedPosition);
//BoardElement viewElement = getViewElement(squareState);
//updatedSquares.add(new Pair<>(updatedPosition, viewElement));
}
grid.repaint(updatedSquares);
updateGenerationLabel(board.stepNumber());
......@@ -73,23 +70,28 @@ public class Controller {
private void repaintGrid(){
int columnCount = board.columnCount();
int rowCount = board.rowCount();
ViewElement[][] viewElements = new ViewElement[rowCount][columnCount];
model.BoardElement[][] boardElements = new model.BoardElement[rowCount][columnCount];
for(int column = 0; column < columnCount; column++)
for(int row = 0; row < rowCount; row++)
viewElements[row][column] = getViewElement(board.getState(new Position(row, column)));
grid.repaint(viewElements);
for(int row = 0; row < rowCount; row++){
if(board.getElementPosition().containsKey(new Position(row,column))){
boardElements[row][column] = board.getElementPosition().get(new Position(row,column)).get(0);
}else{
boardElements[row][column]=new EmptyElement();
}
}
grid.repaint(boardElements);
updateGenerationLabel(board.stepNumber());
}
private ViewElement getViewElement(List<ModelElement> squareState) {
/*private BoardElement getViewElement(List<ModelElement> squareState) {
if(squareState.contains(ModelElement.FIREFIGHTER)){
return ViewElement.FIREFIGHTER;
return BoardElement.FIREFIGHTER;
}
if (squareState.contains(ModelElement.FIRE)){
return ViewElement.FIRE;
}
return ViewElement.EMPTY;
return BoardElement.FIRE;
}
return BoardElement.EMPTY;
}*/
private void initializeTimeline() {
Duration duration = new Duration(Controller.PERIOD_IN_MILLISECONDS);
......@@ -126,7 +128,7 @@ public class Controller {
public void initialize(int squareWidth, int squareHeight, int columnCount,
int rowCount, int initialFireCount, int initialFirefighterCount) {
grid.setDimensions(columnCount, rowCount, squareWidth, squareHeight);
this.setModel(new FirefighterBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount));
this.setModel(new GameBoard(columnCount, rowCount, initialFireCount, initialFirefighterCount));
repaintGrid();
}
......
package model;
import javafx.scene.paint.Color;
import model.Visitor.Visitor;
import util.Position;
import java.util.ArrayList;
import java.util.HashMap;
public class EmptyElement implements BoardElement{
@Override
public Color getColor() {
return Color.WHITE;
}
@Override
public Boolean accept(Visitor visitor) {
return null;
}
@Override
public void initialize(int initialElementCount, HashMap<Position, ArrayList<BoardElement>> elementPosition) {
}
}
......@@ -2,8 +2,8 @@ package model.ExtinguishFire;
import javafx.scene.paint.Color;
import model.BoardElement;
import model.FirefighterBoard;
import model.Flammable.Fire;
import model.GameBoard;
import model.Visitor.FireFinder;
import model.Visitor.Visitor;
import util.Position;
......@@ -30,9 +30,9 @@ public class FireFighter implements ExtinguishFire{
@Override
public void initialize(int initialFireFighterCount, HashMap<Position, ArrayList<BoardElement>> elementPosition) {
FireFinder fireFinder=new FireFinder();
Position position = FirefighterBoard.randomPosition();
boolean canInitialise;
for (int index = 0; index < initialFireFighterCount; index++) {
Position position = GameBoard.randomPosition();
if(elementPosition.containsKey(position)) {
for (;;) {
canInitialise = true;
......@@ -45,13 +45,20 @@ public class FireFighter implements ExtinguishFire{
if(canInitialise){
break;
}
position = FirefighterBoard.randomPosition();
position = GameBoard.randomPosition();
if(!elementPosition.containsKey(position))break;
}
if(elementPosition.containsKey(position))
elementPosition.get(position).add(new FireFighter(Color.BLUE));
else{
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(new FireFighter(Color.BLUE));
elementPosition.put(position,boardElements);
}
elementPosition.get(position).add(new Fire(Color.BLUE));
continue;
}
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(new Fire(Color.BLUE));
boardElements.add(new FireFighter(Color.BLUE));
elementPosition.put(position,boardElements);
}
}
......
package model;
import util.Position;
import java.util.*;
public class FirefighterBoard implements Board<List<ModelElement>> {
static int columnCount;
static int rowCount;
private final int initialFireCount;
private final int initialFirefighterCount;
private List<Position> firefighterPositions;
private Set<Position> firePositions;
private int step = 0;
static Random randomGenerator = new Random();
public FirefighterBoard(int columnCount, int rowCount, int initialFireCount, int initialFirefighterCount) {
this.columnCount = columnCount;
this.rowCount = rowCount;
this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount;
initializeElements();
}
public void initializeElements() {
firefighterPositions = new ArrayList<>();
firePositions = new HashSet<>();
for (int index = 0; index < initialFireCount; index++)
firePositions.add(randomPosition());
for (int index = 0; index < initialFirefighterCount; index++)
firefighterPositions.add(randomPosition());
}
public static Position randomPosition() {
return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
}
@Override
public List<ModelElement> getState(Position position) {
List<ModelElement> result = new ArrayList<>();
for(Position firefighterPosition : firefighterPositions)
if (firefighterPosition.equals(position))
result.add(ModelElement.FIREFIGHTER);
if(firePositions.contains(position))
result.add(ModelElement.FIRE);
return result;
}
@Override
public int rowCount() {
return rowCount;
}
@Override
public int columnCount() {
return columnCount;
}
public List<Position> updateToNextGeneration() {
List<Position> result = updateFirefighters();
result.addAll(updateFires());
step++;
return result;
}
private List<Position> updateFires() {
List<Position> result = new ArrayList<>();
if (step % 2 == 0) {
List<Position> newFirePositions = new ArrayList<>();
for (Position fire : firePositions) {
newFirePositions.addAll(neighbors(fire));
}
firePositions.addAll(newFirePositions);
result.addAll(newFirePositions);
}
return result;
}
@Override
public int stepNumber() {
return step;
}
private List<Position> updateFirefighters() {
List<Position> result = new ArrayList<>();
List<Position> firefighterNewPositions = new ArrayList<>();
for (Position firefighterPosition : firefighterPositions) {
Position newFirefighterPosition = neighborClosestToFire(firefighterPosition);
firefighterNewPositions.add(newFirefighterPosition);
extinguish(newFirefighterPosition);
result.add(firefighterPosition);
result.add(newFirefighterPosition);
List<Position> neighborFirePositions = neighbors(newFirefighterPosition).stream()
.filter(firePositions::contains).toList();
for(Position firePosition : neighborFirePositions)
extinguish(firePosition);
result.addAll(neighborFirePositions);
}
firefighterPositions = firefighterNewPositions;
return result;
}
@Override
public void reset() {
step = 0;
initializeElements();
}
private void extinguish(Position position) {
firePositions.remove(position);
}
private List<Position> neighbors(Position position) {
List<Position> list = new ArrayList<>();
if (position.row() > 0) list.add(new Position(position.row() - 1, position.column()));
if (position.column() > 0) list.add(new Position(position.row(), position.column() - 1));
if (position.row() < rowCount - 1) list.add(new Position(position.row() + 1, position.column()));
if (position.column() < columnCount - 1) list.add(new Position(position.row(), position.column() + 1));
return list;
}
private Position neighborClosestToFire(Position position) {
Set<Position> seen = new HashSet<>();
HashMap<Position, Position> firstMove = new HashMap<>();
Queue<Position> toVisit = new LinkedList<>(neighbors(position));
for (Position initialMove : toVisit)
firstMove.put(initialMove, initialMove);
while (!toVisit.isEmpty()) {
Position current = toVisit.poll();
if (firePositions.contains(current))
return firstMove.get(current);
for (Position adjacent : neighbors(current)) {
if (seen.contains(adjacent)) continue;
toVisit.add(adjacent);
seen.add(adjacent);
firstMove.put(adjacent, firstMove.get(current));
}
}
return position;
}
@Override
public void setState(List<ModelElement> state, Position position) {
firePositions.remove(position);
for (;;) {
if (!firefighterPositions.remove(position)) break;
}
for(ModelElement element : state){
switch (element){
case FIRE -> firePositions.add(position);
case FIREFIGHTER -> firefighterPositions.add(position);
}
}
}
}
\ No newline at end of file
......@@ -2,7 +2,7 @@ package model.Flammable;
import javafx.scene.paint.Color;
import model.BoardElement;
import model.FirefighterBoard;
import model.GameBoard;
import model.Visitor.FireFinder;
import model.Visitor.Visitor;
import util.Position;
......@@ -30,7 +30,7 @@ public class Fire implements Flammable{
@Override
public void initialize(int initialFireCount, HashMap<Position, ArrayList<BoardElement>> elementPosition) {
FireFinder fireFinder=new FireFinder();
Position position = FirefighterBoard.randomPosition();
Position position = GameBoard.randomPosition();
boolean canInitialise;
for (int index = 0; index < initialFireCount; index++) {
if(elementPosition.containsKey(position)) {
......@@ -45,9 +45,16 @@ public class Fire implements Flammable{
if(canInitialise){
break;
}
position = FirefighterBoard.randomPosition();
position = GameBoard.randomPosition();
if(!elementPosition.containsKey(position))break;
}
if(elementPosition.containsKey(position))
elementPosition.get(position).add(new Fire(Color.RED));
else{
ArrayList<BoardElement> boardElements = new ArrayList<>();
boardElements.add(new Fire(Color.RED));
elementPosition.put(position,boardElements);
}
continue;
}
ArrayList<BoardElement> boardElements = new ArrayList<>();
......
package model;
import javafx.scene.paint.Color;
import model.ExtinguishFire.FireFighter;
import model.Flammable.Fire;
import util.Position;
import java.util.*;
......@@ -9,17 +12,41 @@ public class GameBoard implements Board{
static int rowCount;
private final int initialFireCount;
private final int initialFirefighterCount;
private List<Position> firefighterPositions;
private Set<Position> firePositions;
private int step = 0;
static Random randomGenerator = new Random();
public HashMap<Position, ArrayList<BoardElement>> getElementPosition() {
return elementPosition;
}
public HashMap<Position, ArrayList<BoardElement>> elementPosition;
public GameBoard(int initialFireCount, int initialFirefighterCount) {
public GameBoard(int columnCount,int rowCount,int initialFireCount, int initialFirefighterCount) {
this.columnCount = columnCount;
this.rowCount = rowCount;
this.initialFireCount = initialFireCount;
this.initialFirefighterCount = initialFirefighterCount;
initializeElements();
}
public void initializeElements() {
elementPosition=new HashMap<>();
Fire fire=new Fire(Color.RED);
FireFighter fireFighter=new FireFighter(Color.BLUE);
fire.initialize(initialFireCount,elementPosition);
fireFighter.initialize(initialFirefighterCount,elementPosition);
}
public static Position randomPosition() {
return new Position(randomGenerator.nextInt(rowCount), randomGenerator.nextInt(columnCount));
}
@Override
public List<Position> updateToNextGeneration() {
step++;
return null;
}
@Override
public Object getState(Position position) {
return null;
......@@ -40,10 +67,6 @@ public class GameBoard implements Board{
return columnCount;
}
@Override
public List<Position> updateToNextGeneration() {
return null;
}
@Override
public void reset() {
......@@ -54,4 +77,6 @@ public class GameBoard implements Board{
public int stepNumber() {
return step;
}
}
package model;
public enum ModelElement {
FIREFIGHTER, FIRE
}
......@@ -3,14 +3,15 @@ package view;
import javafx.scene.canvas.Canvas;
import javafx.scene.paint.Color;
import javafx.util.Pair;
import model.BoardElement;
import util.Position;
import java.util.List;
public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
public class FirefighterGrid extends Canvas implements Grid<model.BoardElement>{
private void paintElementAtPosition(ViewElement element, Position position) {
paintSquare(position.row(), position.column(), element.color);
private void paintElementAtPosition(model.BoardElement element, Position position) {
paintSquare(position.row(), position.column(), element.getColor());
}
private int squareWidth;
private int squareHeight;
......@@ -18,27 +19,27 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
private int rowCount;
@Override
public void repaint(List<Pair<Position, ViewElement>> positionedElements) {
clear(positionedElements);
paint(positionedElements);
public void repaint(List<Pair<Position, model.BoardElement>> positionedElements) {
//clear(positionedElements);
//paint(positionedElements);
paintLines();
}
private void clear(List<Pair<Position, ViewElement>> positionedElements) {
for (Pair<Position, ViewElement> positionElement : positionedElements) {
private void clear(List<Pair<Position, BoardElement>> positionedElements) {
for (Pair<Position, BoardElement> positionElement : positionedElements) {
Position position = positionElement.getKey();
clearSquare(position.row(), position.column());
}
}
private void paint(List<Pair<Position, ViewElement>> positionedElements) {
for(Pair<Position, ViewElement> pair : positionedElements){
paintElementAtPosition(pair.getValue(), pair.getKey());
private void paint(List<Pair<Position, BoardElement>> positionedElements) {
for(Pair<Position, BoardElement> pair : positionedElements){
//paintElementAtPosition(pair.getValue(), pair.getKey());
}
}
@Override
public void repaint(ViewElement[][] elements) {
public void repaint(model.BoardElement[][] elements) {
clear();
paint(elements);
paintLines();
......@@ -48,7 +49,7 @@ public class FirefighterGrid extends Canvas implements Grid<ViewElement>{
getGraphicsContext2D().clearRect(0,0,getWidth(), getHeight());
}
private void paint(ViewElement[][] elements) {
private void paint(model.BoardElement[][] elements) {
for(int column = 0; column < columnCount; column++)
for(int row = 0; row < rowCount; row++){
paintElementAtPosition(elements[row][column], new Position(row, column));
......
package view;
import javafx.util.Pair;
import model.BoardElement;
import util.Position;
import java.util.List;
......@@ -25,7 +26,7 @@ public interface Grid<E> {
*
* @param elements A two-dimensional array of elements to be displayed on the grid.
*/
void repaint(E[][] elements);
// void repaint(E[][] elements);
/**
* Set the dimensions of the grid to the specified number of columns, number of rows, square width,
......@@ -51,5 +52,7 @@ public interface Grid<E> {
* @return The number of rows in the grid.
*/
int rowCount();
void repaint(BoardElement[][] boardElements);
}
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;
}
}
......@@ -7,13 +7,13 @@ import static org.assertj.core.api.Assertions.assertThat;
public class FirefighterGridTest {
@Test
void testColumnCount(){
Grid<ViewElement> grid = new FirefighterGrid();
Grid<model.BoardElement> grid = new FirefighterGrid();
grid.setDimensions(20,10,10,10);
assertThat(grid.columnCount()).isEqualTo(20);
}
@Test
void testRowCount(){
Grid<ViewElement> grid = new FirefighterGrid();
Grid<model.BoardElement> 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