From ec122b2c7599f06bbe3f208139d00134765762a3 Mon Sep 17 00:00:00 2001 From: tmp1u19 <tmp1u19@soton.ac.uk> Date: Thu, 12 Mar 2020 17:09:40 +0000 Subject: [PATCH] Class that is in charge of all the functionalities of the game, inclusive drawing. --- Handler.java | 294 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 Handler.java diff --git a/Handler.java b/Handler.java new file mode 100644 index 0000000..4d72466 --- /dev/null +++ b/Handler.java @@ -0,0 +1,294 @@ +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Insets; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; +import javafx.scene.input.MouseButton; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.Background; +import javafx.scene.layout.BackgroundFill; +import javafx.scene.layout.CornerRadii; +import javafx.scene.layout.GridPane; +import javafx.scene.paint.Color; + +public class Handler { + + private Window window = new Window(); + private int n = 4; + private int[][] cellValues = new int[n][n]; + + public void helpButton(Button help, GridPane grid) { + + help.setOnAction(new EventHandler<ActionEvent>() { + @Override + public void handle(ActionEvent actionEvent) { + + if(help.getText().equals("Enable Help")) { + help.setText("Disable Help"); + + highlight(grid); + + for(Node cell : grid.getChildren()) { + enableHighlight((Cell) cell, grid); + } + + } else { + help.setText("Enable Help"); + setTransparent(grid); + } + } + }); + } + + public void submitButton(Button submit) { + submit.setOnAction(new EventHandler<ActionEvent>() { + @Override + public void handle(ActionEvent actionEvent) { + + for(int i = 0; i < getN(); i ++) { + for(int j = 0; j < getN(); j ++) { + System.out.print(getCellValues()[i][j]); + } + System.out.println(); + } + + if(verify()) { + window.win("Congratulations!", "You won the game!"); + } else { + window.win("Too bad...", "You lost the game"); + } + } + }); + } + + public void clearBoard(Button clear, GridPane grid) { + + clear.setOnAction(new EventHandler<ActionEvent>() { + @Override + public void handle(ActionEvent actionEvent) { + + window.getAlertDialog("Are you sure you want to clear the board?").showAndWait().ifPresent(response -> { + if(response == ButtonType.YES) { + clear(grid); + } + }); + } + }); + } + + public void doubleClick(Cell cell) { + cell.getTextField().setOnMouseClicked(new EventHandler<MouseEvent>() { + @Override + public void handle(MouseEvent mouseEvent) { + if(mouseEvent.getButton().equals(MouseButton.PRIMARY)) { + if(mouseEvent.getClickCount() == 2) { + window.showButtons(cell, getN()); + } + } + } + }); + } + + public void memoriseValues(Cell cell) { + cell.getTextField().textProperty().addListener(new ChangeListener<String>() { + @Override + public void changed(ObservableValue<? extends String> observableValue, String oldValue, + String newValue) { + if (cell.isNumeric(newValue)) { + if (Integer.parseInt(newValue) > getN() || Integer.parseInt(newValue) == 0) { + cell.getTextField().clear(); + } else { + getCellValues()[cell.getRow()][cell.getColumn()] = Integer.parseInt(newValue); + } + } else if (!newValue.matches("\\d*")) { + cell.getTextField().setText(newValue.replaceAll("[^\\d]", "")); + } + + } + }); + } + + public void enableHighlight(Cell cell, GridPane grid) { + + cell.getTextField().textProperty().addListener(new ChangeListener<String>() { + @Override + public void changed(ObservableValue<? extends String> observableValue, String s, String t1) { + + setTransparent(grid); + highlight(grid); + } + }); + } + + public void draw(GridPane grid) { + + for(int i = 0; i < getN(); i ++) { + for (int j = 0; j < getN(); j++) { + Cell cell = new Cell(getN(), i, j); + + drawLines(i, j, cell); + doubleClick(cell); + memoriseValues(cell); + + grid.add(cell, j, i, 1, 1); + } + } + } + + public void drawLines(int i, int j, Cell cell) { + + cell.setStyle("-fx-border-color: black; -fx-border-width: 1 1 0 0;"); + + if(j == 0) { + cell.setStyle("-fx-border-color: black; -fx-border-width: 1 1 0 1;"); + } + if(i == getN() - 1 && j == 0) { + cell.setStyle("-fx-border-color: black; -fx-border-width: 1 1 1 1;"); + } + if( i == getN() - 1 && j != 0) { + cell.setStyle("-fx-border-color: black; -fx-border-width: 1 1 1 0;"); + } + } + + public void clear(GridPane grid) { + for(int i =0; i < n; i ++) { + for(int j = 0; j < n; j ++) { + cellValues[i][j] = 0; + getCell(grid, i, j).getTextField().clear(); + getCell(grid, i, j).setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, + CornerRadii.EMPTY, Insets.EMPTY))); + } + } + } + + public void setTransparent(GridPane grid) { + for(Node cell : grid.getChildren()) { + ((Cell) cell).setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, + CornerRadii.EMPTY, Insets.EMPTY))); + } + } + + public void highlight(GridPane grid) { + + for(int i = 0; i < n; i ++) { + for(int j = 0; j < n; j ++) { + if(cellValues[i][j] != 0) { + + if(!verifyRow(cellValues[i][j], i)) { + highlightRow(i, grid, true); + } + + if(!verifyColumn(cellValues[i][j], j)) { + highlightColumn(j, grid, true); + } + } + } + + } + } + + public boolean verify() { + + for(int i = 0; i < n; i ++) { + for(int j = 0; j < n; j ++) { + if(cellValues[i][j] !=0 ) { + if(verifyRow(cellValues[i][j], i) == false || verifyColumn(cellValues[i][j], j) == false) { + System.out.println(cellValues[i][j] + " " + i + " " + j); + return false; + } + } + } + } + + return true; + } + + public boolean verifyRow(int x, int row) { + + int count = 0; + + for(int i = 0; i < n; i ++) { + if(cellValues[row][i] == x) { + count++; + } + } + + if(count == 1) { + return true; + } + + return false; + } + + public boolean verifyColumn(int x, int column) { + + int count = 0; + + for(int i = 0; i < n; i ++) { + if(cellValues[i][column] == x) { + count++; + } + } + + if(count == 1) { + return true; + } + return false; + } + + public void highlightRow(int row, GridPane grid, boolean highlight) { + + if(highlight) { + for(int i = 0; i < n; i ++) { + getCell(grid, row, i).setBackground(new Background(new BackgroundFill(Color.YELLOW, + CornerRadii.EMPTY, Insets.EMPTY))); + } + } else { + for(int i = 0; i < n; i ++) { + getCell(grid, row, i).setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, + CornerRadii.EMPTY, Insets.EMPTY))); + } + } + + } + + public void highlightColumn(int column, GridPane grid, boolean highlight) { + + if(highlight) { + for(int i = 0; i < n; i ++) { + getCell(grid, i, column).setBackground(new Background(new BackgroundFill(Color.YELLOW, + CornerRadii.EMPTY, Insets.EMPTY))); + } + } else { + for(int i = 0; i < n; i ++) { + getCell(grid, i, column).setBackground(new Background(new BackgroundFill(Color.TRANSPARENT, + CornerRadii.EMPTY, Insets.EMPTY))); + } + } + } + + public Cell getCell(GridPane grid, int i, int j) { + for(Node cell : grid.getChildren()) { + if(((Cell) cell).getRow() == i && ((Cell) cell).getColumn() == j) { + return (Cell) cell; + } + } + return null; + } + + public int[][] getCellValues() { + return cellValues; + } + + public int getN() { + return n; + } + + public void setN(int n) { + this.n = n; + } + +} -- GitLab