From 4a146556f7d43b9eb86cbd607dd468bc7e9609f8 Mon Sep 17 00:00:00 2001
From: Nimrod Abramovich <grumpydormin@gmail.com>
Date: Fri, 13 Mar 2020 01:17:46 +0000
Subject: [PATCH] animations added, almost complete

---
 bin/coursework/Animation.class          | Bin 0 -> 5755 bytes
 bin/coursework/Cage.class               | Bin 5201 -> 5207 bytes
 bin/coursework/ConstraintsHandler.class | Bin 5128 -> 5376 bytes
 bin/coursework/GameState.class          | Bin 871 -> 871 bytes
 bin/coursework/Main.class               | Bin 22015 -> 24444 bytes
 src/coursework/Animation.java           | 184 ++++++++++++++++++++
 src/coursework/ConstraintsHandler.java  |  16 +-
 src/coursework/Main.java                | 214 ++++++++++++++++--------
 8 files changed, 342 insertions(+), 72 deletions(-)
 create mode 100644 bin/coursework/Animation.class
 create mode 100644 src/coursework/Animation.java

diff --git a/bin/coursework/Animation.class b/bin/coursework/Animation.class
new file mode 100644
index 0000000000000000000000000000000000000000..ea9fd11221e9b362801b9cf1f759bb0931b3b95c
GIT binary patch
literal 5755
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
I;SPf&03|}rb^rhX

literal 0
HcmV?d00001

diff --git a/bin/coursework/Cage.class b/bin/coursework/Cage.class
index 70a114efa9b35343e040b2214c124d1c0de03eb7..f93cf6cd92afb4721aa5581143ec6bcac4afbf0f 100644
GIT binary patch
delta 450
zcmcbpab07>9s%c21{MZ>1_nkUtt|}V`&bq*uxtdeBCS~V*)iKLXZSA3BBN&m5#rcq
z#?EZUww&RHB!?)Qo*ApODC>NN6O;c7=+>)>^2}mT(AvVFEXm2NC%~2=$;qOZU?jq@
zU=zclZ44`xGgOFjvn*gBpl;oAh5%9SSqy5TJWLDln745`g9b>QvM3MB0tQ(vPPoOB
zHwa2{s<$vP%E&JK&o%jypj~}C!z_j_hS>~L8RjsoXPC>diD4eYUWWM$*BKTt++tYB
z@RVT@!+(Z8MoxxaMnQ(<3>FLw3_%PWpip73WUyjjV31{a!?2x!gMpF3gyA&94h9Ye
zRt5)#{R}%9*cdn&+!=N->|$VJ;9>}3Sj(`RfrEjYA(mkg!yX0>1|EhaCWg6_CkmM}
z#!NmbB*Ut%{+~f*@++aEf-wv%49pA+3}R9OY&kYk0&J7_3CpXpGHhbtV%Q9JgaSmK
WAsFNs237_^hMQnVa7|_s@dp6cDPoEM

