public void compute() {
		if(this.expandCounter > 350) {
			this.view.printFailure();
			return;
		}

		this.maze[this.currentNode.getX()][this.currentNode.getY()]++;
		this.view.printMaze(this.currentNode, this.closedNodes); // Print the current maze
		if(this.checkerObject.isGoal(this.currentNode)) {
			// End of algorithm
			this.view.printSolution(this.closedNodes, this.deadEndList);
			this.view.printSuccess();
			return;
		}

		if(((this.currentNode.getX()-1)>0 && (this.currentNode.getX()+1)<(this.checkerObject.getSize().getX()-1))&&((this.currentNode.getY()-1)>0 && (this.currentNode.getY()+1)<(this.checkerObject.getSize().getY()-1))) {
			// Checks 2 nodes ahead and positions current node there if possible
			this.checkerObject.nodeCheckAll(new Node(this.currentNode.getX(), this.currentNode.getY()), this.closedNodes, true);
			if(futureStep()) {
				compute();
			}
		}
		
		this.checkerObject.nodeCheckAll(this.currentNode, this.closedNodes);

		if(!stageOne()) {
			super.verifyDeadEnd();
		}

		// Repeat computation if not exhausted
		compute();
	}