public override void incializar(List <int> cartasPropias, List <int> cartasOponente, int limite) { DatosJugada datosJugada = new DatosJugada(0, limite, true); minimax = new ArbolGeneral <DatosJugada>(datosJugada); bool turno = true; //esta variable se debe declarar como atributo de clase naipes = cartasPropias; crearArbol(cartasPropias, cartasOponente, limite, turno, minimax); Console.WriteLine(minimax.getHijos().Count); }
// Update is called once per frame void Update() { if (Input.GetKeyDown(KeyCode.Mouse0) && manager.turnoJugador()) { RaycastHit hit; Ray ray = camera.ScreenPointToRay(Input.mousePosition); Debug.DrawRay(ray.origin, ray.direction * Mathf.Infinity, Color.red, 5); if (Physics.Raycast(ray, out hit)) { GameObject objectHit = hit.transform.gameObject; //objectHit.GetComponent<Animator>().Play("seleccionado"); DatosJugada datos = objectHit.GetComponent <DatosJugada>(); int posX = datos.PosX; int posY = datos.PosY; manager.hacerJugada(posX, posY, manager.turnoJugador()); } } }
private void crearArbol(List <int> cartasPropias, List <int> cartasOponente, int limite, bool turno, ArbolGeneral <DatosJugada> aux) { List <int> cartas = new List <int>(); //creo una lista vacia, que se llenara de cartas //al determinar que primero juegue el humano, siempre se ejecutará el IF if (turno) { // Si es el turno del usuario agrego las cartas del oponente cartas.AddRange(cartasOponente); } else { // Si es el turno de la IA agrego las cartas propias cartas.AddRange(cartasPropias); } //comienzo a llenar el arbol minimax con las cartas del humano (cada una sera un subarbol) foreach (int carta in cartas) //crea, por ende, 6 hijos a la raíz null del minmax { //----------------------------------------------------------------------------------- DatosJugada jugada = new DatosJugada(0, 0, true); // Creo subarboles hijos PARA cada carta ArbolGeneral <DatosJugada> hijo = new ArbolGeneral <DatosJugada>(jugada); //agrego la carta a la raiz hijo.getDatoRaiz().carta = carta; // Agrego los hijos al arbol minmax aux.agregarHijo(hijo); // Disminuyo el limite para cada carta int nuevoLimite = limite - carta; // Tendremos una lista de cartas auxiliares para hacer la llamada recursiva sin la carta que ya se jugo List <int> cartasAux = new List <int>(); cartasAux.AddRange(cartas); cartasAux.Remove(carta); //saca la primer carta que juega el humano y a partir de ahí sigue // Chequeo el limite, si no se supero hago las llamadas recursivas y cambio el turno if (nuevoLimite >= 0) { bool Noencontro_Humano = false; //Variables que serviran para la busqueda heuristica bool Noencontro_Computer = false; //---------------------------crea un nuevo nivel o no (dependiendo del if anterior) invirtiendo el turno---------------------------------------- // Si es turno del usuario, paso las cartas auxiliares como cartas del oponente if (turno) { crearArbol(cartasPropias, cartasAux, nuevoLimite, !turno, hijo); //paso como arbol, a los arboles hijos de la raiz. sucesivamente // Comparo las funciones heuristicas de los hijos foreach (var hijos in hijo.getHijos()) { // Si hay una con valor 1, se la seteo al padre //esto hace que el -1 o 1 vaya subiendo y se setee desde la hoja hasta los hijos del primer nivel if (hijos.getDatoRaiz().valorDeConveniencia == -1) { hijo.getDatoRaiz().valorDeConveniencia = -1; } else { Noencontro_Humano = true; } } if (Noencontro_Humano) { Noencontro_Humano = !Noencontro_Humano; //Si no encuentra quiere decir que no hay un hijo con valor -1 y entonces se le sete 1 al padre. hijo.getDatoRaiz().valorDeConveniencia = 1; } } // Si es el turno de la IA paso cartas auxiliares como cartas propias else { crearArbol(cartasAux, cartasOponente, nuevoLimite, !turno, hijo); // Comparo las funciones heuristicas de los hijos foreach (var hijos in hijo.getHijos()) { // Si hay una con valor -1, se la seteo al padre if (hijos.getDatoRaiz().valorDeConveniencia == 1) { hijo.getDatoRaiz().valorDeConveniencia = 1; } else { Noencontro_Computer = true; } } if (Noencontro_Computer) { Noencontro_Computer = !Noencontro_Computer; //Si no encuentra quiere decir que no hay un hijo con valor 1 y entonces se le sete 1 al padre. hijo.getDatoRaiz().valorDeConveniencia = -1; } } } //---------------------------------------------------------------------------------- // Si se supera el limite verifico quien gano (-1 gana humano, 1 gana pc) // acá se asigna el valor a las hojas ... else { if (turno) { hijo.getDatoRaiz().valorDeConveniencia = 1; //se pasa de limite el humano } else { hijo.getDatoRaiz().valorDeConveniencia = -1; //se pasa de limite la computadora } } referencia = minimax; //Referencia la vamos a usar para saber en que cartas estamos. } }