public BusquedaAestrella(Bloque mapa, int profundidad)
 {
     this.mapa        = mapa;
     this.profundidad = (profundidad * 2) + 1;
     foreach (var item in mapa.sector)
     {
         if (item.name.Equals("player"))
         {
             posFinal = item.posicion;
         }
     }
     posInicial = mapa.obtenerSector(new Vector2(profundidad, profundidad)).posicion;
 }
        // --- disminuye el area de hxh a 3x3
        private Bloque disminuirArea(int escala)
        {
            //Vector2 centro = new Vector2(profundidad, profundidad); // centro del area
            //Bloque Out = new Bloque();
            Sector swap = new Sector();
            // crea un bloque de dimension hxh vacio
            Bloque In = new Bloque(escala);
            // asigna el area en un bloque para manipular
            Bloque Inter = this.area;
            // asigna los valores del Area actual al bloque
            int h          = (escala * 2) + 1;
            int cuadrarX   = escala;
            int cuadrarY   = escala;
            int progresion = 0;

            for (int j = 0; j < h; j++)     // para Y
            {
                for (int k = 0; k < h; k++) // para X
                {
                    swap = Inter.obtenerSector(new Vector2(profundidad - cuadrarX, profundidad - cuadrarY));
                    In.sector[progresion].name     = swap.name;
                    In.sector[progresion].value    = swap.value;
                    In.sector[progresion].posicion = new Vector2(k, j);
                    progresion++;
                    cuadrarX--;
                    //Debug.Print();
                    //Debug.Write("[" + swap.name + "]");
                }
                cuadrarX = escala;
                cuadrarY--;
                //Debug.WriteLine("");
            }
            //Debug.WriteLine("");

            return(In);
        }
        public List <Vector2> encontrarCamino()
        {
            Sector sectorInicial = mapa.obtenerSector(posInicial);
            Sector sectorFinal   = mapa.obtenerSector(posFinal);

            if (sectorInicial.name.Equals("wall") || sectorFinal.name.Equals("wall"))
            {
                return(null);
            }

            listaAbierta.Clear();
            listaCerrada.Clear();

            Nodo nodoInicial;
            Nodo nodoFinal;

            nodoFinal   = new Nodo(null, null, posFinal, 0);
            nodoInicial = new Nodo(null, nodoFinal, posInicial, 0);

            // se adiciona el nodo inicial
            adicionarNodoAListaAbierta(nodoInicial);
            while (listaAbierta.Count > 0)
            {
                Nodo nodoActual = listaAbierta[listaAbierta.Count - 1];
                // si es el nodo Final
                if (nodoActual.esIgual(nodoFinal))
                {
                    List <Vector2> mejorCamino = new List <Vector2>();
                    while (nodoActual != null)
                    {
                        mejorCamino.Insert(0, nodoActual.Posicion);
                        nodoActual = nodoActual.NodoPadre;
                    }
                    return(mejorCamino);
                }
                listaAbierta.Remove(nodoActual);

                foreach (Nodo posibleNodo in encontrarNodosAdyacentes(nodoActual, nodoFinal))
                {
                    // si el nodo no se encuentra en la lista cerrada
                    if (!listaCerrada.Contains(posibleNodo.Posicion))
                    {
                        // si ya se encuentra en la lista abierta
                        if (listaAbierta.Contains(posibleNodo))
                        {
                            if (posibleNodo.costoG >= posibleNodo.costoTotal)
                            {
                                continue;
                            }
                        }
                        adicionarNodoAListaAbierta(posibleNodo);
                    }
                }
                // se cierra el nodo actual
                listaCerrada.Add(nodoActual.Posicion);
            }
            return(null);
        }
        // --- funcion que calcula el camino que debe seguir el agente, retorna solo el siguiente movimiento.
        public String CaminoActualizado(Bloque area)
        {
            BusquedaAestrella cOp    = new BusquedaAestrella(area, profundidad); // instancia el algoritmo A*
            Vector2           final  = cOp.getPosicionPlayer;                    // obtiene la posicion del player
            Vector2           inicio = cOp.getPosicionAgent;                     // obtiene la posicion del agente (posicion inicial)
            String            Accion = "nada";
            Vector2           sucesion;                                          // item: posicion a alcansar

            if ((final != posPlayer) || (inicio != posAgent))                    // si la posicion del jugador cambia
            {
                camino   = cOp.encontrarCamino();
                sucesion = camino[1];
            }
            else
            {
                sucesion = camino[1];
            }

            //Debug.WriteLine(item + " - " + reff);
            //derecha
            if ((sucesion.X == inicio.X + 1) && (sucesion.Y == inicio.Y))
            {
                Accion = "avanzarDer";
            }
            //izquierda
            if ((sucesion.X == inicio.X - 1) && (sucesion.Y == inicio.Y))
            {
                Accion = "avanzarIzq";
            }
            //arriba
            if ((sucesion.X == inicio.X) && (sucesion.Y == inicio.Y - 1))
            {
                Accion = "saltar";
            }
            //abajo
            if ((sucesion.X == inicio.X) && (sucesion.Y == inicio.Y + 1))
            {
                // por definir
            }
            //derecha-arriba
            if ((sucesion.X == inicio.X + 1) && (sucesion.Y == inicio.Y - 1))
            {
                if ((area.obtenerSector(new Vector2(inicio.X + 1, inicio.Y)).value == true))
                {
                    Accion = "saltarDer";
                }
                else
                {
                    Accion = "avanzarDer";
                }
            }
            //derecha-abajo
            if ((sucesion.X == inicio.X + 1) && (sucesion.Y == inicio.Y + 1))
            {
                Accion = "avanzarDer";
            }
            //izquierda-arriba
            if ((sucesion.X == inicio.X - 1) && (sucesion.Y == inicio.Y - 1))
            {
                if ((area.obtenerSector(new Vector2(inicio.X - 1, inicio.Y)).value == true))
                {
                    Accion = "saltarIzq";
                }
                else
                {
                    Accion = "avanzarIzq";
                }
            }
            //izquierda abajo
            if ((sucesion.X == inicio.X - 1) && (sucesion.Y == inicio.Y + 1))
            {
                Accion = "avanzarIzq";
            }
            //reff = item;
            // asigna los valores de las posiciones al agente y al player
            posPlayer = final;
            posAgent  = inicio;

            return(Accion);
        }