From 3fef91402381f81162086546e7cc89ca33cc9bf6 Mon Sep 17 00:00:00 2001 From: Nimrod Abramovich <grumpydormin@gmail.com> Date: Fri, 28 Feb 2020 17:32:47 +0000 Subject: [PATCH] Created GameState class and started with undo/redo --- bin/coursework/GameState.class | Bin 0 -> 871 bytes bin/coursework/Main.class | Bin 13673 -> 16710 bytes src/coursework/GameState.java | 25 ++++++++++ src/coursework/Main.java | 87 ++++++++++++++++++++++++++++++--- 4 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 bin/coursework/GameState.class create mode 100644 src/coursework/GameState.java diff --git a/bin/coursework/GameState.class b/bin/coursework/GameState.class new file mode 100644 index 0000000000000000000000000000000000000000..05a8e904dce51e954e51bf717fb058b235294275 GIT binary patch literal 871 zcmX^0Z`VEs1_l!bb#?|OMh21O{L-T0)bjkIY<>5{+|=Nb#FA8Y1{OvJfvm)`ME#t^ zymWp4q^#8B5=I8D^rFm^u*96w)M7>k;b<R(ir|u>%)E4KMg}&U%)HDJJ4OaE4J`7S zVT=qc&iN^+Tnx+%+&m2I3_Oes%o>_uoD7T%d^`-S3~Y=H{63j^seYxoNvTC4iAg!B zj0{3P`N@enVTnbVAU;%(r6eP>n2|xu2b&M985wxeQ%m4JVq_52(8S^(Mh4;Z)Dq{? zqN3D1WYuO+*QZtJ7bmCYrRpc==am%Y=jex|R+PA9rskwrV>6DOK>{V<Ai=`LAjKfV z&LGXmAO{LD+-CAH$TG+=GO(womVoSGWDwEN#1_chpm>0UP%$HeBE(;~jkRWEV9aJ@ zVDw~U;0-QGOwRUAEC2^0J1Drhg7Zs@l2hF>K_Sft4>3KEQyCN)7#Wxu7#J8Cm_U)k zz`(%Fz{tSPz`?-Cz{$YC;Ksnjz{J47z@@dFflEt!D+BLF1_lNu27U$x20pM(P6ieR zE(T5pZUzAc1_m*RY6d|DAqEiO0-MUnz{nuXAOba0p8>>YU|`kS!oa%$ZX6o}BiK-o zF+5;4E7TZH22lnvsODM*7O=JQ0xEkM#C@1;moxBd%V^0MZDWuOZee1S(cZW4|3__* zvCLpsiZQS<Ffa%)urUZTa5IQ7h%g8<$TEn5U8?{wib0-1fq{X6jX@IXS`G$L21N!X c1||k&klz`Y{xWd0GpI0fGcYo!f*q^|0H(FM;Q#;t literal 0 HcmV?d00001 diff --git a/bin/coursework/Main.class b/bin/coursework/Main.class index ed2ce99b3a07ae04a7b79c6a058d9939fb40ebf8..d732c086f0f50b0b91218527463bd8a5593b2706 100644 GIT binary patch literal 16710 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 delta 8025 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 P#URPV!NkNgn?Vu)A6X}E diff --git a/src/coursework/GameState.java b/src/coursework/GameState.java new file mode 100644 index 0000000..092aa5e --- /dev/null +++ b/src/coursework/GameState.java @@ -0,0 +1,25 @@ +package coursework; + +import javafx.scene.control.TextField; + +public class GameState { + + private String[] gridValues; + + public GameState(String[] gridValues) { + this.gridValues = gridValues; + } + + public String[] getGameState() { + return gridValues; + } + + public static String[] getCurrentGameState(TextField[] gridNumbers) { + String[] gridValues = new String[Main.N*Main.N]; + for (int k = 0; k < gridValues.length; k++) { + gridValues[k] = gridNumbers[k].getText(); + } + return gridValues; + } + +} diff --git a/src/coursework/Main.java b/src/coursework/Main.java index 7a28ea1..417ce75 100644 --- a/src/coursework/Main.java +++ b/src/coursework/Main.java @@ -5,6 +5,9 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import java.util.List; +import java.util.Stack; +import java.util.Vector; import javafx.application.*; import javafx.event.EventHandler; @@ -13,7 +16,10 @@ import javafx.geometry.Pos; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.Scene; +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.Label; import javafx.scene.control.TextField; import javafx.scene.image.Image; @@ -49,6 +55,13 @@ public class Main extends Application { private boolean isWider; private HBox previousHBox = null; private Square previousSquare = null; + private boolean clearing = false; + + private Stack<GameState> undoStack = new Stack<GameState>(); + private Stack<GameState> redoStack = new Stack<GameState>(); + + private Button undoButton; + private Button redoButton; private GridPane setupGrid() { GridPane gridPane = new GridPane(); @@ -75,6 +88,15 @@ public class Main extends Application { gridPane.add(group, j, i); gridPane.add(hbox, j, i); + textField.textProperty().addListener((observable, oldValue, newValue) -> { + if (!clearing) { + undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers))); + if (undoButton.isDisabled()) { + undoButton.setDisable(false); + } + } + }); + square.getRectangle().toFront(); return gridPane; } @@ -170,14 +192,54 @@ public class Main extends Application { new Cage(ids, value, operator); } + + 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]); + } + } + private HBox setupBottomHBox() { HBox bottomHBox = new HBox(); bottomHBox.setSpacing(10); bottomHBox.setAlignment(Pos.TOP_CENTER); - Button undoButton = new Button("", new ImageView(new Image("file:Images/undo_icon.png"))); - Button redoButton = new Button("", new ImageView(new Image("file:Images/redo_icon.png"))); + undoButton = new Button("", new ImageView(new Image("file:Images/undo_icon.png"))); + 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 + + redoStack.push(undoStack.pop()); + updateGameState(undoStack.peek()); + + // + if (!redoStack.empty()) { + redoButton.setDisable(false); + } + if (undoStack.size() == 1) { + undoButton.setDisable(true); + } + }); + redoButton.setOnAction(e -> { + GameState gameState = redoStack.pop(); + updateGameState(gameState); + + undoStack.push(gameState); + + if (!undoStack.empty()) { + undoButton.setDisable(false); + } + if (redoStack.empty()) { + redoButton.setDisable(true); + } + }); + + undoButton.setDisable(true); + redoButton.setDisable(true); clearButton.setPrefHeight(36); clearButton.setPrefWidth(120); clearButtonClickEvent(clearButton); @@ -194,14 +256,26 @@ public class Main extends Application { hbox.setStyle("-fx-border-color:red; -fx-border-width:2px;"); previousHBox = hbox; previousSquare = square; + for (TextField textField : gridNumbers) { + textField.deselect(); + } }); } - private void clearButtonClickEvent(Button clearButton) { + private void clearButtonClickEvent(Button clearButton) { clearButton.setOnAction(e -> { - for (TextField textField : gridNumbers) { - textField.setText(""); - } + 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(""); + } + } + });; + clearing = false; }); } @@ -284,6 +358,7 @@ public class Main extends Application { vBox.setAlignment(Pos.CENTER); GridPane gridPane = setupGrid(); + undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers))); HBox topHBox = setupTopHBox(); HBox centerHBox = setupCenterHBox(); -- GitLab