delta 490
zcmcbvaZzK#9s%b-1{MZ>1_nkxtt|}V`&bq*uxtdeBCS~V*)iKLXZS41BBN&m5#rcq
z#?EZUww&RLB!?)Qo*ApODC>NNBa{CN=+>)<^2}n8*V@9MEXm2N$B`k)$)cBFB*L&@
z6T_ly3@es1l!|h*EMUN|Y~6AOKT+;k4633$Obc+EwsARwI!Kw4C=bg51{sj0>ey`E
z(!$0l$|lOb@V|Bo6Qhjm!vB1euL;`Kw=v9O=wz79Foj_b!&-*93>z5cG3;iT&v1od
z0mF5Mg$$1v7BT#0=woDM=w;+(Sk7R<z`zj1zyS&+21^Dj1_lOMh8GOm88{di8B7?C
zGwfjCU|?l%VA##DlYxzalfj)~3&So3HU=(+AcmC;yBRnbxEW#@<}vJH;9%fkNMd4`
zIeDs(Ib-zXvqCbgYHI%(lqbIvIvO0sz{0@Hz`!6P#gStp#Zh3(x`!*0S=v96MaF*v
x0|NsSgE<2O10Pt;Mg|s!O$;0io57A#0E>w*1cMyOz``KFa1-n}j>#M%{s1X5YWM&E

diff --git a/bin/coursework/ConstraintsHandler.class b/bin/coursework/ConstraintsHandler.class
index d80f886ace8cb45794c9249a022cb37de2a66d45..0a68b66c3ee4a187021e0e0b1082d8babf7d6818 100644
GIT binary patch
literal 5376
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

literal 5128
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

diff --git a/bin/coursework/GameState.class b/bin/coursework/GameState.class
index 7da95ce3340cd26d28aaa90c45379d71f8c06b7d..05a8e904dce51e954e51bf717fb058b235294275 100644
GIT binary patch
delta 13
UcmaFP_MC0QOD0B@$*-7d0V)IqmjD0&

delta 13
UcmaFP_MC0QOD0Ci$*-7d0V&M|i~s-t

diff --git a/bin/coursework/Main.class b/bin/coursework/Main.class
index eebd54f556d3480d151a72b3fd5448dad7431061..0bac322ce29c478d59d85bef452194620b73f727 100644
GIT binary patch
literal 24444
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

literal 22015
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
A{r~^~

diff --git a/src/coursework/Animation.java b/src/coursework/Animation.java
new file mode 100644
index 0000000..cdf17e1
--- /dev/null
+++ b/src/coursework/Animation.java
@@ -0,0 +1,184 @@
+package coursework;
+
+import javafx.animation.Timeline;
+import java.util.ArrayList;
+import java.util.List;
+import javafx.animation.KeyFrame;
+import javafx.scene.layout.VBox;
+import javafx.util.Duration;
+
+public class Animation {
+
+	private VBox[] gridBoxes;
+	private String[] colors = {"#FF0000", "#FF7F00", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF", "#3F00FF", "#7F00FF", "rgba(255,0,0,0)"};
+	private Integer[] indexArray;
+	private List<Integer> indexList = new ArrayList<Integer>();
+	private int index = 0;
+	private int count = 1;
+	private int colorIndex = 0;
+
+	public Animation() {
+		gridBoxes = Main.getGridBoxes();
+	}
+	
+	public void go() {
+		initialiseIndex();
+		Timeline timeline = new Timeline();
+		KeyFrame keyframe = new KeyFrame(Duration.seconds(0.1), e -> {
+			if (index != indexArray.length) {
+				for (int j = 0; j < colors.length; j++) {
+					if (index - j >= 0) {
+						if (indexArray[index - j] >= 0 && indexArray[index] - j <= Main.N*Main.N) {
+							gridBoxes[indexArray[index - j]].setStyle("-fx-background-color:"+colors[j]+";");
+						}
+					}
+				}
+				index++;
+			}
+			if (index == indexArray.length && count < 9) {
+				for (int i = 0; i < colors.length - count; i++) {
+					gridBoxes[indexArray[indexArray.length - i - 1]].setStyle("-fx-background-color:"+colors[i+count]+";");
+				}
+				count++;
+			}
+			if (count == 9) {
+				if (Main.N % 2 == 0) {
+					//even
+					int maxCentre = Main.N / 2;
+					int minCentre = maxCentre - 1;
+					
+					int topLeft = (minCentre * Main.N) + minCentre;
+					int topRight = (minCentre * Main.N) + maxCentre;
+					int botLeft = (maxCentre * Main.N) + minCentre;
+					int botRight = (maxCentre * Main.N + maxCentre);
+					int[] gridIndicies = { topLeft, topRight, botLeft, botRight };
+					
+					if (colorIndex < colors.length) {
+						for (int gridIndex : gridIndicies) {
+							gridBoxes[gridIndex].setStyle("-fx-background-color:"+colors[colorIndex]+";");
+						}
+					}
+					if (colorIndex - 1 > 0 && colorIndex < colors.length + 1) {
+						gridBoxes[topLeft - 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+						gridBoxes[topLeft - Main.N].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+						gridBoxes[topLeft - Main.N - 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+						
+						gridBoxes[topRight + 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+						gridBoxes[topRight - Main.N].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+						gridBoxes[topRight - Main.N + 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+						
+						gridBoxes[botLeft - 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+						gridBoxes[botLeft + Main.N].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+						gridBoxes[botLeft + Main.N - 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+						
+						gridBoxes[botRight + 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+						gridBoxes[botRight + Main.N].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+						gridBoxes[botRight + Main.N + 1].setStyle("-fx-background-color:"+colors[colorIndex - 1]+";");
+					}
+					
+
+					
+				}
+				else {
+					//odd 
+					int centre = Main.N - 1 / 2;
+					
+					gridBoxes[centre * Main.N + centre].setStyle("-fx-background-color:"+colors[colorIndex]+";");
+				}
+				colorIndex++;
+			}
+			
+		});
+		timeline.getKeyFrames().add(keyframe);
+		timeline.setCycleCount(indexArray.length + 20);
+		timeline.play();
+		
+	}
+	
+	private void initialiseIndex() {
+		for (int i = 0; i < Main.N; i++) {
+			for (int j = 0; j < Main.N; j++) {
+				if (i % 2 == 0) {
+					indexList.add(i*Main.N + j);
+				}
+				else {
+					indexList.add((i+1) * Main.N - 1 - j);
+				}
+			}
+		}
+		
+		if (getPrevious(indexList) % Main.N == 0) {
+			// even n
+			for (int j = 0; j < Main.N / 2; j++) {
+				moveUpDown(1, Main.N - 1);
+				moveLeftRight(1, 1);
+				moveUpDown(-1, Main.N - 1);
+				if (j != Main.N/2 - 1) {
+					moveLeftRight(1, 1);
+				}
+			}
+			
+			int count = Main.N - 1;
+			moveLeftRight(-1, count);
+			moveUpDown(1, count);
+			moveLeftRight(1, count);
+			count--;
+			
+			while (count > 0) {
+				moveUpDown(-1, count);
+				moveLeftRight(-1, count);
+				count--;
+				moveUpDown(1, count );
+				moveLeftRight(1, count);
+				count--;
+			}
+		}
+		else {
+			// odd n
+			for (int j = 0; j < Main.N / 2; j++) {
+				moveUpDown(1, Main.N - 1);
+				moveLeftRight(-1, 1);
+				moveUpDown(-1, Main.N - 1);
+				moveLeftRight(-1, 1);
+			}
+			moveUpDown(1, Main.N - 1);
+			
+			int count = Main.N - 1;
+			moveLeftRight(1, count);
+			moveUpDown(-1, count);
+			moveLeftRight(-1, count);
+			
+			while (count > 3) {
+				count--;
+				moveUpDown(1, count);
+				moveLeftRight(1, count);
+				count--;
+				moveUpDown(-1, count);
+				moveLeftRight(-1, count);
+			}
+			count--;
+			moveUpDown(1, count);
+			moveLeftRight(1, count);
+		}		
+		
+		indexArray = indexList.toArray(new Integer[indexList.size()]);
+	}
+	
+	private Integer getPrevious(List<Integer> indexList) {
+		return indexList.get(indexList.size() - 1);
+	}
+	
+	private void moveUpDown(int value, int n) {
+		// value == 1 to move up, value == -1 to move down
+		for (int i  = 0; i < n; i++) {
+			indexList.add(getPrevious(indexList) - Main.N*value);
+		}
+	}
+	
+	private void moveLeftRight(int value, int n) {
+		// value == 1, move right, value == -1 move left
+		for (int i  = 0; i < n; i++) {
+			indexList.add(getPrevious(indexList) + value);
+		}
+	}
+}
diff --git a/src/coursework/ConstraintsHandler.java b/src/coursework/ConstraintsHandler.java
index be56672..989872b 100644
--- a/src/coursework/ConstraintsHandler.java
+++ b/src/coursework/ConstraintsHandler.java
@@ -12,7 +12,7 @@ public class ConstraintsHandler {
 	private VBox[] gridBoxes = new VBox[Main.N*Main.N];
 	private List<Cage> gridCages = new ArrayList<Cage>();
 	private boolean[][] gridErrors = new boolean[Main.N*Main.N][3];
-	
+	private boolean constraintChecked = false;	
 	
 	public ConstraintsHandler() {}
 	
@@ -23,7 +23,12 @@ public class ConstraintsHandler {
 		gridErrors = Main.getGridErrors();
 	}
 	
+	public boolean checked() {
+		return constraintChecked;
+	}
+	
 	public void checkConstraints(int col, int row, boolean showMistakes) {
+		constraintChecked = true;
 		updateData();
 		columnConstraint(row, col);
 		rowConstraint(row, col);
@@ -136,16 +141,17 @@ public class ConstraintsHandler {
 	}
 	
 	public void checkWinCondition() {
+		updateData();
 		if (checkCellsFull() && checkConstraintErrors()) {
-			// win condition fulfilled
-			// animation and pop up
-			System.out.println("You won");
+			Animation animation = new Animation();
+			animation.go();
 		}
 	}
 	
 	private boolean checkCellsFull() {
+		System.out.println("");
 		for (TextField textField : gridNumbers) {
-			if (!textField.getText().equals("")) {
+			if (textField.getText().equals("")) {
 				return false;
 			}
 		}
diff --git a/src/coursework/Main.java b/src/coursework/Main.java
index 3416de1..9c8ff2f 100644
--- a/src/coursework/Main.java
+++ b/src/coursework/Main.java
@@ -19,6 +19,7 @@ import javafx.scene.control.Button;
 import javafx.scene.control.ButtonType;
 import javafx.scene.control.CheckBox;
 import javafx.scene.control.Label;
+import javafx.scene.control.TextArea;
 import javafx.scene.control.TextField;
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
@@ -30,12 +31,12 @@ import javafx.scene.layout.VBox;
 import javafx.scene.paint.Color;
 import javafx.scene.shape.Rectangle;
 import javafx.stage.FileChooser;
+import javafx.stage.Modality;
 import javafx.stage.Stage;
 
 public class Main extends Application {
 	
-	final static public int N = 5;
-	final private double GRID_PERCENTAGE = 0.75;
+	final static public int N = 6;
 	
 	private Scene scene;
 	private Stage stage;
@@ -48,7 +49,6 @@ public class Main extends Application {
 	private static boolean[][] gridErrors = new boolean[N*N][3];
 	
 	private static boolean showMistakes = false;
-	private boolean isWider;
 	private Pane previousPane = null;
 	private Square previousSquare = null;
 	private boolean clearing = false;
@@ -86,18 +86,19 @@ public class Main extends Application {
 	public static boolean[][] getGridErrors() {
 		return gridErrors;
 	}
-	//////////////////////////////////////////////////////////////////////////////////
-	
-	private GridPane setupGrid() {
+	//
+	////////////////////////////////////////////////////////////////////////////////
+	private GridPane setupGrid(int width, int height) {
 		GridPane gridPane = new GridPane();
 		gridPane.setAlignment(Pos.CENTER);
-		double size = (scene.getWidth() * GRID_PERCENTAGE) / N;
-
+		double value = width < height ? width : height;	
+		double size = value / N;
 		for (int i = 0; i < N; i++) {
 			for (int j = 0; j < N; j++) {
 				gridPane = addToGridPane(gridPane, size, i, j);
 			}
 		}
+		
 		return gridPane;
 	}
 	
@@ -182,29 +183,13 @@ public class Main extends Application {
 			loadFileButtonClickEvent();
 		});
 		
-		return topHBox;
-	}
-	
-	private void createNewCage(String line) {
-		String[] splitLine = line.split(" ");
-		String[] shiftedIds = splitLine[1].split(",");
-		int[] ids = new int[shiftedIds.length];
-		for (int i = 0; i < shiftedIds.length; i++) {
-			ids[i] = Integer.parseInt(shiftedIds[i]) - 1;
-		}
-		
-		if (splitLine[0].contains("÷")) {
-			splitLine[0] = splitLine[0].replace("÷", "�");
-		}
-		
-		int value = Integer.parseInt(splitLine[0].substring(0, splitLine[0].length()- 1));
-		String operator = splitLine[0].substring(splitLine[0].length() - 1);
+		loadGameTextInputButton.setOnAction(e -> {
+			loadTextButtonClickEvent();
+		});
 		
-		Cage cage = new Cage(ids, value, operator);
-		gridCages.add(cage);
+		return topHBox;
 	}
 	
-	
 	private void updateGameState(GameState gameState) {
 		String[] gameValues = gameState.getGameState();
 		for (int i = 0; i < gridNumbers.length; i++) {
@@ -239,34 +224,43 @@ public class Main extends Application {
 	
 	private VBox setupNumbersVBox() {
 		VBox vbox = new VBox();
+		Button balanceButtonTop = new Button("");
+		balanceButtonTop.setPrefWidth(111);
+		balanceButtonTop.setVisible(false);
+		Button balanceButtonBottom = new Button("");
+		balanceButtonBottom.setPrefWidth(111);
+		balanceButtonBottom.setVisible(false);
+		vbox.getChildren().add(balanceButtonTop);
 		for (int i = 1; i <= N; i++)  {
 			Button button = new Button(i + "");
-			double cellWidth = gridSquares[0].getRectangle().getWidth() / 2;
-			double fontSize = cellWidth * 0.4;
+			final double WIDTH = 50;
 			
-			button.setPrefSize(cellWidth, cellWidth);
-			button.setMaxSize(150, 150);
-			button.setStyle("-fx-font-size:"+fontSize+"pt");
+			button.setPrefSize(WIDTH, WIDTH);
+			button.setMaxSize(WIDTH, WIDTH);
+			button.setStyle("-fx-font-size:"+18+"pt");
 			button.setOnAction(e -> {
 				numbersButtonClickEvent(button);
 			});
 			vbox.getChildren().add(button);
 		}
+		vbox.getChildren().add(balanceButtonBottom);
 		vbox.setSpacing(10);
-		vbox.setAlignment(Pos.CENTER);
+		vbox.setAlignment(Pos.CENTER_LEFT);
 		return vbox;
 	}
 	
 	private VBox setupFontSizeHBox() {
 		VBox vbox = new VBox();	
-		vbox.getChildren().addAll(setupButton("Tiny", 10), setupButton("Small", 14), setupButton("Medium", 18), setupButton("Large", 22), setupButton("Huge", 26));
-		vbox.setSpacing(10);
+		vbox.getChildren().addAll(setupButton("Tiny", 10, 71), setupButton("Small", 14, 81), setupButton("Medium", 18, 91), setupButton("Large", 22, 101), setupButton("Huge", 26, 111));
+		vbox.setSpacing(15);
 		vbox.setAlignment(Pos.CENTER);
 		return vbox;
 	}
 	
-	private Button setupButton(String name, int size) {
+	private Button setupButton(String name, int size, int width) {
 		Button button = new Button(name);
+		button.setMinWidth(width);
+		button.setPrefWidth(width);
 		button.setStyle("-fx-font-size:" + size + "px;");
 		button.setOnAction(e -> {
 			changeFontSizeEvent(size);
@@ -274,6 +268,59 @@ public class Main extends Application {
 		return button;
 	}
 	
+	private void createNewCage(String line) {
+		String[] splitLine = line.split(" ");
+		String[] shiftedIds = splitLine[1].split(",");
+		int[] ids = new int[shiftedIds.length];
+		
+		for (int i = 0; i < shiftedIds.length; i++) {
+			ids[i] = Integer.parseInt(shiftedIds[i]) - 1;
+		}
+		
+		if (splitLine[0].contains("÷") || splitLine[0].contains("/")) {
+			splitLine[0] = splitLine[0].replace("÷", "�");
+		}
+		
+		int value = Integer.parseInt(splitLine[0].substring(0, splitLine[0].length()- 1));
+		String operator = splitLine[0].substring(splitLine[0].length() - 1);
+		
+		Cage cage = new Cage(ids, value, operator);
+		gridCages.add(cage);
+	}
+	
+	
+	private void clearGridAlert() {
+		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) {
+				clearGridData();
+				undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
+			}
+		});;
+		clearing = false;
+	}
+	
+	private void clearEmptyGridAlert() {
+		Alert alert = new Alert(AlertType.WARNING);
+		alert.setContentText("Nothing to clear on the board.");
+		alert.setTitle("Empty Board");
+		alert.showAndWait();
+	}
+	
+	private void clearGridData() {
+		for (TextField textField : gridNumbers) {
+			textField.setText("");
+		}
+		for (int i = 0; i < N*N; i++) {
+			for (int j = 0; j < 3; j++) {
+				gridErrors[i][j] = false;
+			}
+		}
+	}
+	
 	///////////////////////////////////////////////////////////
 	private void loadFileButtonClickEvent() {
 		try {
@@ -294,9 +341,51 @@ public class Main extends Application {
 		}
 	}
 	
+	private void loadTextButtonClickEvent() {
+		Stage popupStage = new Stage();
+		popupStage.initModality(Modality.APPLICATION_MODAL);
+		popupStage.initOwner(stage);
+		
+		VBox vbox = new VBox();
+		vbox.setPadding(new Insets(10));
+		vbox.setSpacing(10);
+		
+		HBox hbox = new HBox();
+		hbox.setSpacing(162);
+		
+		TextArea textArea = new TextArea();
+		Button cancelButton = new Button("Cancel");
+		cancelButton.setAlignment(Pos.TOP_LEFT);
+		cancelButton.setOnAction(e -> {
+			popupStage.hide();
+		});
+		Button loadButton = new Button("Load");
+		loadButton.setAlignment(Pos.TOP_RIGHT);
+		loadButton.setOnAction(e -> {
+			String[] lines = textArea.getText().split("\n");
+			for (String line : lines) {
+				if (!line.equals(null) && !line.equals("")) {
+					createNewCage(line);
+				}
+			}
+			popupStage.hide();
+		});
+		
+		hbox.getChildren().addAll(cancelButton, loadButton);
+		vbox.getChildren().addAll(textArea, hbox);
+		
+		popupStage.setScene(new Scene(vbox, 300, 300));
+		popupStage.show();
+	}
+	
 	private void showMistakesCheckEvent(CheckBox showMistakesCheck) {
+		if (!constraints.checked()) {
+			constraints.checkConstraints(0, 0, false);
+		}
 		showMistakes = showMistakesCheck.isSelected();
 		constraints.highlightCells(showMistakes);
+		Animation animation = new Animation();
+		animation.go();
 	}
 	
 	private void undoButtonClickEvent() {
@@ -351,8 +440,7 @@ public class Main extends Application {
 	private void stageWidthResizeEvent(Stage stage, GridPane gridPane) {
 		stage.widthProperty().addListener((obs, oldVal, newVal) -> {
 			if (newVal.doubleValue() < stage.getHeight())  {
-				isWider = false;
-				resizeGrid(gridPane.getLayoutX(), gridPane.getLayoutY(), gridPane.getWidth());
+				resizeGrid();
 			}
 		});
 	}
@@ -360,20 +448,21 @@ public class Main extends Application {
 	private void stageHeightResizeEvent(Stage stage, GridPane gridPane) {
 		stage.heightProperty().addListener((obs, oldVal, newVal) -> {
 			if (newVal.doubleValue() < stage.getWidth())  {
-				isWider = true;
-				resizeGrid(gridPane.getLayoutX(), gridPane.getLayoutY(), gridPane.getWidth());
+				resizeGrid();
 			}
 		});
 	}
 	
-	public void resizeGrid(double gridX, double gridY, double gridWidth) {
-		double newValue = isWider ? scene.getHeight() : scene.getWidth();
+	public void resizeGrid() {
+		double width = scene.getWidth() - 200;
+		double height = scene.getHeight() - 150;
+		double newValue = height < width ? height : width;
 		for (int i = 0; i < N; i++) {
 			for (int j = 0; j < N; j++) {
 				Rectangle rectangle = gridSquares[i*N + j].getRectangle();
-				rectangle.setWidth(newValue * GRID_PERCENTAGE / N);
-				rectangle.setHeight(newValue * GRID_PERCENTAGE  / N);
-				gridSquares[i*N + j].resizeLines(newValue * GRID_PERCENTAGE / N);
+				rectangle.setWidth(newValue / N);
+				rectangle.setHeight(newValue / N);
+				gridSquares[i*N + j].resizeLines(newValue / N);
 			}
 		}
 	}
@@ -417,25 +506,10 @@ public class Main extends Application {
 	private void clearButtonClickEvent(Button clearButton) {		
 		clearButton.setOnAction(e -> {
 			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;
+				clearGridAlert();
 			}
 			else {
-				Alert alert = new Alert(AlertType.WARNING);
-				alert.setContentText("Nothing to clear on the board.");
-				alert.setTitle("Empty Board");
-				alert.showAndWait();
+				clearEmptyGridAlert();
 			}
 		});
 	}
@@ -467,12 +541,17 @@ public class Main extends Application {
 	@Override
 	public void start(Stage stage) throws Exception {
 		VBox vBox = new VBox();
-		scene = new Scene(vBox,500+50*N,500+50*N);
+		int width = 400 + 80 * N;
+		int height = 275 + 80 * N;
+		
+		scene = new Scene(vBox, width, height);
+		stage.setWidth(width);
+		stage.setHeight(height);
 		vBox.setSpacing(10);
 		vBox.setPadding(new Insets(20));
 		vBox.setAlignment(Pos.CENTER);
 		
-		GridPane gridPane = setupGrid();
+		GridPane gridPane = setupGrid(width - 200, height - 150);
 		undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
 		
 		fontSize = 18;
@@ -484,6 +563,7 @@ public class Main extends Application {
 		HBox gridHBox = new HBox();
 		gridHBox.getChildren().addAll(fontSizeVBox, gridPane, numbersVBox);
 		gridHBox.setSpacing(20);
+		gridHBox.setAlignment(Pos.CENTER);
 		
 		HBox bottomHBox = setupBottomHBox();
 		
@@ -492,8 +572,8 @@ public class Main extends Application {
 		stageWidthResizeEvent(stage, gridPane);
 		stageHeightResizeEvent(stage, gridPane);
 		
-		stage.setMinWidth(500 + 50*N);
-		stage.setMinHeight(500 + 50*N);
+		stage.setMinWidth(width + 50);
+		stage.setMinHeight(height + 50);
 		stage.setScene(scene);
 		stage.setTitle("Mathdoku");
 		stage.show();
-- 
GitLab