public List <string> DialogosDeEsteObjeto(ObjetoInteractuable origen) { Dictionary <ObjetoInteractuable, int> caminos = new Dictionary <ObjetoInteractuable, int>(); foreach (ObjetoInteractuable o in origen.aristas) { //reiniciar el estado vistado a todos foreach (GameObject oo in GameObject.FindGameObjectsWithTag("objetosInteractuables")) { oo.GetComponent <ObjetoInteractuable>().visitado = false; oo.GetComponent <ObjetoInteractuable>().distancia = 0; } caminos.Add(o, BFS(o)); } //decidir cual es el mas corto y el largo de los caminos para sacar sus dialogos var myList = caminos.ToList(); myList.Sort((pair1, pair2) => pair1.Value.CompareTo(pair2.Value)); List <string> dialogos = new List <string>(); //TODO se debe colocar random el orden de la escritura de dialogos, porque siempre el primero es el correcto. foreach (KeyValuePair <ObjetoInteractuable, int> l in myList) { if (l.Value.Equals(myList[0].Value)) { dialogos.Add(l.Key.dialogoBueno); } else { dialogos.Add(l.Key.dialogoMalo); } } return(dialogos); }
/// <summary> /// Deprecada /// </summary> /// <param name="distancia"></param> /// <param name="verticeIndividual"></param> /// <returns></returns> public int FuncionRecursivaParaEncontrarFinal(int distancia, ObjetoInteractuable verticeIndividual) { if (verticeIndividual.Equals(verticeFinal)) { if (distancia < distanciaMaxima) { distanciaMaxima = distancia; } else { //Debug.LogWarning(">>>>>> esporque es el final"); return(distancia); } } if (verticesVisitados.Contains(verticeIndividual) && verticeIndividual.distancia < distancia) { //Debug.LogWarning("Es porque ya a sido visitado "+ verticeIndividual.gameObject.name +" pero distancia recorrida hasta el fue de: "+verticeIndividual.distancia+" y la recorrida hsata ahora es de "+distancia ); return(distancia); } else { verticesVisitados.Add(verticeIndividual); verticeIndividual.distancia = distancia; ////Todo esta bien distancia++; foreach (ObjetoInteractuable arista in verticeIndividual.aristas) { //Debug.LogWarning("El objeto "+verticeIndividual.gameObject.name+" visita a: " + arista.gameObject.name + " distancia hasta aqui es: " + distancia); distancia = FuncionRecursivaParaEncontrarFinal(distancia, arista); } return(distancia); } }
//Generamos el verice final a partir de los vertices seleccionados public void GenerarVerticeFinal() { //numero random int random = UnityEngine.Random.Range(0, vertices.Count); verticeFinal = vertices[random]; }
public string[] DialogosDeEsteObjeto(ObjetoInteractuable origen) { foreach (ObjetoInteractuable o in origen.aristas) { //reiniciar el estado vistado a todos foreach (GameObject oo in GameObject.FindGameObjectsWithTag("inicio")) { oo.GetComponent <ObjetoInteractuable>().visitado = false; oo.GetComponent <ObjetoInteractuable>().distancia = 0; } BFS(o); } return(new string[] { "" }); /* * distanciasPorVertice = new Dictionary<ObjetoInteractuable, int>(); * string[] resultado = new string[origen.aristas.Count]; * int i = 0; * foreach (ObjetoInteractuable verticeIndivi in origen.aristas) * { * verticesVisitados = new List<ObjetoInteractuable>(); * verticesVisitados.Add(distanciaDesdeAqui); * int distancia = 1; * distanciaMaxima = 0; * //setear las distancias ya recorrifas * foreach (ObjetoInteractuable ob in vertices) * { * ob.distancia = 0; * } * distancia = FuncionRecursivaParaEncontrarFinal(distancia, verticeIndivi); * distanciasPorVertice[verticeIndivi] = distancia; * i++; * } * * //debemos organizarlos por orden de distancia * var query = from pair in distanciasPorVertice orderby pair.Value ascending select pair; * int o = 0;//es la variable donde vamos a guardar la distancia mas corta para ver si la tomamos de nuevo... * i = 0; * foreach (KeyValuePair<ObjetoInteractuable, int> r in query) * { * if(i == 0 || r.Value <= o) * { * resultado[i] = r.Key.dialogoBueno; * o = r.Value; * } * else * { * resultado[i] = r.Key.dialogoMalo; * } * //Debug.Log(r.Key.gameObject.name+" indice "+i+" distancia "+r.Value); * i++; * } * return resultado;*/ }
private void Start() { //vamos a colocar aleatoriamente el vertice final List <ObjetoInteractuable> objetosQuePuedenSerFinales = new List <ObjetoInteractuable>(); foreach (GameObject iterado in GameObject.FindGameObjectsWithTag("objetosInteractuables")) { if (iterado.GetComponent <ObjetoInteractuable>().dialogoFinal != "") { //Debug.Log(iterado.name); objetosQuePuedenSerFinales.Add(iterado.GetComponent <ObjetoInteractuable>()); } } int random = UnityEngine.Random.Range(0, objetosQuePuedenSerFinales.Count); verticeFinal = objetosQuePuedenSerFinales[random]; }
public void BFS(ObjetoInteractuable origen) { Queue <ObjetoInteractuable> cola = new Queue <ObjetoInteractuable>(); cola.Enqueue(origen); origen.visitado = true; int i = 0; while (cola.Count > 0) { ObjetoInteractuable v = cola.Dequeue(); //si es el final return if (v == verticeFinal) { break; } i++; foreach (ObjetoInteractuable w in v.aristas) { Debug.Log("origen " + v.name + " distancia hasta ahora " + i + " destino " + w.name + " distancia del destino " + w.distancia + " fue visitado? " + w.visitado); if (!w.visitado) { w.visitado = true; w.distancia = i; cola.Enqueue(w); } else if (w.distancia < i && w == verticeFinal) { i = w.distancia; } else { break; } } } Debug.Log("i " + i); }
public int BFS(ObjetoInteractuable origen) { Queue <ObjetoInteractuable> cola = new Queue <ObjetoInteractuable>(); cola.Enqueue(origen); origen.visitado = true; int i = 0; while (cola.Count > 0) { ObjetoInteractuable v = cola.Dequeue(); //si es el final return if (v == verticeFinal) { break; } i++; foreach (ObjetoInteractuable w in v.aristas) { if (!w.visitado) { w.visitado = true; w.distancia = i; cola.Enqueue(w); } else if (w.distancia < i && w == verticeFinal) { i = w.distancia; } else { break; } } } return(i); }