public void countTest()
    {
        Cerrados cerrados = new Cerrados();

        Assert.IsTrue(cerrados.count() == 0, "11) No es correcto, es " + cerrados.count() + " y debia ser " + 0);

        Nodo nodo1 = new Nodo();

        nodo1.vector = new Vector3(1.0f, 0.0f, 0.0f);
        nodo1.coste  = 10.0f;
        Nodo nodo2 = new Nodo();

        nodo2.vector = new Vector3(2.0f, 0.0f, 0.0f);
        nodo2.coste  = 1.0f;

        cerrados.add(nodo1);
        cerrados.add(nodo2);

        Assert.IsTrue(cerrados.count() == 2, "12) No es correcto, es " + cerrados.count() + " y debia ser " + 2);

        cerrados.delete(nodo2);

        Assert.IsTrue(cerrados.count() == 1, "13) No es correcto, es " + cerrados.count() + " y debia ser " + 1);

        cerrados.delete(nodo1);
        Assert.IsTrue(cerrados.count() == 0, "14) No es correcto, es " + cerrados.count() + " y debia ser " + 0);
    }
    public void comprobarTest()
    {
        Cerrados cerrados = new Cerrados();

        Nodo nodo = new Nodo();

        nodo.vector = new Vector3(1.0f, 0.0f, 0.0f);
        nodo.coste  = 1.0f;

        cerrados.add(nodo);

        bool comprobar = cerrados.comprobar(nodo);

        Assert.IsTrue(comprobar, "2) No esta el nodo que introducimos");
    }
    public void dibujarTodas(Abiertos abiertos, Cerrados cerrados)
    {
        SortedDictionary <Vector3, Nodo> .Enumerator enu_cerrados = cerrados.GetEnumerator();

        borrarTodasCasillas();

        while (enu_cerrados.MoveNext())
        {
            crearCasilla(enu_cerrados.Current.Value.vector, Constantes._CERRADOS);
        }

        foreach (Nodo n in abiertos)
        {
            crearCasilla(n.vector, Constantes._ABIERTOS);
        }
    }
    public void addNodoTest()
    {
        Cerrados cerrados = new Cerrados();
        Nodo     nodo_comprobar;
        bool     comprobar;

        Nodo nodo = new Nodo();

        nodo.vector = new Vector3(1.0f, 0.0f, 0.0f);
        nodo.coste  = 1.0f;

        cerrados.add(nodo);

        comprobar = cerrados.find(nodo, out nodo_comprobar);
        Assert.IsTrue(comprobar && nodo_comprobar.coste == nodo.coste && nodo_comprobar.vector == nodo.vector, "1) No es el mismo nodo que introducimos");
    }
    public override void iniciarCalcularRuta(Vector3 v_inicio, Vector3 v_meta, float v_angulo_coche, ObtenerMapa v_mapa, Parrilla v_parrilla, float p_peso, int tam_parrilla, int ancho, int largo, bool v_dibujar_casillas)
    {
        Vector3[] array_vertices;

        dibujar_casillas = v_dibujar_casillas;

        //cerrados = new Cerrados (ancho, largo);
        cerrados  = new Cerrados();
        sucesores = new List <Nodo> ();
        abiertos  = new Abiertos(tam_parrilla, ancho, largo);
        //abiertos = new Abiertos (tam_parrilla);

        peso = p_peso;

        abiertos.getEmpty();
        cerrados.getEmpty();

        vector_inicio = v_inicio;
        vector_meta   = v_meta;
        mapa          = v_mapa;
        parrilla      = v_parrilla;

        vertices       = new HashSet <Vector3> ();
        array_vertices = mapa.getVertices();

        foreach (Vector3 vertice in array_vertices)
        {
            vertices.Add(vertice);
        }

        vertices.Add(vector_meta);


        meta_encontrada = false;

        nodo_final         = null;
        nodo_actual        = null;
        nodo_inicio        = new Nodo();
        nodo_inicio.vector = vector_inicio;
        nodo_inicio.padre  = null;
        nodo_inicio.coste  = 0;

        abiertos.add(nodo_inicio);
    }
    public void deleteTest()
    {
        Cerrados cerrados = new Cerrados();
        bool     comprobar;

        Nodo nodo = new Nodo();

        nodo.vector = new Vector3(1.0f, 0.0f, 0.0f);
        nodo.coste  = 1.0f;

        cerrados.add(nodo);
        comprobar = cerrados.comprobar(nodo);
        Assert.IsTrue(comprobar, "3) No esta el nodo que introducimos");

        comprobar = cerrados.delete(nodo);
        Assert.IsTrue(comprobar, "4) Se ha borrado el nodo");

        comprobar = cerrados.comprobar(nodo);
        Assert.IsFalse(comprobar, "5) No se ha borrado");
    }
    public void getEmptyTest()
    {
        Cerrados cerrados = new Cerrados();

        Nodo nodo1 = new Nodo();

        nodo1.vector = new Vector3(1.0f, 0.0f, 0.0f);
        nodo1.coste  = 10.0f;
        Nodo nodo2 = new Nodo();

        nodo2.vector = new Vector3(2.0f, 0.0f, 0.0f);
        nodo2.coste  = 5.0f;

        cerrados.add(nodo1);
        cerrados.add(nodo2);

        cerrados.getEmpty();

        Assert.IsTrue(cerrados.count() == 0, "16) No esta vacio");
    }
    public void findNodoTest()
    {
        Cerrados cerrados = new Cerrados();
        bool     comprobar;
        Nodo     comprobar_nodo;

        Nodo nodo = new Nodo();

        nodo.vector = new Vector3(1.0f, 0.0f, 0.0f);
        nodo.coste  = 1.0f;

        cerrados.add(nodo);

        comprobar = cerrados.find(nodo, out comprobar_nodo);
        Assert.IsTrue(comprobar_nodo.coste == nodo.coste && comprobar_nodo.vector == nodo.vector, "6) No es el mismo nodo que introducimos");
        Assert.IsTrue(comprobar, "7) No se ha encontrado el nodo que introducimos");

        cerrados.delete(nodo);

        comprobar = cerrados.find(nodo, out comprobar_nodo);
        Assert.IsNull(comprobar_nodo, "8) No tenia que haber encontrado el nodo");
        Assert.IsFalse(comprobar, "9) No tenia que haber encontrado el nodo");
    }
