예제 #1
0
        public int Distancia_Raiz(ArbolGeneral <Planeta> arbol)
        {
            if (arbol.getDatoRaiz().EsPlanetaDeLaIA())
            {
                return(0);
            }
            else
            {
                int nivel = 1;
                List <ArbolGeneral <Planeta> > Lista_hijos = arbol.getHijos();
                List <ArbolGeneral <Planeta> > Siguiente_nivel_hijos;
                do
                {
                    //lista vacia que tendra los nodos por nivel
                    Siguiente_nivel_hijos = new List <ArbolGeneral <Planeta> >();

                    foreach (ArbolGeneral <Planeta> Obtener_hijo in Lista_hijos)
                    {   //cuando encuentro un nodo que es ia retorno el nivel
                        if (Obtener_hijo.getDatoRaiz().EsPlanetaDeLaIA())
                        {
                            return(nivel);
                        }
                        //obtengo los hijos del nodo obtener hijos y lo agrego a la lista de nodos que tiene siguiente nivel
                        foreach (ArbolGeneral <Planeta> hijo in Obtener_hijo.getHijos())
                        {
                            Siguiente_nivel_hijos.Add(hijo);
                        }
                    }
                    Lista_hijos = Siguiente_nivel_hijos;
                    nivel++;
                } while (Siguiente_nivel_hijos.Count > 0);
                //-1 si no esta el dato
                return(-1);
            }
        }
예제 #2
0
 public List <Planeta> CaminoPreOrden(ArbolGeneral <Planeta> arbol, List <Planeta> camino)
 {
     // Primero raiz
     camino.Add(arbol.getDatoRaiz());
     // si encontramos camino
     if (arbol.getDatoRaiz().EsPlanetaDeLaIA())
     {
         return(camino);
     }
     else
     {
         //hijos recursivo...
         foreach (var hijo in arbol.getHijos())
         {
             List <Planeta> caminoAux = CaminoPreOrden(hijo, camino);
             if (caminoAux != null)
             {
                 return(caminoAux);
             }
             //saco ultimo planeta del camino
             camino.Remove(hijo.getDatoRaiz());
         }
     }
     return(null);
 }
예제 #3
0
        public String Consulta2(ArbolGeneral <Planeta> arbol)
        {
            Cola <ArbolGeneral <Planeta> > q = new Cola <ArbolGeneral <Planeta> >();

            q.encolar(arbol);
            int    nivel   = 0;
            String mensaje = "";

            while (!q.esVacia())
            {
                int elementos = q.cantElementos();
                nivel++;
                int cantidadPorNivel = 0;
                while (elementos-- > 0)
                {
                    ArbolGeneral <Planeta> nodoActual = q.desencolar();

                    if (nodoActual.getDatoRaiz().Poblacion() > 10)
                    {
                        cantidadPorNivel++;
                    }
                    foreach (ArbolGeneral <Planeta> hijo in nodoActual.getHijos())
                    {
                        q.encolar(hijo);
                    }
                }
                mensaje += "Nivel " + nivel + ": " + cantidadPorNivel + "\n";
            }
            return(mensaje);
        }
예제 #4
0
        public Movimiento CalcularMovimiento(ArbolGeneral <Planeta> arbol)
        {
            if (!arbol.getDatoRaiz().EsPlanetaDeLaIA())
            {
                ArrayList lista = new ArrayList();
                lista = preordenCaminoIA(lista, arbol);
                Planeta origen  = (Planeta)lista[lista.Count - 1];
                Planeta destino = (Planeta)lista[lista.Count - 2];
                return(new Movimiento(origen, destino));
            }
            else
            {
                ArrayList lista = new ArrayList();
                lista = preordenCaminoJugador(lista, arbol);
                int     a = 0, b = 1;
                Planeta origen  = (Planeta)lista[a];
                Planeta destino = (Planeta)lista[b];
                for (int i = 0; i < lista.Count; i++)
                {
                    Planeta elegido       = (Planeta)lista[i];
                    Planeta elegidoMasUno = (Planeta)lista[i + 1];
                    if (elegido.EsPlanetaDeLaIA() && !elegidoMasUno.EsPlanetaDeLaIA())
                    {
                        return(new Movimiento(elegido, elegidoMasUno));
                    }
                }

                return(new Movimiento(origen, destino));
            }
        }
