/// <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); }
/// <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); }
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"); }