From 189764a8bf0278b7752cee158f5c6f983a6c3752 Mon Sep 17 00:00:00 2001 From: Nimrod Abramovich <grumpydormin@gmail.com> Date: Tue, 10 Mar 2020 00:23:29 +0000 Subject: [PATCH] Added row/column mistakes show toggle --- bin/coursework/Main.class | Bin 16710 -> 20740 bytes src/coursework/Main.java | 182 ++++++++++++++++++++++++++++++++------ 2 files changed, 153 insertions(+), 29 deletions(-) diff --git a/bin/coursework/Main.class b/bin/coursework/Main.class index d732c086f0f50b0b91218527463bd8a5593b2706..ae468b9521fc5d9f39ff9b1a989129e7ce984656 100644 GIT binary patch literal 20740 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 NnYJ>mXI{l12>_}WRonmo delta 10071 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 OkYw^^a%I+IkOTmB`v7|Y diff --git a/src/coursework/Main.java b/src/coursework/Main.java index 417ce75..09e4417 100644 --- a/src/coursework/Main.java +++ b/src/coursework/Main.java @@ -5,6 +5,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Stack; import java.util.Vector; @@ -20,6 +21,7 @@ import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Button; import javafx.scene.control.ButtonType; +import javafx.scene.control.CheckBox; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.image.Image; @@ -44,18 +46,25 @@ import javafx.stage.Stage; public class Main extends Application { final static public int N = 6; + final private double GRID_PERCENTAGE = 0.75; private Scene scene; private Stage stage; - final private double GRID_PERCENTAGE = 0.75; + private static Square[] gridSquares = new Square[N*N]; private TextField[] gridNumbers = new TextField[N*N]; private static Label[][] cageLabels = new Label[N*N][2]; + private boolean[][] highlightedError = new boolean[N*N][3]; + private HBox[] gridHBoxes = new HBox[N*N]; + private List<Cage> gridCages = new ArrayList<Cage>(); + private boolean isWider; private HBox previousHBox = null; private Square previousSquare = null; private boolean clearing = false; + private boolean undoing = false; + private boolean showMistakes = false; private Stack<GameState> undoStack = new Stack<GameState>(); private Stack<GameState> redoStack = new Stack<GameState>(); @@ -89,18 +98,86 @@ public class Main extends Application { gridPane.add(hbox, j, i); textField.textProperty().addListener((observable, oldValue, newValue) -> { - if (!clearing) { + if (!clearing && !undoing) { undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers))); if (undoButton.isDisabled()) { undoButton.setDisable(false); } } + checkConstraints(textField, j, i); }); square.getRectangle().toFront(); return gridPane; } + private void checkConstraints(TextField textField, int col, int row) { + String value = textField.getText(); + boolean found = false; + for (int i = 0; i < N; i++) { + if (!gridNumbers[row*N + i].getText().equals("")) { + if (gridNumbers[row*N + i].getText().equals(value) && i != col) { + highlightRow(row); + found = true; + break; + } + } + } + if (!found) { + clearRow(row); + } + + found = false; + for (int i = 0; i < N; i++) { + if (!gridNumbers[i*N + col].getText().equals("")) { + if (gridNumbers[i*N + col].getText().equals(value) && i != row) { + highlightColumn(col); + found = true; + break; + } + } + } + if (!found) { + clearColumn(col); + } + highlightCells(); + } + + private void clearRow(int row) { + for (int i = 0; i < N; i++) { + highlightedError[row*N + i][0] = false; + } + } + + private void clearColumn(int col) { + for (int i = 0; i < N; i++) { + highlightedError[i*N + col][1] = false; + } + } + + private void highlightRow(int row) { + for (int i = 0; i < N; i++) { + highlightedError[row*N + i][0] = true; + } + } + + private void highlightColumn(int col) { + for (int i = 0; i < N; i++) { + highlightedError[i*N + col][1] = true; + } + } + + private void highlightCells() { + for (int i = 0; i < N*N; i++) { + if ((highlightedError[i][0] || highlightedError[i][1] || highlightedError[i][2]) && showMistakes) { + gridHBoxes[i].setStyle("-fx-background-color: rgba(255,0,20,0.4);"); + } + else { + gridHBoxes[i].setStyle("-fx-background-color: rgba(255,0,20,0);"); + } + } + } + private HBox setupGridHBox(Square square, TextField textField, int i, int j) { HBox hbox = new HBox(); VBox vbox = new VBox(); @@ -114,7 +191,8 @@ public class Main extends Application { vbox.setAlignment(Pos.CENTER); hbox.getChildren().add(vbox); hbox.setAlignment(Pos.CENTER); - hboxClickSquareEvent(hbox, square); + gridHBoxes[i*N + j] = hbox; + hboxClickSquareEvent(i, j, square); return hbox; } @@ -130,9 +208,10 @@ public class Main extends Application { } private TextField setupGridTextField(double size) { + final double PERCENT = 0.7; TextField textField = new TextField(); textField.setMinWidth(size/4); - textField.setPrefSize(size*0.5, size*0.5); + textField.setPrefSize(size*PERCENT, size*PERCENT); textField.setAlignment(Pos.CENTER); textField.setStyle("-fx-focus-color: transparent;"); textField.setStyle("-fx-text-box-border: transparent;"); @@ -145,12 +224,18 @@ public class Main extends Application { topHBox.setSpacing(10); Button loadGameFileButton = new Button("Load game - file"); - Button showMistakesButton = new Button("Show mistakes"); + CheckBox showMistakesCheck = new CheckBox("Show mistakes"); Button loadGameTextInputButton = new Button("Load game - text input"); loadGameFileButton.setPrefWidth(200); loadGameTextInputButton.setPrefWidth(loadGameFileButton.getPrefWidth()); - topHBox.getChildren().addAll(loadGameFileButton, showMistakesButton, loadGameTextInputButton); + topHBox.getChildren().addAll(loadGameFileButton, showMistakesCheck, loadGameTextInputButton); + + showMistakesCheck.selectedProperty().addListener((obs, oldVal, newVal) -> { + showMistakes = showMistakesCheck.isSelected(); + System.out.println(showMistakes + ", " + showMistakesCheck.isSelected()); + highlightCells(); + }); loadGameFileButton.setOnAction(e -> { try { @@ -196,8 +281,6 @@ public class Main extends Application { private void updateGameState(GameState gameState) { String[] gameValues = gameState.getGameState(); for (int i = 0; i < gridNumbers.length; i++) { -// if (!gridNumbers[i].getText().equals("") && gameValues.equals("")) -// System.out.println("Current: " + gridNumbers[i].getText() + ", Previous: " + textFields[i].getText()); gridNumbers[i].setText(gameValues[i]); } } @@ -211,24 +294,22 @@ public class Main extends Application { redoButton = new Button("", new ImageView(new Image("file:Images/redo_icon.png"))); Button clearButton = new Button("Clear"); undoButton.setOnAction(e -> { - // undoStack.pop() is the current GameState - + undoing = true; + redoStack.push(undoStack.pop()); updateGameState(undoStack.peek()); - // if (!redoStack.empty()) { redoButton.setDisable(false); } if (undoStack.size() == 1) { undoButton.setDisable(true); } + undoing = false; }); redoButton.setOnAction(e -> { GameState gameState = redoStack.pop(); updateGameState(gameState); - - undoStack.push(gameState); if (!undoStack.empty()) { undoButton.setDisable(false); @@ -248,13 +329,27 @@ public class Main extends Application { return bottomHBox; } - private void hboxClickSquareEvent(HBox hbox, Square square) { - hbox.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> { + private void hboxClickSquareEvent(int i, int j, Square square) { + gridHBoxes[i*N + j].addEventHandler(MouseEvent.MOUSE_CLICKED, e -> { if (previousHBox != null) { - previousHBox.setStyle("-fx-border-width:0px;"); + int previousIndex = getIndexOf(previousHBox); + if (highlightedError[previousIndex][0] || highlightedError[previousIndex][1] || highlightedError[previousIndex][2]) { + previousHBox.setStyle("-fx-background-color: rgba(255,0,20,0.4); -fx-border-width:0px;"); + } + else { + previousHBox.setStyle("-fx-border-width:0px;"); + } + } + + if (highlightedError[i*N + j][0] || highlightedError[i*N + j][1] || highlightedError[i*N + j][2]) { + gridHBoxes[i*N + j].setStyle("-fx-background-color: rgba(255,0,20,0.4); -fx-border-color: #0016CD; -fx-border-width:3px;"); + } + else { + gridHBoxes[i*N + j].setStyle("-fx-border-color: #0016CD; -fx-border-width:3px;"); } - hbox.setStyle("-fx-border-color:red; -fx-border-width:2px;"); - previousHBox = hbox; + + + previousHBox = gridHBoxes[i*N + j]; previousSquare = square; for (TextField textField : gridNumbers) { textField.deselect(); @@ -262,23 +357,52 @@ public class Main extends Application { }); } + private int getIndexOf(HBox hbox) { + for (int i = 0; i < N*N; i++) { + if (hbox.equals(gridHBoxes[i])) { + return i; + } + } + return -1; + } + private void clearButtonClickEvent(Button clearButton) { clearButton.setOnAction(e -> { - clearing = true; - undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers))); - Alert alert = new Alert(AlertType.CONFIRMATION); - alert.setContentText("Are you sure you wish to clear the board?"); - alert.showAndWait().ifPresent(type -> { - if (type == ButtonType.OK) { - for (TextField textField : gridNumbers) { - textField.setText(""); + if (!lastOperationClear()) { + clearing = true; + Alert alert = new Alert(AlertType.CONFIRMATION); + alert.setContentText("Are you sure you wish to clear the board?"); + alert.setTitle("Clearing Board."); + alert.showAndWait().ifPresent(type -> { + if (type == ButtonType.OK) { + for (TextField textField : gridNumbers) { + textField.setText(""); + } + undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers))); } - } - });; - clearing = false; + });; + clearing = false; + } + else { + Alert alert = new Alert(AlertType.WARNING); + alert.setContentText("Nothing to clear on the board."); + alert.setTitle("Empty Board"); + alert.showAndWait(); + } }); } + private boolean lastOperationClear() { + GameState gameState = undoStack.peek(); + boolean emptyGrid = true; + for (String textFieldValue : gameState.getGameState()) { + if (textFieldValue.length() > 0) { + emptyGrid = false; + } + } + return emptyGrid; + } + private void stageWidthResizeEvent(Stage stage, GridPane gridPane) { stage.widthProperty().addListener((obs, oldVal, newVal) -> { if (newVal.doubleValue() < stage.getHeight()) { -- GitLab