예제 #5
0
        public String Consulta3(ArbolGeneral <Planeta> arbol)
        {
            Cola <ArbolGeneral <Planeta> > q = new Cola <ArbolGeneral <Planeta> >();

            q.encolar(arbol);
            int    nivel   = 0;
            String mensaje = "";

            while (!q.esVacia())
            {
                int elementos = q.cantElementos();
                nivel++;
                int cantidad = 0;
                int total    = 0;
                while (elementos-- > 0)
                {
                    ArbolGeneral <Planeta> nodoActual = q.desencolar();
                    total = total + nodoActual.getDatoRaiz().Poblacion();
                    cantidad++;
                    foreach (ArbolGeneral <Planeta> hijo in nodoActual.getHijos())
                    {
                        q.encolar(hijo);
                    }
                }
                double promedio = total / cantidad;
                mensaje += "\n" + "\n" + "\n" + "Nivel " + nivel + ": " + promedio + "\n";
            }
            return(mensaje);
        }
예제 #6
0
        public Movimiento CalcularMovimiento(ArbolGeneral <Planeta> arbol)
        {
            List <Planeta> caminoHaciaRaiz   = null;
            List <Planeta> caminoHaciaHumano = null;

            caminoHaciaRaiz = CaminoIAaRaiz(arbol, new List <Planeta>());
            caminoHaciaRaiz.Reverse();

            caminoHaciaHumano = CaminoRaizAHumano(arbol, new List <Planeta>());

            if (!arbol.getDatoRaiz().EsPlanetaDeLaIA())
            {
                Movimiento movARaiz = new Movimiento(caminoHaciaRaiz[0], caminoHaciaRaiz[1]);
                return(movARaiz);
            }
            else
            {
                for (int index = 0; index < caminoHaciaHumano.Count(); index++)
                {
                    if (caminoHaciaHumano[index].EsPlanetaDeLaIA() &&
                        (caminoHaciaHumano[index + 1].EsPlanetaNeutral() ||
                         caminoHaciaHumano[index + 1].EsPlanetaDelJugador()))
                    {
                        Movimiento movAhumano = new Movimiento(caminoHaciaHumano[index], caminoHaciaHumano[index + 1]);
                        return(movAhumano);
                    }
                }
            }
            return(null);
        }
예제 #7
0
 public Movimiento CalcularMovimiento(ArbolGeneral <Planeta> arbol)
 {
     if (!arbol.getDatoRaiz().EsPlanetaDeLaIA())         //Si la raiz no pertenece al bot
     {
         List <Planeta> caminoIA = new List <Planeta>(); //Creo el camino
         caminoIA = this.caminoRaizIa(arbol, caminoIA);
         int        count  = caminoIA.Count;
         Movimiento ataque = new Movimiento(caminoIA[count - 1], caminoIA[count - 2]);                //Realizo el ataque
         return(ataque);
     }
     else  //Si la raiz le pertenece al bot
     {
         List <Planeta> caminoPlayer = new List <Planeta>();              //Creo el camino
         caminoPlayer = this.caminoRaizPlayer(arbol, caminoPlayer);
         for (int count = 0; count < caminoPlayer.Count; count++)
         {
             if (!caminoPlayer[count].EsPlanetaDeLaIA())
             {
                 count--;
                 Movimiento ataque = new Movimiento(caminoPlayer[count], caminoPlayer[count + 1]);                        //Realizo el ataque
                 return(ataque);
             }
         }
         return(null);
     }
 }
예제 #8
0
        public String Consulta3(ArbolGeneral <Planeta> arbol)         //Recorrido por niveles
        {
            Cola <ArbolGeneral <Planeta> > q = new Cola <ArbolGeneral <Planeta> >();

            q.encolar(arbol);
            int    nivel   = 0;
            String mensaje = "";

            while (!q.esVacia())
            {
                int elementos = q.cantElementos();
                nivel++;
                int cantidadPorNivel  = 0;
                int poblacionPorNivel = 0;
                while (elementos-- > 0)
                {
                    ArbolGeneral <Planeta> nodoActual = q.desencolar();
                    cantidadPorNivel++;
                    poblacionPorNivel += nodoActual.getDatoRaiz().Poblacion();
                    foreach (ArbolGeneral <Planeta> hijo in nodoActual.getHijos())
                    {
                        q.encolar(hijo);
                    }
                }
                mensaje += "Nivel " + nivel + ": " + poblacionPorNivel / cantidadPorNivel + "-----";
            }
            return(mensaje);
        }
예제 #9
0
        public String Consulta1(ArbolGeneral <Planeta> arbol)         //Recorrido por niveles
        {
            Cola <ArbolGeneral <Planeta> > q = new Cola <ArbolGeneral <Planeta> >();

            q.encolar(arbol);
            int nivel = 0;

            while (!q.esVacia())
            {
                int elementos = q.cantElementos();
                nivel++;
                while (elementos-- > 0)
                {
                    ArbolGeneral <Planeta> nodoActual = q.desencolar();
                    if (nodoActual.getDatoRaiz().EsPlanetaDeLaIA())
                    {
                        nivel--;
                        string texto = nivel.ToString();
                        return("La distancia entre la raiz y el planeta del bot es de: " + texto);
                    }
                    foreach (ArbolGeneral <Planeta> hijo in nodoActual.getHijos())
                    {
                        q.encolar(hijo);
                    }
                }
            }
            return("");
        }
