private void internalReveal(int x, int y) {
		//first check error conditions
		if (!checkValidMove(x, y)) return;

		Square square = board.getSquare(x, y);

		//if square already clicked
		if (square.isRevealed()) {
			return;
		}

		//if square is flagged, do nothing
		if (square.isFlagged()) {
			return;
		}

		//check if we are on a mine, if so end the game
		if (square.isMine()) {
			listener.mineRevealed(x, y);
			initiateLoseSequence(x, y);
			return;
		}

		//we must be on a square we haven't clicked yet
		if (square.numMines() > 0) {
			//if square has any number of mines surrounding it, we can simply display that square
			square.setClicked();
			listener.squareRevealed(x, y, square.numMines());
			unclickedNonmines--;
		} else {
			//otherwise we must recursively 'click' squares until we click one that has a mine around it
			recurseClick(x, y);
		}

		//check if we have won
		if (unclickedNonmines == 0) {
			initiateWinSequence();
		}
	}