Exemple #1
0
    /// <summary>
    /// Este método busca el camino  más eficiente entre planetas teniendo en cuenta las restricciones de
    /// número de sondas y cantidad de materiales que puede cargar la nave.
    /// El método es llamado por un algoritmo voraz que busca el mejor nodo inicial
    /// </summary>
    /// <param name="inicial"></param> Este es el nodo donde actual que esta evaluando
    /// <param name="grafo"></param> El grafo no varia y es una lista de aristas
    /// <param name="costo"></param> Costo es una variable auxiliar para llevar la cuenta del costo que se tiene con las diferentes rutas
    /// <param name="camino"></param> El camino temporal más eficiente
    /// <param name="sondas"></param>El numero de sondas que se van gastando según los planetas visitados
    private void buscarCaminoPlanetas(Planeta inicial, List <AristaNodo> grafo, double[] costo, List <Planeta> camino, int sondas)
    {
        inicial.visitado = true;
        List <Planeta> adyacentes = buscarAdyacentes(inicial, grafo);

        camino.Add(inicial);
        double[] temporal = new double[4];
        temporal[0] = costo[0];
        temporal[1] = costo[1];
        temporal[2] = costo[2];
        temporal[3] = costo[3];
        int s = sondas;

        if (GastoSondas.valeLaPenaGastarSondas(inicial))
        {
            temporal[0] += inicial.iridio;
            temporal[1] += inicial.paladio;
            temporal[2] += inicial.platino;
            temporal[3] += inicial.elementoZero;

            ///Con
            temporal[0] = Mathf.Clamp((float)temporal[0], 0, Constantes.IRIDIO_MAX);
            temporal[1] = Mathf.Clamp((float)temporal[1], 0, Constantes.PALADIO_MAX);
            temporal[2] = Mathf.Clamp((float)temporal[2], 0, Constantes.PLATINO_MIN);
            temporal[3] = Mathf.Clamp((float)temporal[3], 0, Constantes.ELEMENTOZERO_MAX);

            s += 2;
        }

        foreach (var item in adyacentes)
        {
            if (!item.visitado)
            {
                buscarCaminoPlanetas(item, grafo, temporal, camino, s);
            }
        }



        if ((caminoGlobal.Count == 0 || camino.Count <= caminoGlobal.Count) && MejorCosto(temporal) && nave.sondas >= s)
        {
            ClonarCamino(camino);
            costoGlobal  = temporal;
            sondasGlobal = s;
        }

        inicial.visitado = false;
        camino.Remove(inicial);
    }
Exemple #2
0
    /// <summary>
    /// Calcula la relacion ganancia real que se puede obtener con un numero de sondas determinado teniendo en cuenta la gasolina que gasta
    /// SE SIMULA QUE SE ESTAN RESTANDO MATERIALES
    /// </summary>
    /// <param name="sistema"></param>
    /// <returns></returns>
    public double calcularRelacionGanancia(SistemaPlanetario inicio, double relacionGanancia, float distancia, ref int sondas, ref double[] materiales)
    {
        double iridio       = 0;
        double paladio      = 0;
        double platino      = 0;
        double elementoZero = 0;

        foreach (var item in inicio.recorrido.caminoGlobal)
        {
            if (sondas >= 2 && GastoSondas.valeLaPenaGastarSondas(item))
            {
                iridio       += item.iridio;
                paladio      += item.paladio;
                platino      += item.platino;
                elementoZero += item.elementoZero;

                //La nave quedo con los materiales del planeta
                materiales[0] += item.iridio;
                materiales[1] += item.paladio;
                materiales[2] += item.platino;
                materiales[3] += item.elementoZero;
                sondas        -= 2;

                ///El plantera quedó sin materiales
                item.iridio       = 0;
                item.paladio      = 0;
                item.platino      = 0;
                item.elementoZero = 0;


                ///Limita materiales
                materiales[0] = Mathf.Clamp((float)materiales[0], 0, Constantes.LIMITE_IRIDIO);
                materiales[1] = Mathf.Clamp((float)materiales[1], 0, Constantes.LIMITE_PALADIO);
                materiales[2] = Mathf.Clamp((float)materiales[2], 0, Constantes.LIMITE_PLATINO);
                materiales[3] = Mathf.Clamp((float)materiales[3], 0, Constantes.LIMITE_ELEMENTOZERO);
            }
        }

        iridio       = (iridio * Constantes.IRIDIO_VALOR - (Constantes.IRIDIO_VC * Constantes.IRIDIO_VALOR * (distancia / Constantes.GASTO_COMBUSTIBLE)));
        paladio      = (paladio * Constantes.PALADIO_VALOR - (Constantes.PALADIO_VC * Constantes.PALADIO_VALOR * (distancia / Constantes.GASTO_COMBUSTIBLE)));
        platino      = (platino * Constantes.PLATINO_VALOR - (Constantes.PLATINO_VC * Constantes.PLATINO_VALOR * (distancia / Constantes.GASTO_COMBUSTIBLE)));
        elementoZero = (elementoZero * Constantes.ELEMENTO_ZERO_VALOR - (Constantes.ELEMENTO_ZERO_VC * Constantes.ELEMENTO_ZERO_VALOR * (distancia / Constantes.GASTO_COMBUSTIBLE)));

        return((iridio + paladio + platino + elementoZero) + relacionGanancia);
    }