예제 #10
0
        public String Consulta1(ArbolGeneral <Planeta> arbol)
        {
            int distancia = Distancia_Raiz(arbol);

            if (distancia < 1)
            {
                return("El bot Esta en la Raiz");
            }
            return("La distancia que existe entre el bot a la Raiz es " + distancia);
        }
예제 #11
0
        public String Consulta1(ArbolGeneral <Planeta> arbol)
        {
            ArrayList list = new ArrayList();

            list = preordenCaminoIA(list, arbol);
            int    distancia = list.Count - 1;
            string dist      = distancia.ToString();

            return("La distancia desde la raiz hasta el nodo mas cercano a la IA es: " + dist);
        }
예제 #12
0
        public String Consulta3(ArbolGeneral <Planeta> arbol)
        {
            // calcular  promedio poblacion por nivel de arbol (recorrido por niveles, sumar en total y cantidad y dividir por cantidad para sacar promedio)
            Cola <ArbolGeneral <Planeta> > c = new Cola <ArbolGeneral <Planeta> >();
            uint Conta1 = 0;
            uint Conta2 = 0;
            uint Conta3 = 0;
            uint Conta4 = 0;
            uint nivel1 = 0;
            uint nivel2 = 0;
            uint nivel3 = 0;
            uint nivel4 = 0;

            c.encolar(arbol);

            while (!c.esVacia())
            {
                arbol = c.desencolar();
                int conta = arbol.nivel(arbol.getDatoRaiz());
                if (conta == 1)
                {
                    nivel1 += arbol.getDatoRaiz().population;
                    Conta1++;
                }
                else if (conta == 2)
                {
                    nivel2 += arbol.getDatoRaiz().population;
                    Conta2++;
                }
                else if (conta == 3)
                {
                    nivel3 += arbol.getDatoRaiz().population;
                    Conta3++;
                }
                else
                {
                    nivel4 += arbol.getDatoRaiz().population;
                    Conta4++;
                }
                foreach (var hijo in arbol.getHijos())
                {
                    c.encolar(hijo);
                }
            }
            nivel1 /= Conta1;
            nivel2 /= Conta2;
            nivel3 /= Conta3;
            nivel4 /= Conta4;
            return($"\r\n\r\n\r\n\r\n\r\n\r\nPromedio de poblacion segun nivel:\r\n" +
                   $"nivel 1: {nivel1}\r\n" +
                   $"nivel 2: {nivel2}\r\n" +
                   $"nivel 3: {nivel3}\r\n" +
                   $"nivel 4: {nivel4}\r\n");
        }
예제 #13
0
        public Movimiento CalcularMovimiento(ArbolGeneral <Planeta> arbol)
        {
            Movimiento probar = enviarMovimiento(arbol);

            return(probar);

            /*
             * ArbolGeneral<Planeta> raiz = arbol;
             * //suponemos que estan en la raiz cosa que al iniciar el do while va a cambiar
             * ArbolGeneral<Planeta> nodoIA = raiz;
             * ArbolGeneral<Planeta> nodoUsuario = raiz;
             * ArbolGeneral<Planeta> nodoPadreIA = raiz;
             *
             * int nivel = 1;
             * List<ArbolGeneral<Planeta>> Lista_hijos = new List<ArbolGeneral<Planeta>>();
             * Lista_hijos.Add(arbol);
             *  //arbol.getHijos();
             * List<ArbolGeneral<Planeta>> Siguiente_nivel_hijos;
             * do
             * {
             *  ArbolGeneral<Planeta> nodopadre;
             *  //lista vacia que tendra los nodos por nivel
             *  Siguiente_nivel_hijos = new List<ArbolGeneral<Planeta>>();
             *
             *  foreach (ArbolGeneral<Planeta> Obtener_hijo in Lista_hijos)
             *  {
             *      nodopadre = Obtener_hijo;
             *
             *      //obtengo los hijos del nodo obtener hijos y lo agrego a la lista de nodos que tiene siguiente nivel
             *      foreach (ArbolGeneral<Planeta> hijo in Obtener_hijo.getHijos())
             *      {
             *          if (hijo.getDatoRaiz().EsPlanetaDeLaIA())
             *          {
             *              nodoIA = hijo;
             *              nodoPadreIA = nodopadre;
             *          }
             *          if (hijo.getDatoRaiz().EsPlanetaDelJugador())
             *          {
             *              nodoUsuario = hijo;
             *          }
             *          Siguiente_nivel_hijos.Add(hijo);
             *      }
             *  }
             *  Lista_hijos = Siguiente_nivel_hijos;
             *  nivel++;
             * } while (Siguiente_nivel_hijos.Count > 0);
             *
             *
             * //Movimiento(Planeta origen, Planeta destino)
             * Movimiento mover = new Movimiento(nodoIA.getDatoRaiz(), nodoPadreIA.getDatoRaiz());
             * return mover; */
        }
