예제 #1
0
    // Función a la que llamaremos cuando queramos comprobar si la estructura quimica que hemos realizado se corresponde con una formula de nuestra base de datos
    public void ComprobarResultado()
    {
        if (!click)
        {
            click = true;
            Invoke("DesbloquearClick", 2.0f);

            //En primer lugar bloqueamos para que solo busque en caso de tener atomos en la paleta de formulación
            if (paletaFormulacion.transform.childCount > 0)
            {
                // Obtengo una lista de los enlaces que tenemos en los atomos dentro de la paleta de formulación
                List <Enlace> enlacesCopia = new List <Enlace>();


                for (int i = 0; i < paletaFormulacion.transform.childCount; i++)
                {
                    Enlace enlace = new Enlace();
                    enlace.atomo = paletaFormulacion.transform.GetChild(i).name;
                    paletaFormulacion.transform.GetChild(i).GetComponent <ControlScript> ().enlaces.Sort();
                    enlace.atomosEnlazados = paletaFormulacion.transform.GetChild(i).GetComponent <ControlScript> ().enlaces;
                    enlace.atomosEnlazados.Sort();
                    enlacesCopia.Add(enlace);
                }


                //Ahora distinguiremos entre si tenemos un ejercicio disponible o por el contrario si estamos en ejercicios de formulación libre
                if (ejercicio != null)
                {
                    bool errorFormula = false;

                    //Comprobamos si hay algún enlace entre nuestros atomos que no se corresponda con alguno de los enlaces necesarios para formar la estructura quimica
                    //correspondiente al ejercicio que hemos seleccionado
                    //En caso de que todos los enlaces se correspondan, podremos afirmar que hemos realizado correctamente la estructura
                    for (int i = 0; i < ejercicio.listaFormulas [indiceFormula].enlaces.Count && !errorFormula; i++)
                    {
                        Enlace enlace = ejercicio.listaFormulas [indiceFormula].enlaces [i];
                        enlace.atomosEnlazados.Sort();

                        //Busco el enlace en la lista, si está lo borramos. Si se queda vacía la lista al final y no hemos encontrado errores, habremos dado con la solución
                        if (enlacesCopia.Find(e => (e.atomo == enlace.atomo && compararListasString(e.atomosEnlazados, enlace.atomosEnlazados))) != null)
                        {
                            enlacesCopia.Remove(enlacesCopia.Find(e => (e.atomo == enlace.atomo && compararListasString(e.atomosEnlazados, enlace.atomosEnlazados))));
                        }
                        else
                        {
                            errorFormula = true;
                        }
                    }
                    paletaFormulacion.gameObject.SetActive(false);
                    panelSolucion.SetActive(true);
                    if (errorFormula)
                    {
                        panelSolucion.transform.Find("SolucionIncorrecta").gameObject.SetActive(true);
                        panelSolucion.transform.Find("SolucionIncorrecta").Find("TitleLabel").GetComponent <Text> ().text = "La solución es incorrecta";
                    }
                    else if (enlacesCopia.Count == 0)
                    {
                        //Si no nos hemos equivocado en la estructura y todos los enlaces son los mismos, sin haber de más, que el del ejercicio, habremos hecho la solución correcta
                        //Activamos por tanto el panel mostrando correcta la solución
                        panelSolucion.transform.Find("SolucionCorrecta").gameObject.SetActive(true);
                        panelSolucion.transform.Find("SolucionCorrecta").Find("TitleLabel").GetComponent <Text> ().text = "La solución es correcta";
                    }
                    //Desactivamos el panel automaticamente cuando pasen 5 segundos
                    Invoke("DesactivarPanelSolucion", 5.0f);
                }
                else
                {
                    //En caso de que no hayamos seleccionado ningún ejercicio, tendremos que repetir un poco lo anterior pero comprobando en todas y cada una de las formulas de la base de datos.
                    Formulas formulas = controladorInventario.LeerFormulasBaseDatos();

                    bool   formulaEncontrada = false;
                    string nombreFormula     = "";


                    //Realizamos una copia de los enlaces de la escena para tenerla guardada, ya que en la lista anterior será donde iremos borrando los enlaces que comprobemos que están correctos
                    //Así, podremos recuperar la lista en cualquier momento
                    List <Enlace> copia = new List <Enlace> ();

                    for (int i = 0; i < enlacesCopia.Count; i++)
                    {
                        copia.Add(enlacesCopia [i]);
                    }


                    for (int k = 0; k < formulas.listaFormulas.Count && !formulaEncontrada; k++)
                    {
                        bool errorFormula = false;
                        for (int i = 0; i < formulas.listaFormulas [k].enlaces.Count && !errorFormula; i++)
                        {
                            Enlace enlace = new Enlace();
                            enlace.atomo           = formulas.listaFormulas [k].enlaces [i].atomo;
                            enlace.atomosEnlazados = formulas.listaFormulas [k].enlaces [i].atomosEnlazados;
                            enlace.atomosEnlazados.Sort();


                            if (enlacesCopia.Find(e => (e.atomo == enlace.atomo && compararListasString(e.atomosEnlazados, enlace.atomosEnlazados))) != null)
                            {
                                enlacesCopia.Remove(enlacesCopia.Find(e => (e.atomo == enlace.atomo && compararListasString(e.atomosEnlazados, enlace.atomosEnlazados))));
                            }
                            else
                            {
                                errorFormula = true;
                            }
                        }

                        //Si no ha habido error en la formula y la lista de enlaces esta vacia, hemos encontrado la solución
                        if (!errorFormula && (enlacesCopia.Count == 0))
                        {
                            formulaEncontrada = true;
                            nombreFormula     = formulas.listaFormulas [k].nombreFormula;
                        }
                        else
                        {
                            //En caso contrario reinicio la lista de enlaces
                            enlacesCopia = new List <Enlace> ();
                            for (int i = 0; i < copia.Count; i++)
                            {
                                enlacesCopia.Add(copia [i]);
                            }
                            errorFormula = false;
                        }
                    }
                    paletaFormulacion.gameObject.SetActive(false);
                    panelSolucion.SetActive(true);

                    if (formulaEncontrada)
                    {
                        panelSolucion.transform.Find("SolucionCorrecta").gameObject.SetActive(true);
                        panelSolucion.transform.Find("SolucionCorrecta").Find("TitleLabel").GetComponent <Text> ().text = "La estructura es correcta, su nomenclatura es: " + nombreFormula;
                    }
                    else
                    {
                        panelSolucion.transform.Find("SolucionIncorrecta").gameObject.SetActive(true);
                        panelSolucion.transform.Find("SolucionIncorrecta").Find("TitleLabel").GetComponent <Text> ().text = "La estructura es incorrecta o no se encuentra en nuestra base de datos";
                    }

                    Invoke("DesactivarPanelSolucion", 5.0f);
                }
            }
            else
            {
                paletaFormulacion.SetActive(false);

                panelSolucion.SetActive(true);
                panelSolucion.transform.Find("NoHayAtomos").gameObject.SetActive(true);
                Invoke("DesactivarPanelSolucion", 5.0f);
            }
        }
    }