示例#9
0
    IEnumerator Rutina(float delay)
    {
        EnUso = true;
        if (!PrimeraVuelta)
        {
            // Evaluar movimientos
            EvaluaMovimiento();

            // Obtener los posibles movimientos
            PosiblesMovimientos = SeleccionaMovimiento(Fantasmas);

            // Medir la distancia en todos los posibles movimientos
            //      Obtener las coordenadas de los posibles movimientos
            MapGenerator.Coordenada[] coordenadas = Mapa.PuedeMoverseA(Posicion, PosiblesMovimientos);

            // Elegir el más cercano (greedy)
            int   j       = -1;
            float mejor   = -1;
            bool  enTunel = Mapa.Tunel.FindAll(p => p.x == Posicion.x && p.y == Posicion.y).Count > 0;
            if (enTunel)
            {
                if (Posicion.x > 16)
                {
                    j = 2;
                }
                else if (Posicion.x < 2)
                {
                    j = 0;
                }
            }

            int        dsegura = 0;
            List <int> PosiblesMovimientosLibres = new List <int>();
            bool       elegida = true;

            for (int i = 0; i < 4; i++)
            {
                dsegura = 0;
                try
                {
                    if (PosiblesMovimientos[i] &&
                        !Utility.IsInList(coordenadas[i], Cerrados))
                    {
                        //if (!enTunel)
                        //{
                        Vector3 c = new Vector3(coordenadas[i].x, this.transform.position.y, coordenadas[i].y);

                        foreach (FantasmaManager fantasma in Fantasmas)
                        {
                            try
                            {
                                float val = Utility.ManhattanDistance(c, fantasma.Posicion);

                                if (val <= distanciaSegura)
                                {
                                    if (val >= mejor)
                                    {
                                        mejor = val;
                                        PosiblesMovimientosLibres.Add(i);
                                        Debug.Log(System.String.Format("Nuevo mejor valor: {0}", val));
                                    }
                                }
                                else
                                {
                                    // Elegir posicion aleatoria
                                    dsegura++;
                                }
                            }
                            catch (NullReferenceException nre)
                            {
                                Debug.Log("Error al seleccionar movimiento.\n" + nre.Message);
                            }
                        }
                        // }
                        //else
                        //{
                        //    j = Posicion.x <= 2 ? 0 : 2;
                        //    if(Posicion.x <= 2)
                        //    break;
                        //}
                    }
                }
                catch (Exception) { }
            }

            // Obtiene movimiento aleatorio si es que la distancia segura
            // está activada
            if (dsegura >= Fantasmas.Count)
            {
                for (int i = 0; i < 4; i++)
                {
                    int randomValue = UnityEngine.Random.Range(0, 4);
                    if (PosiblesMovimientos[randomValue])
                    {
                        j       = randomValue;
                        elegida = false;
                        break;
                    }
                }
            }
            else
            {
                // Obtiene movimiento válido (totalmente filtrado) ALEATORIO.
                if (PosiblesMovimientosLibres.Count > 1)
                {
                    int randomIndex = UnityEngine.Random.Range(0, PosiblesMovimientosLibres.Count);
                    j = PosiblesMovimientosLibres[randomIndex];
                }
                else
                {
                    j = PosiblesMovimientosLibres[0];
                }
            }

            // Moverse al seleccinado
            //      Bloquear posición anterior
            Anterior = Posicion;
            Cerrados.Add(new MapGenerator.Coordenada((int)Posicion.x, (int)Posicion.y));
            MoverA(j);

            if (Cerrados.Count > 0)
            {
                Cerrados.Clear();
            }

            // Repetir
        }
        else if (Alcanzado)
        {
            Debug.Log("Alcanzado: " + Alcanzado);
            EnUso = false;
        }
        else
        {
            PrimeraVuelta = false;
            Alcanzado     = false;
            delay         = 0f;
        }

        yield return(new WaitForSeconds(delay));

        EnUso = false;
    }