Exemple #3
0
    public IEnumerator sistemaDeNavegacion(List <SistemaPlanetario> MejorCamino)
    {
        transform.position = new Vector3(MejorCamino[0].x, 0, MejorCamino[0].z);

        lineaPaso.SetPosition(0, new Vector3(MejorCamino[0].x, 0.1f, MejorCamino[0].z));
        int i = 0;

        int               contadorFinal  = 0; //contador para saber si llego a
        Vector3           posInicial     = new Vector3(MejorCamino[0].x, 0, MejorCamino[0].x);
        SistemaPlanetario sistemaInicial = MejorCamino[0];

        foreach (var sistema in MejorCamino)
        {
            if (sistema == sistemaInicial && i != 0)
            {
                break;
            }


            float distancia = (posInicial - new Vector3(sistema.x, 0, sistema.z)).magnitude;
            posInicial = new Vector3(sistema.x, 0, sistema.z);
            if (combustible < (distancia / Constantes.GASTO_COMBUSTIBLE))
            {
                gameOver = true;

                Debug.Log("Todo Esta Perdido");
                Time.timeScale = 0;
                break;
            }

            contadorFinal++;

            lineaPaso.positionCount = i + 1;

            navegacionSistema();


            GameObject circulo = new GameObject();
            circulo.transform.position   = new Vector3(sistema.x, 0, sistema.z);
            circulo.transform.localScale = new Vector3(20, 20, 20);
            GameObject sistemaTemp = new GameObject();
            sistemaTemp.transform.parent        = circulo.transform;
            sistemaTemp.transform.localPosition = new Vector3(0, -2, 0);
            sistemaTemp.transform.localScale    = new Vector3(0.5f, 0.5f, 0.5f);

            Vector3 target = new Vector3(sistema.x, 0, sistema.z);


            float combustibleTemp     = ((transform.position - target).magnitude) * Constantes.GASTO_COMBUSTIBLE;
            float combustubleRestante = combustible - ((transform.position - target).magnitude) * Constantes.GASTO_COMBUSTIBLE;

            float gastoGasolina = 0;
            int   entra         = 0;
            while ((transform.position - target).magnitude != 0)
            {
                lineaPaso.SetPosition(i, new Vector3(transform.position.x, 0.1f, transform.position.z));
                if (entra <= 1)
                {
                    entra++;

                    gastoGasolina = combustibleTemp * Constantes.GASTO_COMBUSTIBLE - (((transform.position - target).magnitude) * Constantes.GASTO_COMBUSTIBLE);
                }
                combustible -= gastoGasolina;

                float step = velocidadSistemas * Time.deltaTime;
                transform.position = Vector3.MoveTowards(transform.position, target, step);

                Vector3 targetDir = target - transform.position;


                Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, step, 0.0f);
                Debug.DrawRay(transform.position, newDir, Color.red);
                // Move our position a step closer to the target.
                transform.rotation = Quaternion.LookRotation(newDir);

                Vector3 posicion = transform.position + offsetSistema;
                Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, posicion, 0.1f);

                yield return(null);
            }
            i++;//esta es para las lineas
            combustible = combustubleRestante;

            #region RecargarCombustible
            ///Recarga combustible si es posible
            RecargarCombustible rc         = new RecargarCombustible();
            double[]            materiales = new double[4];
            materiales[0] = iridio;
            materiales[1] = paladio;
            materiales[2] = platino;
            materiales[3] = elementoZero;

            double rg = 0;
            rc.recargarGasolinaYsondas(sistema, ref combustible, ref sondas, ref materiales, ref rg);

            iridio       = (float)materiales[0];
            paladio      = (float)materiales[1];
            platino      = (float)materiales[2];
            elementoZero = (float)materiales[3];


            #endregion RecargarCombustible


            GameObject planetaTemp = new GameObject();
            planetaTemp.transform.parent = sistemaTemp.transform;

            if (sistema.recorrido.caminoGlobal.Count > 0)
            {
                planetaTemp.transform.localPosition = new Vector3(sistema.recorrido.caminoGlobal[0].x, 0, sistema.recorrido.caminoGlobal[0].z);
                transform.position = planetaTemp.transform.position;
            }



            foreach (var planeta in sistema.recorrido.caminoGlobal)
            {
                navegacionPlanetas();
                planetaTemp.transform.localPosition = (new Vector3(planeta.x, 0, planeta.z));

                target = planetaTemp.transform.position;

                Vector3 posicion = transform.position + offsetPlanetas;
                Camera.main.transform.position = posicion;

                while ((transform.position - target).magnitude >= 0.1f)
                {
                    float step = velocidadplanetas * Time.deltaTime;
                    transform.position = Vector3.MoveTowards(transform.position, target, step);

                    Vector3 targetDir = target - transform.position;


                    Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, step, 0.0f);
                    Debug.DrawRay(transform.position, newDir, Color.red);
                    // Move our position a step closer to the target.
                    transform.rotation = Quaternion.LookRotation(newDir);

                    posicion = transform.position + offsetPlanetas;
                    Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, posicion, 0.1f);;

                    yield return(null);
                }


                #region EntrarAPlaneta


                Vector3 posiciont = new Vector3(-7, 0, 0);
                Vector3 rotacion  = new Vector3(0, 90, 0);
                Vector3 escala    = new Vector3(0.1f, 0.1f, 0.1f);

                transform.position   += posiciont;
                transform.eulerAngles = rotacion;
                transform.localScale -= escala;


                Vector3 offsetExtraccion = new Vector3(5f, 19, 22);
                // Camera.main.transform.position -= offsetExtraccion;



                if (sondas >= 2 && GastoSondas.valeLaPenaGastarSondas(planeta))
                {
                    Vector3 Posfinal1 = Camera.main.transform.position - offsetExtraccion;

                    while ((Posfinal1 - Camera.main.transform.position).magnitude != 0)
                    {
                        Camera.main.transform.position = Vector3.MoveTowards(Camera.main.transform.position, Posfinal1, 1f);
                        yield return(null);
                    }
                    sondas -= 2;
                    double iridioTemp       = planeta.iridio / tiempoExtraccion;
                    double paladioTemp      = planeta.paladio / tiempoExtraccion;
                    double platinoTemp      = planeta.platino / tiempoExtraccion;
                    double elementoZeroTemp = planeta.elementoZero / tiempoExtraccion;


                    inPlaneta = true;
                    int contador = 0;
                    nombrePlanetaTemp = planeta.nombre;

                    ///Extraer materiales
                    while (contador < tiempoExtraccion)
                    {
                        if (escapar)
                        {
                            escapar = false;
                            break;
                        }

                        contador++;
                        iridio       += (float)iridioTemp;
                        paladio      += (float)paladioTemp;
                        platino      += (float)platinoTemp;
                        elementoZero += (float)elementoZeroTemp;

                        planeta.iridio       -= iridioTemp;
                        planeta.paladio      -= paladioTemp;
                        planeta.platino      -= platinoTemp;
                        planeta.elementoZero -= elementoZeroTemp;

                        iridioPlanetaTemp       = (float)planeta.iridio;
                        paladioPlanetaTemp      = (float)planeta.paladio;
                        platinoPlanetaTemp      = (float)planeta.platino;
                        elementoZeroPlanetaTemp = (float)planeta.elementoZero;

                        iridioPlanetaTemp       = Mathf.Clamp(iridioPlanetaTemp, 0, Mathf.Infinity);
                        platinoPlanetaTemp      = Mathf.Clamp(platinoPlanetaTemp, 0, Mathf.Infinity);
                        paladioPlanetaTemp      = Mathf.Clamp(paladioPlanetaTemp, 0, Mathf.Infinity);
                        elementoZeroPlanetaTemp = Mathf.Clamp(elementoZeroPlanetaTemp, 0, Mathf.Infinity);

                        yield return(new WaitForSeconds(1f));
                    }
                }

                inPlaneta             = false;
                transform.position   -= posiciont;
                transform.eulerAngles = Vector3.zero;
                transform.localScale += escala;


                Vector3 Posfinal = Camera.main.transform.position + offsetExtraccion;

                while ((Posfinal - Camera.main.transform.position).magnitude != 0)
                {
                    Camera.main.transform.position = Vector3.MoveTowards(Camera.main.transform.position, Posfinal, 1f);
                    yield return(null);
                }
                #endregion EntrarAPlaneta
            }
        }

        GameObject.FindGameObjectWithTag("Teletransportar").GetComponent <Teletransportar>().iniciarAnimacion();
        yield return(new WaitForSeconds(2.1f));

        LevelLoader levelLoader = GameObject.FindGameObjectWithTag("LevelLoader").GetComponent <LevelLoader>();
        levelLoader.loadLevel("ViaLactea");
    }