package GUI; import domain.GameSolver; import domain.HitoriGameMoves; import javafx.geometry.Insets; import javafx.scene.control.Button; import javafx.scene.input.MouseButton; import javafx.scene.layout.GridPane; import java.util.Set; public class HitoriBoardPanel extends GridPane { private final HitoriGameMoves gameMoves; private final GameSolver gameSolver; private final GameUIController controller; public HitoriBoardPanel(HitoriGameMoves gameMoves, GameSolver gameSolver, GameUIController controller) { this.gameMoves = gameMoves; this.gameSolver = gameSolver; this.controller = controller; setHgap(5); setVgap(5); setPadding(new Insets(10)); updateBoard(); } public void updateBoard() { getChildren().clear(); int[][] boardState = gameMoves.getBoard(); boolean[][] blackCells = gameMoves.getBlackCells(); boolean[][] whiteCells = gameMoves.getWhiteCells(); for (int row = 0; row < boardState.length; row++) { for (int col = 0; col < boardState[row].length; col++) { Button cellButton = createCellButton(row, col, boardState[row][col], blackCells[row][col], whiteCells[row][col]); add(cellButton, col, row); } } } public void showErrors() { var errors = gameSolver.findIncorrectBlackMarks(); Set errorPositions = controller.convertErrorsToSet(errors); getChildren().clear(); int[][] boardState = gameMoves.getBoard(); boolean[][] blackCells = gameMoves.getBlackCells(); boolean[][] whiteCells = gameMoves.getWhiteCells(); for (int row = 0; row < boardState.length; row++) { for (int col = 0; col < boardState[row].length; col++) { Button cellButton = createCellButton(row, col, boardState[row][col], blackCells[row][col], whiteCells[row][col]); if (errorPositions.contains(row + "," + col) && blackCells[row][col]) { cellButton.setStyle("-fx-background-color: red; -fx-text-fill: white;"); } add(cellButton, col, row); } } } private Button createCellButton(int row, int col, int value, boolean isBlack, boolean isWhite) { Button cellButton = new Button(String.valueOf(value)); cellButton.setPrefSize(50, 50); styleCellButton(cellButton, isBlack, isWhite); cellButton.setOnMouseClicked(event -> { if (!controller.isPaused()) { if (event.getButton() == MouseButton.PRIMARY) { controller.handleLeftClick(row, col); } else if (event.getButton() == MouseButton.SECONDARY) { controller.handleRightClick(row, col); } } }); return cellButton; } private void styleCellButton(Button button, boolean isBlack, boolean isWhite) { if (isBlack) { button.setStyle("-fx-background-color: black; -fx-text-fill: white;"); } else if (isWhite) { button.setStyle("-fx-background-color: white; -fx-text-fill: black; -fx-border-color: gray;"); } else { button.setStyle("-fx-background-color: lightgray; -fx-text-fill: black;"); } } }