예제 #14
0
        int mov = 0; // cant de movimientos sin vencer al  destino

        public String Consulta1(ArbolGeneral <Planeta> arbol)
        {
            int            d    = 0;
            List <Planeta> cami = new List <Planeta>();

            CaminoPreOrden(arbol, cami);
            d = cami.Count - 2;



            // calcular y retornar un texto con distancia entre raiz y nodo del bot
            return("la distancia entre la raiz y del bot es de : " + d);
        }
예제 #15
0
        public Movimiento OpcionMover2ARaiz(ArbolGeneral <Planeta> arbol)
        {
            ArbolGeneral <Planeta> raiz = arbol;
            //suponemos que estan en la raiz cosa que al iniciar el do while va a cambiar
            ArbolGeneral <Planeta> nodoIA      = raiz;
            ArbolGeneral <Planeta> nodoUsuario = raiz;
            ArbolGeneral <Planeta> nodoPadreIA = raiz;

            int nivel = 1;
            List <ArbolGeneral <Planeta> > Lista_hijos = new List <ArbolGeneral <Planeta> >();

            Lista_hijos.Add(arbol);
            //arbol.getHijos();
            List <ArbolGeneral <Planeta> > Siguiente_nivel_hijos;

            do
            {
                ArbolGeneral <Planeta> nodopadre;
                //lista vacia que tendra los nodos por nivel
                Siguiente_nivel_hijos = new List <ArbolGeneral <Planeta> >();

                foreach (ArbolGeneral <Planeta> Obtener_hijo in Lista_hijos)
                {
                    nodopadre = Obtener_hijo;

                    //obtengo los hijos del nodo obtener hijos y lo agrego a la lista de nodos que tiene siguiente nivel
                    foreach (ArbolGeneral <Planeta> hijo in Obtener_hijo.getHijos())
                    {
                        if (hijo.getDatoRaiz().EsPlanetaDeLaIA())
                        {
                            nodoIA      = hijo;
                            nodoPadreIA = nodopadre;
                            break;
                        }
                        if (hijo.getDatoRaiz().EsPlanetaDelJugador())
                        {
                            nodoUsuario = hijo;
                        }
                        Siguiente_nivel_hijos.Add(hijo);
                    }
                }
                Lista_hijos = Siguiente_nivel_hijos;
                nivel++;
            } while (Siguiente_nivel_hijos.Count > 0);


            //Movimiento(Planeta origen, Planeta destino)
            Movimiento mover = new Movimiento(nodoIA.getDatoRaiz(), nodoPadreIA.getDatoRaiz());

            return(mover);
        }
예제 #16
0
        public String Consulta3(ArbolGeneral <Planeta> arbol)
        {
            Cola <ArbolGeneral <Planeta> > c = new Cola <ArbolGeneral <Planeta> >();

            ArbolGeneral <Planeta> arbolaux;

            c.encolar(arbol);

            c.encolar(null);

            int    contarPlanetas             = 0;
            int    nivel                      = 0;
            int    sumarPoblacion             = 0;
            float  promedioPorNivel           = 0;
            string consultaPromedioDePlanetas = "";
            string consulta3                  = "CONSULTA 3:" + "\n";

            while (!c.esVacia())
            {
                arbolaux = c.desencolar();

                if (arbolaux != null)
                {
                    if (arbolaux.getDatoRaiz().Poblacion() > 0)
                    {
                        contarPlanetas++;
                        sumarPoblacion   = sumarPoblacion + arbolaux.getDatoRaiz().Poblacion();
                        promedioPorNivel = sumarPoblacion / contarPlanetas;
                    }
                    foreach (var hijo in arbolaux.getHijos())
                    {
                        c.encolar(hijo);
                    }
                }
                else
                {
                    consultaPromedioDePlanetas += "El promedio poblacional en el nivel " + nivel + " es: " + promedioPorNivel + "\n";
                    contarPlanetas              = 0;
                    nivel++;
                    promedioPorNivel = 0;
                    sumarPoblacion   = 0;
                    if (!c.esVacia())
                    {
                        c.encolar(null);
                    }
                }
            }
            return(consulta3 + consultaPromedioDePlanetas);
        }
