From ba6f794399d2b6810015cd68554b55dded260dfb Mon Sep 17 00:00:00 2001 From: arnaudlabourel <arnaud.labourel@univ-amu.fr> Date: Tue, 24 Oct 2023 15:56:57 +0200 Subject: [PATCH] added generation number on the GUI --- .../firefighter/controller/Controller.java | 11 ++++- src/main/java/firefighter/model/Board.java | 46 +++++++++++++++++++ .../firefighter/model/FirefighterBoard.java | 8 ++++ .../firefighter/{model => util}/Position.java | 2 +- .../firefighter/view/FirefighterGrid.java | 2 +- src/main/java/firefighter/view/Grid.java | 35 +++++++++++++- src/main/resources/firefighter/view/view.fxml | 10 ++++ 7 files changed, 109 insertions(+), 5 deletions(-) rename src/main/java/firefighter/{model => util}/Position.java (64%) diff --git a/src/main/java/firefighter/controller/Controller.java b/src/main/java/firefighter/controller/Controller.java index 335bf3e..277888d 100644 --- a/src/main/java/firefighter/controller/Controller.java +++ b/src/main/java/firefighter/controller/Controller.java @@ -7,6 +7,7 @@ import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.scene.control.Button; +import javafx.scene.control.Label; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; import javafx.util.Duration; @@ -14,7 +15,7 @@ import javafx.util.Pair; import firefighter.model.Board; import firefighter.model.ModelElement; import firefighter.model.FirefighterBoard; -import firefighter.model.Position; +import firefighter.util.Position; import firefighter.view.FirefighterGrid; import firefighter.view.ViewElement; @@ -31,6 +32,8 @@ public class Controller { @FXML public Button oneStepButton; @FXML + public Label generationNumberLabel; + @FXML private ToggleButton pauseToggleButton; @FXML private ToggleButton playToggleButton; @@ -64,6 +67,7 @@ public class Controller { updatedSquares.add(new Pair<>(updatedPosition, viewElement)); } grid.repaint(updatedSquares); + updateLabel(board.stepNumber()); } private void repaintBoard(){ @@ -74,6 +78,7 @@ public class Controller { for(int row = 0; row < rowCount; row++) viewElements[row][column] = getViewElement(board.getState(new Position(row, column))); grid.repaint(viewElements); + updateLabel(board.stepNumber()); } private ViewElement getViewElement(List<ModelElement> squareState) { @@ -129,4 +134,8 @@ public class Controller { this.pause(); updateBoard(); } + + private void updateLabel(int value){ + generationNumberLabel.setText(Integer.toString(value)); + } } \ No newline at end of file diff --git a/src/main/java/firefighter/model/Board.java b/src/main/java/firefighter/model/Board.java index a17de30..df5996d 100644 --- a/src/main/java/firefighter/model/Board.java +++ b/src/main/java/firefighter/model/Board.java @@ -1,11 +1,57 @@ package firefighter.model; +import firefighter.util.Position; + import java.util.List; +/** + * This interface represents a generic board for modeling various state-based systems. + * + * @param <S> The type of state represented on the board. + */ public interface Board<S> { + + /** + * Get the state of the board at a specific position. + * + * @param position The position on the board for which to retrieve the state. + * @return The state at the specified position. + */ S getState(Position position); + + /** + * Get the number of rows in the board. + * + * @return The number of rows in the board. + */ int rowCount(); + + /** + * Get the number of columns in the board. + * + * @return The number of columns in the board. + */ int columnCount(); + + /** + * Update the board to its next generation or state. This method may modify the + * internal state of the board and return a list of positions that have changed + * during the update. + * + * @return A list of positions that have changed during the update. + */ List<Position> updateToNextGeneration(); + + /** + * Reset the board to its initial state. + */ void reset(); + + /** + * Get the current step number or generation of the board. + * + * @return The current step number or generation. + */ + int stepNumber(); } + diff --git a/src/main/java/firefighter/model/FirefighterBoard.java b/src/main/java/firefighter/model/FirefighterBoard.java index 29af45a..8bdf8b2 100644 --- a/src/main/java/firefighter/model/FirefighterBoard.java +++ b/src/main/java/firefighter/model/FirefighterBoard.java @@ -1,5 +1,7 @@ package firefighter.model; +import firefighter.util.Position; + import java.util.*; @@ -76,6 +78,11 @@ public class FirefighterBoard implements Board<List<ModelElement>> { } + @Override + public int stepNumber() { + return step; + } + private List<Position> activateFirefighters() { List<Position> result = new ArrayList<>(); firefighterNewPositions = new ArrayList<>(); @@ -96,6 +103,7 @@ public class FirefighterBoard implements Board<List<ModelElement>> { @Override public void reset() { + step = 0; initializeElements(); } diff --git a/src/main/java/firefighter/model/Position.java b/src/main/java/firefighter/util/Position.java similarity index 64% rename from src/main/java/firefighter/model/Position.java rename to src/main/java/firefighter/util/Position.java index 9941e11..b44a78a 100644 --- a/src/main/java/firefighter/model/Position.java +++ b/src/main/java/firefighter/util/Position.java @@ -1,4 +1,4 @@ -package firefighter.model; +package firefighter.util; public record Position(int row, int column) { diff --git a/src/main/java/firefighter/view/FirefighterGrid.java b/src/main/java/firefighter/view/FirefighterGrid.java index 1e46ca8..6d9a61c 100644 --- a/src/main/java/firefighter/view/FirefighterGrid.java +++ b/src/main/java/firefighter/view/FirefighterGrid.java @@ -3,7 +3,7 @@ package firefighter.view; import javafx.scene.canvas.Canvas; import javafx.scene.paint.Color; import javafx.util.Pair; -import firefighter.model.Position; +import firefighter.util.Position; import java.util.List; diff --git a/src/main/java/firefighter/view/Grid.java b/src/main/java/firefighter/view/Grid.java index bc0b487..6b1d7fc 100644 --- a/src/main/java/firefighter/view/Grid.java +++ b/src/main/java/firefighter/view/Grid.java @@ -1,13 +1,44 @@ package firefighter.view; import javafx.util.Pair; -import firefighter.model.Position; +import firefighter.util.Position; import java.util.List; +/** + * This interface represents a generic grid structure for displaying two-dimensional data. + * + * @param <E> The type of elements stored in the grid. + */ public interface Grid<E> { - void repaint(List<Pair<Position,E>> elements); + + /** + * Repaint the grid with a list of elements, each associated with their respective positions. + * + * @param elements A list of pairs, each containing a position and the element to be displayed at that position. + */ + void repaint(List<Pair<Position, E>> elements); + + /** + * Repaint the grid with a two-dimensional array of elements. The array's dimensions should match + * the row and column count of the grid. + * + * @param elements A two-dimensional array of elements to be displayed on the grid. + */ void repaint(E[][] elements); + + /** + * Get the number of columns in the grid. + * + * @return The number of columns in the grid. + */ int getColumnCount(); + + /** + * Get the number of rows in the grid. + * + * @return The number of rows in the grid. + */ int getRowCount(); } + diff --git a/src/main/resources/firefighter/view/view.fxml b/src/main/resources/firefighter/view/view.fxml index 9ae1576..cd4d2bd 100644 --- a/src/main/resources/firefighter/view/view.fxml +++ b/src/main/resources/firefighter/view/view.fxml @@ -6,10 +6,20 @@ <?import firefighter.view.FirefighterGrid?> <?import javafx.scene.control.ToggleButton?> +<?import javafx.scene.control.Separator?> +<?import javafx.scene.control.Label?> <HBox styleClass="background" stylesheets="@DarkTheme.css" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="firefighter.controller.Controller"> <VBox> + <Separator maxHeight="-Infinity" maxWidth="-Infinity" + prefHeight="24.0" prefWidth="200.0"/> + <Label maxHeight="-Infinity" maxWidth="-Infinity" alignment="CENTER" prefHeight="24.0" prefWidth="200.0" + text="Generation number"/> + <Label fx:id="generationNumberLabel" alignment="CENTER" contentDisplay="TEXT_ONLY" + maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="24.0" prefWidth="200.0"/> + <Separator maxHeight="-Infinity" maxWidth="-Infinity" + prefHeight="24.0" prefWidth="200.0"/> <Button fx:id="restartButton" maxHeight="-Infinity" maxWidth="-Infinity" mnemonicParsing="false" onAction="#restartButtonAction" prefHeight="24.0" prefWidth="200.0" text="Restart"/> -- GitLab