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];
    }
示例#4
0
    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];
    }
示例#6
0
    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);
    }