private ChessboardValue alphaBetaAlg(ChessboardValue chessValue, ChessboardValue alpha,
			ChessboardValue beta, boolean color, int counter) {

		// Si counter (noeud) == profondeur, alors retourne la valeur
		// heuristique de échiquier
		if (counter >= profondeur) {
			return (chessValue);
		} else {
			counter++;
		}

		// Génère tous les fils de ce noeud (tous les coups possibles pour cette
		// couleur sur cet échiquier)
		final ArrayList<Move> allPossibleMove = chessValue.getActualChessboardClone()
				.generateAllPossibleMoves(color);
		printAllPossibleMove(allPossibleMove, counter, chessValue);

		for (final Move thisMove : allPossibleMove) {

			// Definie une valeur au noeud
			final ChessboardValue thisSon = new ChessboardValue(chessValue.getActualChessboardClone(),
					thisMove, chessValue.getMoves());

			printThisMoveNoeuds(thisMove, thisSon, counter);

			if (thisSon.isLastMoveValid()) {
				if (Helper.isColorWhite(color)) {
					alpha = alpha.VSmax(alphaBetaAlg(thisSon, alpha, beta, !(color), counter));
				} else {
					beta = beta.VSmin(alphaBetaAlg(thisSon, alpha, beta, !(color), counter));
				}
			}
		}

		if (Helper.isColorWhite(color)) {
			return beta.getValue() <= alpha.getValue() ? beta : alpha;
		} else { // Retourne le minimum (Alpha)
			return beta.getValue() <= alpha.getValue() ? alpha : beta;
		}
	}