diff --git a/bin/coursework/Animation.class b/bin/coursework/Animation.class
index ea9fd11221e9b362801b9cf1f759bb0931b3b95c..c2bb568060dfc33acfe2ac65225322cbbea49b6d 100644
Binary files a/bin/coursework/Animation.class and b/bin/coursework/Animation.class differ
diff --git a/bin/coursework/Cage.class b/bin/coursework/Cage.class
index f93cf6cd92afb4721aa5581143ec6bcac4afbf0f..052d4186f6d4b83626024f7aaf7222bdaceaa13a 100644
Binary files a/bin/coursework/Cage.class and b/bin/coursework/Cage.class differ
diff --git a/bin/coursework/ConstraintsHandler.class b/bin/coursework/ConstraintsHandler.class
index 0a68b66c3ee4a187021e0e0b1082d8babf7d6818..bade47a38ad4369566460ba344b569c3d12da6f3 100644
Binary files a/bin/coursework/ConstraintsHandler.class and b/bin/coursework/ConstraintsHandler.class differ
diff --git a/bin/coursework/GameState.class b/bin/coursework/GameState.class
index 05a8e904dce51e954e51bf717fb058b235294275..8027a7087fee2b670d9c16a28a14d56c83fb11eb 100644
Binary files a/bin/coursework/GameState.class and b/bin/coursework/GameState.class differ
diff --git a/bin/coursework/Main.class b/bin/coursework/Main.class
index 0bac322ce29c478d59d85bef452194620b73f727..5b83beb2a97814918f935971184bb5dd7dce3c19 100644
Binary files a/bin/coursework/Main.class and b/bin/coursework/Main.class differ
diff --git a/src/coursework/Animation.java b/src/coursework/Animation.java
index cdf17e1f032b4ae690e853df85ef2799cb7b7ff2..f3e9c9b44a6cbc4b6d9d43a10d722dd4c9a9a174 100644
--- a/src/coursework/Animation.java
+++ b/src/coursework/Animation.java
@@ -4,13 +4,15 @@ import javafx.animation.Timeline;
 import java.util.ArrayList;
 import java.util.List;
 import javafx.animation.KeyFrame;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
 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 String[] colors = {"#FF0000", "#FF7F00", "#FFFF00", "#00FF00", "#00FFFF", "#0000FF", "#462370", "#7F00FF", "rgba(255,0,0,0)"};
 	private Integer[] indexArray;
 	private List<Integer> indexList = new ArrayList<Integer>();
 	private int index = 0;