示例#10
0
    public override void iniciarCalcularRuta(Vector3 v_inicio, Vector3 v_meta, float v_angulo_coche, ObtenerMapa v_mapa, Parrilla v_parrilla, float p_peso, int tam_parrilla, int v_ancho, int v_largo, bool v_dibujar_casillas)
    {
        Vector3[] array_vertices;

        dibujar_casillas = v_dibujar_casillas;

        ancho = v_ancho;
        largo = v_largo;

        //cerrados = new Cerrados (ancho, largo);
        cerrados  = new Cerrados();
        sucesores = new List <Nodo> ();
        abiertos  = new Abiertos(tam_parrilla, ancho, largo);
        //abiertos = new Abiertos (tam_parrilla);

        peso = p_peso;

        abiertos.getEmpty();
        cerrados.getEmpty();

        vector_inicio = v_inicio;
        vector_meta   = v_meta;
        mapa          = v_mapa;
        parrilla      = v_parrilla;

        vertices       = new HashSet <Vector3> ();
        array_vertices = mapa.getVertices();

        foreach (Vector3 vertice in array_vertices)
        {
            vertices.Add(vertice);
        }

        vertices.Add(vector_meta);


        meta_encontrada = false;

        nodo_final                = null;
        nodo_actual               = null;
        nodo_inicio               = new Nodo();
        nodo_inicio.vector        = vector_inicio;
        nodo_inicio.vector_hybrid = vector_inicio;
        nodo_inicio.angulo_hybrid = v_angulo_coche;
        nodo_inicio.padre         = null;
        nodo_inicio.coste         = 0;

        abiertos.add(nodo_inicio);



        mapa.setRadio(0.5f);          //

        array_mapa_obstaculos = new int[ancho + 1, largo + 1, 1];

        tiempo_inicio = Time.realtimeSinceStartup;
        crearMapaObstaculos();
        tiempo_final = Time.realtimeSinceStartup;

        Debug.Log("Mapa de obstaculos creado en: " + (tiempo_final - tiempo_inicio) + " segs.");


        tiempo_inicio         = Time.realtimeSinceStartup;
        array_mapa_distancias = crearMapaDistancias();
        tiempo_final          = Time.realtimeSinceStartup;

        Debug.Log("Mapa de Distancias creado en: " + (tiempo_final - tiempo_inicio) + " segs.");


        tiempo_inicio = Time.realtimeSinceStartup;
        array_heuristica_obstaculos = crearMapaHeuristicaObstaculos();
        tiempo_final = Time.realtimeSinceStartup;

        Debug.Log("Mapa de heuristica de obstaculos creado en: " + (tiempo_final - tiempo_inicio) + " segs.");

        radio_giro_rad = ((Constantes.distancia / Constantes.coche_largo) * Mathf.Tan(Mathf.Deg2Rad * Constantes.coche_max_angulo));
        radio_giro     = Mathf.Rad2Deg * radio_giro_rad;

        Debug.Log("Radio giro rad: " + radio_giro_rad);
        Debug.Log("Radio giro: " + radio_giro);
    }
