diff --git a/src/main/java/controller/Controller.java b/src/main/java/controller/Controller.java index 2a60897c6eb8ba847cb8589840c16a0f175ce0a3..6a089b2b5348aed0a633690ff88739a26da16d6a 100644 --- a/src/main/java/controller/Controller.java +++ b/src/main/java/controller/Controller.java @@ -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 BoardElement.FIRE; } - return ViewElement.EMPTY; - } + 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(); } diff --git a/src/main/java/model/EmptyElement.java b/src/main/java/model/EmptyElement.java new file mode 100644 index 0000000000000000000000000000000000000000..80cae5ec9935be3f9b2e39f11f9e21a03b38314a --- /dev/null +++ b/src/main/java/model/EmptyElement.java @@ -0,0 +1,25 @@ +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) { + + } +} diff --git a/src/main/java/model/ExtinguishFire/FireFighter.java b/src/main/java/model/ExtinguishFire/FireFighter.java index 1cbeb2662caae6cdf04d375b208006d8ee6f279f..da018365cc0dd6f3ee6b18f65745661a0d637f62 100644 --- a/src/main/java/model/ExtinguishFire/FireFighter.java +++ b/src/main/java/model/ExtinguishFire/FireFighter.java @@ -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); } } diff --git a/src/main/java/model/FirefighterBoard.java b/src/main/java/model/FirefighterBoard.java deleted file mode 100644 index 7fa8e1d1e72a765eed8f98ea970b407d50e2137a..0000000000000000000000000000000000000000 --- a/src/main/java/model/FirefighterBoard.java +++ /dev/null @@ -1,157 +0,0 @@ -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 diff --git a/src/main/java/model/Flammable/Fire.java b/src/main/java/model/Flammable/Fire.java index 0d1f6ace5efb0438bff64eeb0a1eb6907b8439f3..94c016e9ee7221e209086a490a98de363db777d5 100644 --- a/src/main/java/model/Flammable/Fire.java +++ b/src/main/java/model/Flammable/Fire.java @@ -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); } - elementPosition.get(position).add(new Fire(Color.RED)); continue; } ArrayList<BoardElement> boardElements = new ArrayList<>(); diff --git a/src/main/java/model/GameBoard.java b/src/main/java/model/GameBoard.java index a5ace1e985091d08fc5c72f140ec013e25004578..a7c73393600cb6f456490f9b31fff3bdb210431a 100644 --- a/src/main/java/model/GameBoard.java +++ b/src/main/java/model/GameBoard.java @@ -1,5 +1,8 @@ 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; } + + } diff --git a/src/main/java/model/ModelElement.java b/src/main/java/model/ModelElement.java deleted file mode 100644 index 759eee5e54c3a39472d8f7defbbbe6a2b67b8f00..0000000000000000000000000000000000000000 --- a/src/main/java/model/ModelElement.java +++ /dev/null @@ -1,5 +0,0 @@ -package model; - -public enum ModelElement { - FIREFIGHTER, FIRE -} diff --git a/src/main/java/view/FirefighterGrid.java b/src/main/java/view/FirefighterGrid.java index c1b2274637f93e4a2482faa9d2a5559211b31dc6..e81ddfd50defe3083d66f20b14bbc4de5a700caf 100644 --- a/src/main/java/view/FirefighterGrid.java +++ b/src/main/java/view/FirefighterGrid.java @@ -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)); diff --git a/src/main/java/view/Grid.java b/src/main/java/view/Grid.java index b95d59f622a86b41f2a41261b8b27aaf2e911dfb..411850b3c029b1162b85eaae3cf521c474b50a6e 100644 --- a/src/main/java/view/Grid.java +++ b/src/main/java/view/Grid.java @@ -1,6 +1,7 @@ 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); } diff --git a/src/main/java/view/ViewElement.java b/src/main/java/view/ViewElement.java deleted file mode 100644 index ffb76112e1af543df5af41fa906082ef11be9967..0000000000000000000000000000000000000000 --- a/src/main/java/view/ViewElement.java +++ /dev/null @@ -1,11 +0,0 @@ -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; - } -} diff --git a/src/test/java/view/FirefighterGridTest.java b/src/test/java/view/FirefighterGridTest.java index 4b45ebdca3b936b42c2b322b1294488341d180bb..d43db3ab0faf003f32ce43a2f973b3a35d6ae99e 100644 --- a/src/test/java/view/FirefighterGridTest.java +++ b/src/test/java/view/FirefighterGridTest.java @@ -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); }