예제 #17
0
        public String Consulta2(ArbolGeneral <Planeta> arbol)
        {
            Cola <ArbolGeneral <Planeta> > c = new Cola <ArbolGeneral <Planeta> >();
            uint nivel1 = 0;
            uint nivel2 = 0;
            uint nivel3 = 0;
            uint nivel4 = 0;

            c.encolar(arbol);
            while (!c.esVacia())
            {
                arbol = c.desencolar();
                int conta = arbol.nivel(arbol.getDatoRaiz());
                if (arbol.getDatoRaiz().population > 10)
                {
                    if (conta == 1)
                    {
                        nivel1++;
                    }
                    else if (conta == 2)
                    {
                        nivel2++;
                    }
                    else if (conta == 3)
                    {
                        nivel3++;
                    }
                    else
                    {
                        nivel4++;
                    }
                }
                foreach (var hijo in arbol.getHijos())
                {
                    c.encolar(hijo);
                }
            }



            //calcular cantidad de planetas con población > 10 en cada nivel del arbol (recorrido por niveles,con limitante de población)

            return($"\r\nCantidad de planetas con poblacion mayor a 10 segun nivel:\r\n" +
                   $"nivel 1: {nivel1}\r\n" +
                   $"nivel 2: {nivel2}\r\n" +
                   $"nivel 3: {nivel3}\r\n" +
                   $"nivel 4: {nivel4}\r\n");
        }
예제 #18
0
        public String Consulta2(ArbolGeneral <Planeta> arbol)
        {
            Cola <ArbolGeneral <Planeta> > c = new Cola <ArbolGeneral <Planeta> >();

            ArbolGeneral <Planeta> arbolaux;

            c.encolar(arbol);

            c.encolar(null);

            int contarPlanetas = 0;

            int nivel = 0;

            string consultaDePlanetas = "";

            string consulta2 = "CONSULTA 2:" + "\n";

            while (!c.esVacia())
            {
                arbolaux = c.desencolar();

                if (arbolaux != null)
                {
                    if (arbolaux.getDatoRaiz().Poblacion() > 10)
                    {
                        contarPlanetas++;
                    }
                    foreach (var hijo in arbolaux.getHijos())
                    {
                        c.encolar(hijo);
                    }
                }
                else
                {
                    consultaDePlanetas += "La cant de planetas con poblacion mayor a 10 en el nivel " + nivel + " es: " + contarPlanetas + "\n";
                    contarPlanetas      = 0;
                    nivel++;
                    if (!c.esVacia())
                    {
                        c.encolar(null);
                    }
                }
            }
            return(consulta2 + consultaDePlanetas);
        }
예제 #19
0
        public String Consulta2(ArbolGeneral <Planeta> arbol)
        {
            /*Calcula y retorna en un texto la cantidad de planetas que tienen
             * población mayor a 10 en cada nivel del árbol que es enviado como parámetro*/

            string texto = "";
            int    cant_nodoNivel;
            int    cant_PlanetaMayorA10;
            int    nivel = 1;
            List <ArbolGeneral <Planeta> > Lista_hijos = arbol.getHijos();
            List <ArbolGeneral <Planeta> > Siguiente_nivel_hijos;

            do
            {
                cant_nodoNivel       = Lista_hijos.Count;
                cant_PlanetaMayorA10 = 0;
                //lista vacia que tendra los nodos por nivel
                Siguiente_nivel_hijos = new List <ArbolGeneral <Planeta> >();
                foreach (ArbolGeneral <Planeta> Obtener_hijo in Lista_hijos)
                {
                    if (Obtener_hijo.getDatoRaiz().Poblacion() > 10)
                    {
                        cant_PlanetaMayorA10++;
                    }
                    //obtengo los nodos hijos del nodo obtener_hijos y lo agrego a la lista de nodos que tiene siguiente nivel
                    foreach (ArbolGeneral <Planeta> hijo in Obtener_hijo.getHijos())
                    {
                        Siguiente_nivel_hijos.Add(hijo);
                    }
                }

                //texto += "\nEl nivel " + nivel + " tiene : " + cant_PlanetaMayorA10 + " nodos con una población mayor a 10\n";
                texto += "El nivel " + nivel + " tiene : " + cant_PlanetaMayorA10 + " nodos con una población mayor a 10\n";


                Lista_hijos = Siguiente_nivel_hijos;
                nivel++;
            } while (Siguiente_nivel_hijos.Count > 0);



            return(texto + "\n");
        }
