예제 #1
0
파일: Game.cs 프로젝트: Augusto248/Facultad
        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
        }
예제 #2
0
        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;
                }
            }
        }
예제 #3
0
        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);
                    }
                }
            }
        }
예제 #4
0
        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);
        }
예제 #5
0
        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.
        }
예제 #6
0
파일: Game.cs 프로젝트: Augusto248/Facultad
        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);
                }
            }
        }
예제 #7
0
        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;
                        }
                    }
                }
            }
        }
예제 #8
0
파일: Game.cs 프로젝트: Augusto248/Facultad
        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".
                }
            }
        }
예제 #9
0
 public void eliminarHijo(ArbolGeneral <T> hijo)
 {
     this.raiz.getHijos().Remove(hijo.getRaiz());
 }
예제 #10
0
 public void agregarHijo(ArbolGeneral <T> hijo)
 {
     this.raiz.getHijos().Add(hijo.getRaiz());
 }