private void _inicializar(List <int> cartasPropias, List <int> cartasOponente, int limite, bool turno, ArbolGeneral <int> raiz) { //Creo una lista de cards auxiliar para no modificar las originales List <int> cards = new List <int>(); if (turno == true) //Human turn { cards.AddRange(cartasOponente); } else //AI Turn { cards.AddRange(cartasPropias); } //Para cada card foreach (var card in cards) { //Creo un arbol auxiliar con la card como dato ArbolGeneral <int> hijo = new ArbolGeneral <int>(card); //Agrego el arbol auxiliar como hijo de la raíz raiz.agregarHijo(hijo); //Disminuyo el limite int limiteaux = limite - card; //Creo una lista de cards auxiliar para eliminar la card sin perder información de la lista "cards" List <int> cartasRestantes = new List <int>(); cartasRestantes.AddRange(cards); cartasRestantes.Remove(card); //Si el límite es mayor o igual a 0 sigo agregando hijos a los subárboles if (limiteaux >= 0) { //Si es el turno del humano, llamo recursivamente a la funcion con la lista de cards auxiliares como nueva lista de cards del humano. if (turno == true) { _inicializar(cartasPropias, cartasRestantes, limiteaux, !turno, hijo); //Asignamos función heurística a cada nodo cuando volvemos de la recursión List <ArbolGeneral <int> > hijos = raiz.getHijos(); raiz.setFuncionHeuristica(-1); foreach (var h in hijos) { if (h.getFuncionHeuristicaRaiz() == 1) { raiz.setFuncionHeuristica(1); break; } } } //Si es el turno de la IA, llamamos a la función recursivamente con la lista de cartas auxiliares como nueva lista de cartas de la IA. else { _inicializar(cartasRestantes, cartasOponente, limiteaux, !turno, hijo); //Asignamos función heurística a cada nodo cuando volvemos de la recursión. List <ArbolGeneral <int> > hijos = raiz.getHijos(); raiz.setFuncionHeuristica(1); foreach (var h in hijos) { if (h.getFuncionHeuristicaRaiz() == -1) { raiz.setFuncionHeuristica(-1); break; } } } } //Si se pasó el límite else { //Asignamos función heurística a cada hoja //(1 IA Gana ; -1 Human Gana) if (turno == true) { hijo.setFuncionHeuristica(1); } else { hijo.setFuncionHeuristica(-1); } } } Game.setEstadoInicial(raiz); }