예제 #20
0
        public Movimiento CalcularMovimiento(ArbolGeneral <Planeta> arbol)
        {
            List <Planeta> cami = new List <Planeta>();

            CaminoPreOrden(arbol, cami);
            int Cant = cami.Count;

            if (Cant > 1)
            {
                Movimiento T = new Movimiento(cami[Cant - 1], cami[Cant - 2]);
                return(T);
            }


            CaminoJugador(arbol, cami);
            List <Planeta> jugador = CaminoJugador(arbol, cami);
            Movimiento     kill    = new Movimiento(cami[x], jugador[y]);

            if (x < 3 && cami[x].Poblacion() / 2 > jugador[y].Poblacion() || jugador[y].EsPlanetaDeLaIA())
            // si origen es menor a tres y la mitad de la poblacion de origen es menor que la poblacion del destino (osea no lo va vencer) o que el destino sea planeta de la ia

            {
                // sube uno de origen y uno de destino, y se resetea el contador mov
                x++;
                y++;
                mov = 0;
            }
            //se incrementa mov en 1 si lo de arriba  si no se cumple
            else
            {
                mov++;
            }
            // si el contador mov llega a 2 (Se hicieron 2 movimientos sin poder capturar el planeta) se resetea el origen y el destino para llamar más naves desde root para capturar
            if (mov == 2)
            {
                x = 0;
                y = 1;
            }

            return(kill);
        }
예제 #21
0
 //El metodo caminoRaizPlayer consigue un camino desde la raiz al primer planeta del bot
 private List <Planeta> caminoRaizPlayer(ArbolGeneral <Planeta> arbol, List <Planeta> camino)
 {
     camino.Add(arbol.getDatoRaiz()); //Agrego el planeta al camino
     if (arbol.getDatoRaiz().EsPlanetaDelJugador())
     {                                //Si encuentro el planeta del jugdor  retorno el camino
         return(camino);
     }
     else
     {
         foreach (ArbolGeneral <Planeta> hijo in arbol.getHijos())
         {
             List <Planeta> caminoAux = this.caminoRaizPlayer(hijo, camino);
             if (caminoAux != null)                     //Si esta condicion es verdadera significa que el metodo encontro el planeta del jugador
             {
                 return(caminoAux);
             }
             camino.RemoveAt(camino.Count - 1);                    //En caso de llegar a un camino equivocado elimino el ultimo elemento
         }
     }
     return(null);
 }
예제 #22
0
        public String Consulta1(ArbolGeneral <Planeta> arbol)
        {
            Cola <ArbolGeneral <Planeta> > c = new Cola <ArbolGeneral <Planeta> >();

            ArbolGeneral <Planeta> arbolaux;

            c.encolar(arbol);

            c.encolar(null);

            int distancia = 0;

            while (!c.esVacia())
            {
                arbolaux = c.desencolar();


                if (arbolaux != null)
                {
                    if (arbolaux.getDatoRaiz().EsPlanetaDeLaIA())
                    {
                        return("CONSULTA 1:" + "\n" + "La distancia de la raiz al planeta mas cercano de la IA es " + distancia);
                    }
                    else
                    {
                        foreach (var hijo in arbolaux.getHijos())
                        {
                            c.encolar(hijo);
                        }
                    }
                }
                else
                {
                    distancia++;
                    c.encolar(null);
                }
            }
            return("No se encontro ningun planeta");
        }
예제 #23
0
        public List <Planeta> CaminoIAaRaiz(ArbolGeneral <Planeta> arbol, List <Planeta> caminoDeLaIA)
        {
            caminoDeLaIA.Add(arbol.getDatoRaiz());

            if (arbol.getDatoRaiz().EsPlanetaDeLaIA())
            {
                return(caminoDeLaIA);
            }
            else
            {
                foreach (var hijo in arbol.getHijos())
                {
                    List <Planeta> caminoAux = CaminoIAaRaiz(hijo, caminoDeLaIA);
                    if (caminoAux != null)
                    {
                        return(caminoAux);
                    }
                }
                caminoDeLaIA.RemoveAt(caminoDeLaIA.Count() - 1);
            }
            return(null);
        }
예제 #24
0
        public String Consulta3(ArbolGeneral <Planeta> arbol)
        {
            /*Calcula y retorna en un texto el promedio poblacional por nivel del árbol que es enviado como parámetro. */
            string texto = "\n";
            int    cant_nodoNivel;
            int    cant_Poblacion;
            int    nivel = 1;
            List <ArbolGeneral <Planeta> > Lista_hijos = arbol.getHijos();
            List <ArbolGeneral <Planeta> > Siguiente_nivel_hijos;

            do
            {
                cant_nodoNivel = Lista_hijos.Count;
                cant_Poblacion = 0;
                //lista vacia que tendra los nodos por nivel
                Siguiente_nivel_hijos = new List <ArbolGeneral <Planeta> >();
                foreach (ArbolGeneral <Planeta> Obtener_hijo in Lista_hijos)
                {
                    cant_Poblacion += Obtener_hijo.getDatoRaiz().Poblacion();
                    //obtengo los hijos del nodo obtener hijos y lo agrego a la lista de nodos que tiene siguiente nivel
                    foreach (ArbolGeneral <Planeta> hijo in Obtener_hijo.getHijos())
                    {
                        Siguiente_nivel_hijos.Add(hijo);
                    }
                }
                int promedio = 0;
                if (cant_nodoNivel > 0)
                {
                    promedio = (cant_Poblacion / cant_nodoNivel);
                }
                texto += "\nEl nivel " + nivel + " tiene en promedio poblicional : " + promedio; //+ "\n";
                texto += "\ncant. nodo " + cant_nodoNivel + " cant. poblacion total " + cant_Poblacion + "\n";

                Lista_hijos = Siguiente_nivel_hijos;
                nivel++;
            } while (Siguiente_nivel_hijos.Count > 0);

            return(texto);
        }
