public int alphaBetaSearchResult(int depth, int alpha, int beta) 
	{
		if (isTerminalState())
			return heuristicFunctionValueOfGivenBlock(lastMoveMadeInBlockNumber);
		else if (depth == 0)
			return heuristicFunctionValueOfGame();
	
		List <Integer> listOfEmptyCells = getBlock(nextMoveInBlockNumber).getListOfBestMovesForThisCell(whoHasNextMove);
		
		if (!isOpponentPlaying())
		{
			for (int emptyCell : listOfEmptyCells)
			{
				// Expand this game state
				Game expandedState = new Game(this, whoHasNextMove);
				expandedState.setMove(whoHasNextMove, nextMoveInBlockNumber, emptyCell);
				
				int alphaValue = expandedState.alphaBetaSearchResult(depth - 1, alpha, beta);

				if (alphaValue > alpha)
					alpha = alphaValue;
				
				if (alpha >= beta)
					return alpha;
			}
			return alpha;
		}
		else 
		{

			for (int emptyCell : listOfEmptyCells)
			{
				Game expandedState = new Game(this, whoHasNextMove);
				expandedState.setMove(whoHasNextMove, nextMoveInBlockNumber, emptyCell);
				int betaValue = expandedState.alphaBetaSearchResult(depth - 1, alpha, beta);

				if (betaValue < beta)
					beta = betaValue;
				
				if (beta <= alpha)
					return beta;
			}
			return beta;
		}
	}