@@ -42,7 +44,7 @@ public class Animation {
 				count++;
 			}
 			if (count == 9) {
-				if (Main.N % 2 == 0) {
+				if (Main.N % 2 == 0  && colorIndex % 2 == 0 && colorIndex < 23 ) {
 					//even
 					int maxCentre = Main.N / 2;
 					int minCentre = maxCentre - 1;
@@ -53,48 +55,97 @@ public class Animation {
 					int botRight = (maxCentre * Main.N + maxCentre);
 					int[] gridIndicies = { topLeft, topRight, botLeft, botRight };
 					
-					if (colorIndex < colors.length) {
+					if (colorIndex/2 < colors.length) {
 						for (int gridIndex : gridIndicies) {
-							gridBoxes[gridIndex].setStyle("-fx-background-color:"+colors[colorIndex]+";");
+							gridBoxes[gridIndex].setStyle("-fx-background-color:"+colors[colorIndex/2]+";");
 						}
 					}
-					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]+";");
+					if (colorIndex/2 - 1 > 0 && colorIndex/2 < colors.length + 1 && Main.N > 2) {						
+						int[] ringCombinations1 = {1, Main.N + 1, Main.N};
+						for (int ringVal : ringCombinations1) {
+							gridBoxes[botRight + ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 1]+";");
+							gridBoxes[topLeft - ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 1]+";");
+						}
+						int[] ringCombinations2 = {- 1, Main.N - 1, Main.N};
+						for (int ringVal : ringCombinations2) {
+							gridBoxes[botLeft + ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 1]+";");
+							gridBoxes[topRight - ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 1]+";");
+						}
+					}
+					if (colorIndex/2 - 2 > 0 && colorIndex/2 < colors.length + 2 && Main.N > 4) {
+						int[] ringCombinations1 = {2, Main.N + 2, 2*Main.N + 2, 2*Main.N + 1, 2*Main.N};
+						for (int ringVal : ringCombinations1) {
+							gridBoxes[botRight + ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 2]+";");
+							gridBoxes[topLeft - ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 2]+";");
+						}
+						int[] ringCombinations2 = {- 2, Main.N - 2, 2*Main.N - 2, 2*Main.N - 1, 2*Main.N};
+						for (int ringVal : ringCombinations2) {
+							gridBoxes[botLeft + ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 2]+";");
+							gridBoxes[topRight - ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 2]+";");
+						}
+					}
+					if (colorIndex/2 - 3 > 0 && colorIndex/2 < colors.length + 3 && Main.N > 6) {
+						int[] ringCombinations1 = {3, Main.N + 3, 2*Main.N + 3, 3*Main.N + 3, 3*Main.N + 2, 3*Main.N + 1, 3*Main.N};
+						for (int ringVal : ringCombinations1) {
+							gridBoxes[botRight + ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 3]+";");
+							gridBoxes[topLeft - ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 3]+";");
+						}
+						int[] ringCombinations2 = {- 3, Main.N - 3, 2*Main.N - 3, 3*Main.N - 3, 3*Main.N - 2, 3*Main.N - 1, 3*Main.N};
+						for (int ringVal : ringCombinations2) {
+							gridBoxes[botLeft + ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 3]+";");
+							gridBoxes[topRight - ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 3]+";");
+						}
 					}
+					colorIndex++;
+				}
+				else if (colorIndex % 2 == 0) {
+					//odd 
+					int centrePoint = (Main.N - 1) / 2;
+					int centre = (centrePoint * Main.N) + centrePoint;
 					
-
+					if (colorIndex/2 < colors.length) {
+						gridBoxes[centre].setStyle("-fx-background-color:"+colors[colorIndex/2]+";");
+					}
 					
+					if (colorIndex/2 - 1 > 0 && colorIndex/2 < colors.length + 1) {
+						int[] firstRing = {- 1 - Main.N, - Main.N, 1 - Main.N, - 1, + 1, - 1 + Main.N, Main.N, 1 + Main.N };
+						for (int ringVal : firstRing) {
+							gridBoxes[centre + ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 1]+";");
+						}
+					}
+					if (colorIndex/2 - 2 > 0 && colorIndex/2 < colors.length + 2 && Main.N > 3) {
+						int[] secondRing = { -2*Main.N - 2, - 2*Main.N - 1, - 2*Main.N, - 2*Main.N + 1, - 2*Main.N + 2, - Main.N - 2, - Main.N + 2, 2, -2, Main.N - 2, Main.N + 2,
+								2*Main.N - 2, 2*Main.N - 1, 2*Main.N, 2*Main.N + 1, 2*Main.N + 2 };
+						for (int ringVal : secondRing) {
+							gridBoxes[centre + ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 2]+";");
+						}
+					}
+					if (colorIndex/2 - 3 > 0 && colorIndex/2 < colors.length + 3 && Main.N > 5) {
+						int[] thirdRing = { -3*Main.N - 3, - 3*Main.N - 2, -3*Main.N - 1, - 3*Main.N, - 3*Main.N + 1, - 3*Main.N + 2, - 3*Main.N + 3, - Main.N - 3, - Main.N + 3, 3, -3, Main.N - 3,
+								Main.N + 3, 2*Main.N - 3, 2*Main.N + 3, -2*Main.N + 3, -2*Main.N - 3, 3*Main.N - 3, 3*Main.N - 2, 3*Main.N - 1, 3*Main.N, 3*Main.N + 1, 3*Main.N + 2, 3*Main.N + 3};
+						for (int ringVal : thirdRing) {
+							gridBoxes[centre + ringVal].setStyle("-fx-background-color:"+colors[colorIndex/2 - 3]+";");
+						}
+					}
+					colorIndex++;
 				}
 				else {
-					//odd 
-					int centre = Main.N - 1 / 2;
-					
-					gridBoxes[centre * Main.N + centre].setStyle("-fx-background-color:"+colors[colorIndex]+";");
+					colorIndex++;
 				}