예제 #25
0
        public List <Planeta> CaminoRaizAHumano(ArbolGeneral <Planeta> arbol, List <Planeta> caminoDeRaizAHumano)
        {
            caminoDeRaizAHumano.Add(arbol.getDatoRaiz());

            if (arbol.getDatoRaiz().EsPlanetaDelJugador())
            {
                return(caminoDeRaizAHumano);
            }
            else
            {
                foreach (var hijo in arbol.getHijos())
                {
                    List <Planeta> caminoAux = CaminoRaizAHumano(hijo, caminoDeRaizAHumano);
                    if (caminoAux != null)
                    {
                        return(caminoAux);
                    }
                }

                caminoDeRaizAHumano.RemoveAt(caminoDeRaizAHumano.Count() - 1);
            }
            return(null);
        }
예제 #26
0
 public List <Planeta> CaminoJugador(ArbolGeneral <Planeta> arbol, List <Planeta> camino)
 {
     // Primero raiz
     camino.Add(arbol.getDatoRaiz());
     // si encontramos camino
     if (arbol.getDatoRaiz().EsPlanetaDelJugador())
     {
         return(camino);
     }
     else
     {
         foreach (var hijo in arbol.getHijos())
         {
             List <Planeta> CaminoKill = CaminoJugador(hijo, camino);
             if (CaminoKill != null)
             {
                 return(CaminoKill);
             }
             camino.Remove(hijo.getDatoRaiz());
         }
     }
     return(null);
 }
예제 #27
0
        public Movimiento enviarMovimiento(ArbolGeneral <Planeta> arbol)
        {
            List <ArbolGeneral <Planeta> > ListaPreorden       = arbol.ListaPreOrden();
            List <ArbolGeneral <Planeta> > ListaDeNodosIA      = new List <ArbolGeneral <Planeta> >();
            List <ArbolGeneral <Planeta> > ListaDeNodosUsuario = new List <ArbolGeneral <Planeta> >();

            foreach (ArbolGeneral <Planeta> nodo in ListaPreorden)
            {
                if (nodo.getDatoRaiz().EsPlanetaDeLaIA())
                {
                    ListaDeNodosIA.Add(nodo);
                }
                if (nodo.getDatoRaiz().EsPlanetaDelJugador())
                {
                    ListaDeNodosUsuario.Add(nodo);
                }
            }

            int menordistancia = -20;
            ArbolGeneral <Planeta> nodoIAaMover = arbol;

            foreach (ArbolGeneral <Planeta> nodoU in ListaDeNodosUsuario)
            {
                foreach (ArbolGeneral <Planeta> nodoIA in ListaDeNodosUsuario)
                {
                    int distancia = Distancia_Nodo(arbol, nodoIA, nodoU);
                    if (Math.Abs(distancia) < menordistancia)
                    {
                        nodoIAaMover = nodoIA;
                    }
                }
            }

            Movimiento mover = obtengoCamino(arbol, nodoIAaMover, menordistancia);

            return(mover);
        }
예제 #28
0
        public ArrayList preordenCaminoJugador(ArrayList lista, ArbolGeneral <Planeta> arbol)
        {
            Planeta planeta = arbol.getDatoRaiz();

            lista.Add(planeta);
            if (planeta.EsPlanetaDelJugador())
            {
                return(lista);
            }
            else
            {
                foreach (ArbolGeneral <Planeta> i in arbol.getHijos())
                {
                    ArrayList lista2 = preordenCaminoJugador(lista, i);
                    if (lista2 != null)
                    {
                        return(lista2);
                    }
                    lista.RemoveAt(lista.Count - 1);
                }
            }

            return(null);
        }
