public ArbolGeneral <Carta> nuevaReferencia(ArbolGeneral <Carta> aux, List <string> partes) { if (partes.Count == 0) { return(aux); } else { for (int i = 0; i <= aux.getHijos().Count - 1; i++) { if (!(partes.Count == 0)) //Ponemos esto para evitar irnos del indice. { int e = int.Parse(partes[0]); if (aux.getHijos()[i].getDatoRaiz().getCarta().Equals(e)) { partes.RemoveAt(0); aux = nuevaReferencia(aux.getHijos()[i], partes); } } } } return(aux); //Nueva referencia }
public override void cartaDelOponente(int carta) { foreach (var hijo in Aux.getHijos()) //Aux representa la ultima carta que jugo la IA. Entonces, vamos //a buscar en los hijos de Aux si hay alguna carta que sea igual //a la carta que jugo el humano. { if (hijo.getDatoRaiz().getCarta() == carta) //En caso de ser verdadero, entonces haremos referencia a esa carta del humano. { Aux = hijo; break; } } foreach (var hijo in Aux.getHijos()) //Hacemos un foreach de los hijos de la carta del humano. { if (hijo.getDatoRaiz().getHeuris() == 1) //Si tiene un hijo con un valor heuristico igual a "+1", entonces //quiere decir que encontramos una carta con la que la IA puede ganar. { Aux = hijo; //Ya tenemos la nueva referencia. break; } else { Aux = hijo; } } }
public void ArmarArbol(ArbolGeneral <Carta> raiz, List <int> cartasIa, List <int> cartasHum, int limite, bool turnoMaquina) { foreach (int carta in cartasHum) { if (turnoMaquina == true) //Si es el turno de la maquina, entonces... { if (limite >= 0) //Si el limite es mayor o igual a cero, entonces se agrega un nuevo hijo. { Carta car = new Carta(); car.setCarta(carta); car.setHeuris(0); ArbolGeneral <Carta> hijo = new ArbolGeneral <Carta>(car); raiz.agregarHijo(hijo); List <int> cartasHumAux = new List <int>(); //Creamos una lista de cartas auxiliares. cartasHumAux.AddRange(cartasHum); //Hacemos una copia de las cartas del humano. cartasHumAux.Remove(carta); //Borramos de la lista la carta que fue agregada como "hijo" en la raiz. int nuevolimite = limite - carta; //Seteamos un nuevo limite. ArmarArbol(hijo, cartasHumAux, cartasIa, nuevolimite, !turnoMaquina); //Hace llamada recursiva con las cartas de la IA ahora (Hay que armar las jugadas del humano). //Ponemos por parametro !turnomaquina para poder entrar al else en la llamada recursiva. } } else //Si no es el turno de la maquina, entonces... { if (limite >= 0) { Carta car = new Carta(); car.setCarta(carta); car.setHeuris(0); ArbolGeneral <Carta> hijo = new ArbolGeneral <Carta>(car); raiz.agregarHijo(hijo); List <int> cartasIaAux = new List <int>(); cartasIaAux.AddRange(cartasHum); cartasIaAux.Remove(carta); int nuevolimite = limite - carta; ArmarArbol(hijo, cartasIaAux, cartasIa, nuevolimite, !turnoMaquina); } } } }
public void quadtree(int pixels) { int nivel = 0; int pxNegros = 0; ArbolGeneral <T> aux; ArbolGeneral <T> nodoNull = new ArbolGeneral <T>((T)(object)-1); ArbolGeneral <T> anterior = nodoNull; Cola <ArbolGeneral <T> > cola = new Cola <ArbolGeneral <T> >(); cola.encolar(this); while (!cola.esVacia()) { aux = cola.desencolar(); if (aux.getDatoRaiz().ToString() == nodoNull.getDatoRaiz().ToString()) { nivel++; } else { if (anterior.getDatoRaiz().ToString() == nodoNull.getDatoRaiz().ToString()) { cola.encolar(nodoNull); } if (!aux.esHoja()) { foreach (var element in aux.getHijos()) { cola.encolar(element); } } if (aux.esHoja()) { if (aux.getDatoRaiz().ToString() == 1.ToString()) { pxNegros = (int)(pxNegros + (1024 / Math.Pow(4, nivel))); } } } anterior = aux; } Console.Write(pxNegros); }
private ArbolGeneral <Carta> Aux; //Lo usaremos para movernos por el árbol. public override void incializar(List <int> cartasPropias, List <int> cartasOponente, int limite) { this.naipes = cartasPropias; this.naipesHumano = cartasOponente; this.limite = limite; bool turnoMaquina = true; Carta car = new Carta(); car.setCarta(0); car.setHeuris(0); raiz = new ArbolGeneral <Carta>(car); ArmarArbol(raiz, naipes, naipesHumano, limite, turnoMaquina); minmax(raiz, 0); //raiz.porNivelesCartas(); Aux = raiz; //Referencia al arbol. }
public void imprimirHojas(ArbolGeneral <Carta> e) { if (e.esHoja()) { int heu = e.getDatoRaiz().getHeuris(); if (heu == -1) { Console.WriteLine("La IA juega la carta:" + e.getDatoRaiz().getCarta() + " y pierde"); } else { Console.WriteLine("El humano juega la carta:" + e.getDatoRaiz().getCarta() + " y pierde"); } } else { foreach (var hijo in e.getHijos()) { imprimirHojas(hijo); } } }
public void minmax(ArbolGeneral <Carta> raiz, int nivel) { bool e = false; //Para evitar cambiar el valor heuristico necesitamos variables booleanas. bool k = false; if (raiz.esHoja()) { if (!(nivel % 2 == 0)) //Turno humano { raiz.getDatoRaiz().setHeuris(1); } else { raiz.getDatoRaiz().setHeuris(-1); } } else { int nuevoNivel = nivel + 1; foreach (var x in raiz.getHijos()) { minmax(x, nuevoNivel); //Hacemos llamada recursiva en cada hijo de la raiz. if (!(nivel % 2 == 0)) //Turno humano. Estamos parados en una raiz de resto 0. Tiene q setearse con -1. { int valorHeuPorDefecto = -1; int aux = x.getDatoRaiz().getHeuris(); //Le pedimos al hijo de la raiz su valor heuristico. if (aux > valorHeuPorDefecto) //El hijo seria la IA, y la IA siempre juega a ganar, entonces //vamos a buscar un valor heuristico que sea igual a "+1". { valorHeuPorDefecto = aux; raiz.getDatoRaiz().setHeuris(valorHeuPorDefecto); k = true; } if (k == false) { raiz.getDatoRaiz().setHeuris(valorHeuPorDefecto); k = true; } } else { int valorHeuPorDefecto = 1; int aux = x.getDatoRaiz().getHeuris(); if (aux < valorHeuPorDefecto) { valorHeuPorDefecto = aux; raiz.getDatoRaiz().setHeuris(valorHeuPorDefecto); e = true; } if (e == false) { raiz.getDatoRaiz().setHeuris(valorHeuPorDefecto); e = true; } } } } }
private void printScreen() { { Console.WriteLine(); Console.WriteLine("Limite:" + limite.ToString()); if (juegaHumano == false) { Console.WriteLine(); Console.WriteLine("1) ¿Quiere hacer una consulta?"); Console.WriteLine("2) Jugar una carta"); String opcion = Console.ReadLine(); while (opcion == "1") { if (opcion == "1") { if (limiteConsultasAux < limiteConsultas) { Console.Clear(); Console.WriteLine("Consultas disponibles: " + (limiteConsultas - limiteConsultasAux)); limiteConsultasAux = limiteConsultasAux + 1; Console.WriteLine("1) Imprimir todos los posibles resultados desde el punto en que " + "se encuentre el juego."); Console.WriteLine("2) Dado un conjunto de jugadas imprimir todos los posibles resultados."); Console.WriteLine("3) Dada una profundidad imprimir las jugadas a dicha profundidad."); string var = ""; var = Console.ReadLine(); switch (var) { case "1": Console.Clear(); ComputerPlayer player1Aux = (ComputerPlayer)player1; ArbolGeneral <Carta> refe = player1Aux.obtenerReferencia(); imprimirHojas(refe); Console.ReadKey(true); break; case "2": Console.Clear(); ComputerPlayer player1Auxx = (ComputerPlayer)player1; ArbolGeneral <Carta> refex = player1Auxx.obtenerReferencia(); Console.WriteLine("Ingrese un conjunto de jugadas separado por una coma. Ej: 4,2"); string jugadas = Console.ReadLine(); List <string> partes = new List <string>(); partes = jugadas.Split(',').ToList(); ArbolGeneral <Carta> newRef = nuevaReferencia(refex, partes); imprimirHojas(newRef); Console.ReadKey(true); break; case "3": Console.Clear(); ComputerPlayer player1Auxxx = (ComputerPlayer)player1; ArbolGeneral <Carta> refexx = player1Auxxx.obtenerReferenciaRaiz(); Console.WriteLine("Usted actualmente se encuentra en el nivel: " + nivel); refexx.ElegirNivel(); Console.ReadKey(true); break; } Console.Clear(); Console.WriteLine("Consultas disponibles: " + (limiteConsultas - limiteConsultasAux)); Console.WriteLine("Limite:" + limite.ToString()); Console.WriteLine("¿Desea hacer otra consulta?"); Console.WriteLine("1) si"); Console.WriteLine("2) no"); opcion = Console.ReadLine(); } else { Console.WriteLine("Supero las consultas"); opcion = "2"; Console.ReadKey(true); } } } Console.Clear(); Console.WriteLine("Limite:" + limite.ToString()); nivel = nivel + 2; //Esto es para la consulta "c". } } }
public void eliminarHijo(ArbolGeneral <T> hijo) { this.raiz.getHijos().Remove(hijo.getRaiz()); }
public void agregarHijo(ArbolGeneral <T> hijo) { this.raiz.getHijos().Add(hijo.getRaiz()); }