-				colorIndex++;
+			}
+			if (colorIndex == 23) {
+				Alert alert = new Alert(AlertType.INFORMATION);
+				alert.setContentText("Congratulations! You have completed this Mathdoku puzzel.");
+				alert.setTitle("Puzzel Complete");
+				alert.show();
 			}
 			
 		});
 		timeline.getKeyFrames().add(keyframe);
-		timeline.setCycleCount(indexArray.length + 20);
+		timeline.setCycleCount(indexArray.length + 30);
 		timeline.play();
-		
 	}
-	
+		
 	private void initialiseIndex() {
 		for (int i = 0; i < Main.N; i++) {
 			for (int j = 0; j < Main.N; j++) {
diff --git a/src/coursework/Main.java b/src/coursework/Main.java
index 9c8ff2fc07cda09e28392ba7e34623683e2570c9..70ac3b204c3effc53081848cf2e089449f5627f5 100644
--- a/src/coursework/Main.java
+++ b/src/coursework/Main.java
@@ -36,7 +36,7 @@ import javafx.stage.Stage;
 
 public class Main extends Application {
 	
-	final static public int N = 6;
+	final static public int N = 8;
 	
 	private Scene scene;
 	private Stage stage;
@@ -119,7 +119,7 @@ public class Main extends Application {
 		gridPane.add(vbox, j, i);
 		
 		textField.textProperty().addListener((observable, oldValue, newValue) -> {
-			textFieldClickEvent(i, j);
+			textFieldDataChange(i, j);
 		});
 		
 		square.getRectangle().toFront();
@@ -384,8 +384,6 @@ public class Main extends Application {
 		}
 		showMistakes = showMistakesCheck.isSelected();
 		constraints.highlightCells(showMistakes);
-		Animation animation = new Animation();
-		animation.go();
 	}
 	
 	private void undoButtonClickEvent() {
@@ -514,7 +512,7 @@ public class Main extends Application {
 		});
 	}
 	
-	private void textFieldClickEvent(int i, int j) {
+	private void textFieldDataChange(int i, int j) {
 		if (!clearing && !undoing) {
 			undoStack.push(new GameState(GameState.getCurrentGameState(gridNumbers)));
 			if (undoButton.isDisabled()) {
@@ -567,6 +565,36 @@ public class Main extends Application {
 		
 		HBox bottomHBox = setupBottomHBox();
 		
+		/////
+//		Button tempButton = new Button("SHOW ANSWER");
+//		int[] answers = {5,6,3,4,1,2,6,1,4,5,2,3,4,5,2,3,6,1,3,4,1,2,5,6,2,3,6,1,4,5,1,2,5,6,3,4};
+//		tempButton.setOnAction(e -> {
+//			if (N != 6) {
+//				Animation animation = new Animation();
+//				animation.go();
+//			}
+//			else {
+//				BufferedReader file;
+//				try {
+//					file = new BufferedReader(new FileReader(new File("C:\\Java Eclipse Workspace\\Programming II Coursework\\mathdokuCage.txt")));
+//				
+//					String line;
+//					while ((line = file.readLine()) != null) {
+//						createNewCage(line);
+//					}
+//					file.close();
+//					
+//					for (int i = 0; i < gridNumbers.length; i++) {
+//						gridNumbers[i].setText(answers[i] + "");
+//					}
+//				}
+//				catch (IOException ex) {
+//					System.err.println(ex);
+//				}
+//			}
+//		});
+		/////
+		
 		vBox.getChildren().addAll(topHBox, gridHBox, bottomHBox);
 		
 		stageWidthResizeEvent(stage, gridPane);