예제 #29
0
        public Movimiento obtengoCamino(ArbolGeneral <Planeta> arbol, ArbolGeneral <Planeta> ia, int sentido)
        {
            List <ArbolGeneral <Planeta> > ListaPreorden = arbol.ListaPreOrden();
            Movimiento mover = null;
            Planeta    origen;
            Planeta    destino;
            int        posicioIA = -1;

            for (int y = 0; y < ListaPreorden.Count; y++)
            {
                if (ListaPreorden[y].Equals(ia))
                {
                    posicioIA = y;
                }
            }
            if (sentido == -20)
            {//ir a raiz
                //Es hijo de la raiz
                if (posicioIA - 1 % 3 == 0 || posicioIA == 1)
                {
                    //si posicion-1 es divisible por 3 se que es uno de los nodos hijos de la raiz
                    origen  = ListaPreorden[posicioIA].getDatoRaiz();
                    destino = ListaPreorden[0].getDatoRaiz();
                    mover   = new Movimiento(origen, destino);
                }
                else
                {
                    //no es hijo de la raiz
                    origen  = ListaPreorden[posicioIA].getDatoRaiz();
                    destino = ListaPreorden[posicioIA - 1].getDatoRaiz();

                    mover = new Movimiento(origen, destino);
                    mover = OpcionMover2ARaiz(arbol);
                }
            }
            else if (sentido > 0)
            {
                //me muevo para arriba
                if (posicioIA - 1 % 3 == 0 || posicioIA == 1)
                {
                    //si posicion-1 es divisible por 3 se que es uno de los nodos hijos de la raiz
                    origen  = ListaPreorden[posicioIA].getDatoRaiz();
                    destino = ListaPreorden[0].getDatoRaiz();
                    mover   = new Movimiento(origen, destino);
                }
                else
                {
                    //no es hijo de la raiz
                    origen  = ListaPreorden[posicioIA].getDatoRaiz();
                    destino = ListaPreorden[posicioIA - 1].getDatoRaiz();
                    mover   = new Movimiento(origen, destino);
                }
            }
            else
            {
                //me muevo para abajo
                if (posicioIA - 1 % 3 == 0 || posicioIA == 1)
                {
                    //si posicion-1 es divisible por 3 se que es uno de los nodos hijos de la raiz
                    origen  = ListaPreorden[posicioIA].getDatoRaiz();
                    destino = ListaPreorden[posicioIA + 3].getDatoRaiz();
                    mover   = new Movimiento(origen, destino);
                }
                else
                {
                    //no es hijo de la raiz
                    origen  = ListaPreorden[posicioIA].getDatoRaiz();
                    destino = ListaPreorden[posicioIA + 1].getDatoRaiz();
                    mover   = new Movimiento(origen, destino);
                }
            }



            return(mover);
        }
예제 #30
0
        public int Distancia_Nodo(ArbolGeneral <Planeta> arbol, ArbolGeneral <Planeta> ia, ArbolGeneral <Planeta> Usuario)
        {
            int nivel             = 0;
            int nivelIA           = -1;
            int nivelUsuario      = -1;
            int horizontal        = 0;
            int horizontalIA      = -1;
            int horizontalUsuario = -1;
            ArbolGeneral <Planeta>         raiz        = arbol;
            ArbolGeneral <Planeta>         nodoIA      = ia;
            ArbolGeneral <Planeta>         nodoUsuario = Usuario;
            List <ArbolGeneral <Planeta> > Lista_hijos = new List <ArbolGeneral <Planeta> >();

            Lista_hijos.Add(arbol);
            List <ArbolGeneral <Planeta> > Siguiente_nivel_hijos;

            do
            {
                //lista vacia que tendra los nodos por nivel
                Siguiente_nivel_hijos = new List <ArbolGeneral <Planeta> >();

                foreach (ArbolGeneral <Planeta> Obtener_hijo in Lista_hijos)
                {   //cuando encuentro un nodo que es ia retorno el nivel
                    horizontal = 0;
                    //obtengo los hijos del nodo obtener hijos y lo agrego a la lista de nodos que tiene siguiente nivel
                    foreach (ArbolGeneral <Planeta> hijo in Obtener_hijo.getHijos())
                    {
                        Siguiente_nivel_hijos.Add(hijo);
                        horizontal++;
                        //if (hijo.getDatoRaiz().EsPlanetaDeLaIA())
                        if (hijo.getDatoRaiz().Equals(nodoIA))
                        {
                            // nodoIA = hijo;
                            nivelIA      = nivel;
                            horizontalIA = horizontal;
                        }
                        //if (hijo.getDatoRaiz().EsPlanetaDelJugador())
                        if (hijo.getDatoRaiz().Equals(nodoUsuario))
                        {
                            //nodoUsuario = hijo;
                            nivelUsuario      = nivel;
                            horizontalUsuario = horizontal;
                        }
                        Siguiente_nivel_hijos.Add(hijo);
                    }
                }
                Lista_hijos = Siguiente_nivel_hijos;
                nivel++;
            } while (Siguiente_nivel_hijos.Count > 0);

            int restahorizontal   = horizontalUsuario - horizontalIA;
            int diferenciaDenivel = -20;

            if (restahorizontal == 0)
            {
                diferenciaDenivel = nivelIA - nivelUsuario;
            }


            //si es -20 significa que estan en otro camino de nodo
            // si me da un numero positivo usuario esta arriba si me da negativo usuario esta abajo de

            return(diferenciaDenivel);
        }