示例#11
0
    IEnumerator Rutina(float delay)
    {
        EnUso = true;
        if (Objetivo != null)
        {
            if (!PrimeraVuelta)
            {
                // Evaluar movimientos
                EvaluaMovimiento();

                // Obtener los posibles movimientos
                PosiblesMovimientos = SeleccionaMovimiento(Companeros);

                // Medir la distancia en todos los posibles movimientos
                //      Obtener las coordenadas de los posibles movimientos
                MapGenerator.Coordenada[] coordenadas = Mapa.PuedeMoverseA(Posicion, PosiblesMovimientos);

                // Elegir el más cercano (greedy)
                float   mejor           = Mapa.mapSize.x * 2 + 1f;
                Vector3 mejorCoordenada = new Vector3(this.Posicion.x, this.transform.position.y, this.Posicion.y);

                int j = -1;

                for (int i = 0; i < 4; i++)
                {
                    try
                    {
                        if (PosiblesMovimientos[i] &&
                            !Utility.IsInList(coordenadas[i], Cerrados))
                        {
                            Vector3 c   = new Vector3(coordenadas[i].x, this.transform.position.y, coordenadas[i].y);
                            float   val = Utility.ManhattanDistance(c, Objetivo.Posicion);

                            if (val < mejor)
                            {
                                mejor           = val;
                                j               = i;
                                mejorCoordenada = c;
                                Debug.Log(System.String.Format("Nuevo mejor valor: {0}", val));
                            }

                            if (Mathf.Abs(val) <= 1f)
                            {
                                //Alcanzado = true;
                                // Objetivo.Alcanzado = true;
                                Objetivo.setAlcanzadoPor(1);
                                // Alcanzado = Objetivo.AlcanzadoPor >= 2 ? true : false;
                                break;
                            }
                            else
                            {
                                Objetivo.setAlcanzadoPor(-1);
                            }
                        }
                    }
                    catch (Exception) { }
                }

                // Moverse al seleccinado
                //      Bloquear posición anterior
                Anterior = Posicion;
                Cerrados.Add(new MapGenerator.Coordenada((int)Posicion.x, (int)Posicion.y));
                MoverA(j);

                if (Cerrados.Count >= BloqueoDePosiciones)
                {
                    Cerrados.RemoveAt(0);
                }

                // Repetir
            }
            else if (Alcanzado)
            {
                Debug.Log("Alcanzado: " + Alcanzado);
            }
            else
            {
                PrimeraVuelta = false;
                Cerrados      = new List <MapGenerator.Coordenada>();
                delay         = 0f;
            }

            yield return(new WaitForSeconds(delay));
        }
        EnUso = false;
    }