Пример #1
0
        static void Main(string[] args)
        {
            // objetos
            Presencia     MiPresencia    = new Presencia();
            Lenguaje      MiLenguaje     = new Lenguaje();     // lenguaje, vocabulario, funciones, etc
            Conversacion  MiConversacion = new Conversacion(); // tracking de los nodos recorridos
            Nodo          NodoActual;
            List <string> RespuestaEnLista = new List <string>();
            Respuesta     MiRespuesta      = new Respuesta(0, new List <string>());

            // inicialización
            Console.OutputEncoding = System.Text.Encoding.Unicode;
            NodoActual             = new Nodo(0);

            // bucle de diálogo
            while (MiRespuesta.SiguientePaso != 99)
            {
                // actualizamos el nodo en función del paso en el que estemos
                NodoActual = MiLenguaje.NodosLenguaje.Where(x => x.IdNodo == MiRespuesta.SiguientePaso).Single();

                // preguntamos, y obtenemos respuesta en lista de strings
                RespuestaEnLista = Dialogos.FormulaPregunta(NodoActual);

                // ejecuto la acción del nodo
                NodoActual.AccionARealizar();

                // Evaluamos respuesta en el contexto del nodo actual, y devolvemos un siguiente paso
                MiRespuesta = Dialogos.EvaluaSiguientePaso(NodoActual, RespuestaEnLista);
            }

            Console.WriteLine("He finalizado");
            Console.ReadLine();
        }
Пример #2
0
        public static Presencia DarSalida(Presencia MiPresencia, List <object> argumentos)
        {
            var Nombres = argumentos.Select(s => (string)s).ToList();

            foreach (string nombre in Nombres)
            {
                //TODO: controlar que no estaba ya en la lista; pasar de string a List
                MiPresencia.Remove(nombre);
            }

            return(MiPresencia);
        }
Пример #3
0
        public Lenguaje()
        {
            NodosLenguaje = new List <Nodo>();

            // Nodo-0: saludo, y apertura del primer árbol de decisión
            Dictionary <int, List <string> > _Diccionario00 = new Dictionary <int, List <string> >();

            _Diccionario00.Add(0, new List <string> {
                "hola", "buenos días", "buenas tardes"
            });
            _Diccionario00.Add(1, new List <string> {
                "entrada", "entrar", "recepción"
            });
            _Diccionario00.Add(2, new List <string> {
                "salida", "salir"
            });
            _Diccionario00.Add(3, new List <string> {
                "quien", "consulta"
            });
            _Diccionario00.Add(4, new List <string> {
                "quienes", "cuantos"
            });
            _Diccionario00.Add(5, new List <string> {
                "finalizar", "conversación", "olvídalo", "nada, nada", "déjalo"
            });
            NodosLenguaje.Add(new Nodo(0, Nodo.TiposNodo.Pregunta, "Hola, ¿qué necesitas?", _Diccionario00, new List <string>(), new List <Object>(), () => Acciones.NoHacerNada()));

            // Nodo-1: Quiere dar entrada
            Dictionary <int, List <string> > _Diccionario01 = new Dictionary <int, List <string> >();

            _Diccionario01.Add(0, Presencia.ListaHabitantes()); //gestiono desde Dialogos.cs el siguiente nodo
            NodosLenguaje.Add(new Nodo(1, Nodo.TiposNodo.ConsultaNombre, "¿A quién?", _Diccionario01, new List <string>(), new List <Object>(), () => Acciones.NoHacerNada()));

            // Nodo-2: hacer la entrada efectiva
            Dictionary <int, List <string> > _Diccionario02 = new Dictionary <int, List <string> >();

            _Diccionario02.Add(0, Presencia.ListaHabitantes()); //gestiono desde Dialogos.cs el siguiente nodo
            NodosLenguaje.Add(new Nodo(2, Nodo.TiposNodo.Accion, "", _Diccionario02, new List <string>(), new List <Object>(), () => Acciones.NoHacerNada()));

            // Nodo-3: Quiere dar salida
            Dictionary <int, List <string> > _Diccionario03 = new Dictionary <int, List <string> >();

            _Diccionario03.Add(0, Presencia.ListaHabitantes()); //gestiono desde Dialogos.cs el siguiente nodo
            NodosLenguaje.Add(new Nodo(3, Nodo.TiposNodo.ConsultaNombre, "¿A quién?", _Diccionario03, new List <string>(), new List <Object>(), () => Acciones.NoHacerNada()));


            // Nodo-5: finalizar la conversación
            Dictionary <int, List <string> > _Diccionario05 = new Dictionary <int, List <string> >();

            _Diccionario05.Add(0, Presencia.ListaHabitantes()); //
            NodosLenguaje.Add(new Nodo(5, Nodo.TiposNodo.Orden, "De acuerdo; hasta cuando me llames", _Diccionario05, new List <string>(), new List <Object>(), () => Acciones.NoHacerNada()));
        }
Пример #4
0
        public static Presencia DarEntrada(Presencia MiPresencia, List <object> argumentos)
        {
            //List<string> Nombres = new List<string>(); me gusta más declarar esto que usar var, pero la vida moderna no va por ahí
            var Nombres = argumentos.Select(s => (string)s).ToList();

            foreach (string nombre in Nombres)
            {
                //TODO: controlar que no estaba ya en la lista; pasar de string a List
                MiPresencia.Add(nombre);
            }

            return(MiPresencia);
        }
Пример #5
0
        public static Respuesta EvaluaSiguientePaso(Nodo _NodoActual, List <string> _RespuestaEnLista)
        {
            switch (_NodoActual.TipoNodo)
            {
            case Nodo.TiposNodo.Pregunta:
            {
                int SiguientePaso;         //preparo el objeto respuesta
                // Respuesta MiRespuesta = new Respuesta();TODO: esto sobra, ¿no?

                List <string> TextoDevuelto = new List <string>();
                foreach (int key in _NodoActual.SiguientesPasos.Keys)
                {
                    if (_NodoActual.SiguientesPasos[key].Any(s => _RespuestaEnLista.Contains(s.ToUpper())))
                    {
                        //Console.WriteLine("Ocurrencia localizada en clave: " + key.ToString()); //DEBUG
                        SiguientePaso = key;
                        return(new Respuesta(SiguientePaso, TextoDevuelto, _NodoActual));
                    }
                }
                Console.WriteLine("No te he entendido");
                return(new Respuesta(0, TextoDevuelto, _NodoActual));
            }

            case Nodo.TiposNodo.ConsultaNombre:
            {
                int           PasoActual    = _NodoActual.IdNodo;
                int           SiguientePaso = _NodoActual.IdNodo; //preparo el objeto respuesta (si no hay éxito en la respuesta, me voy a quedar donde estoy para que repita la pregunta)
                List <string> MensajeVuelta = new List <string>();
                // Respuesta MiRespuesta = new Respuesta();TODO: esto sobra, ¿no?

                List <string> ListaNombres = Presencia.ListaHabitantes();        //obtenemos la lista de habitantes EN MAYÚSCULAS


                foreach (string Palabra in _RespuestaEnLista)         //¿está algún nombre de la respuesta en la lista?
                {
                    if (ListaNombres.Contains(Palabra.ToUpper()))
                    {
                        MensajeVuelta.Add(Palabra);
                        SiguientePaso = _NodoActual.SiguientesPasos.First().Key;         //si hay un nombre válido voy al (único) siguiente paso que haya
                    }
                }

                if (SiguientePaso == PasoActual)
                {        //no encontró respuesta, vuelve a repetir la pregunta
                    return(new Respuesta(PasoActual, new List <string>(), _NodoActual));
                }
                else
                {
                    foreach (string nombre in MensajeVuelta)
                    {
                        _NodoActual.ArgumentosAccion.Add((object)nombre); //devuelve como argumentos para la acción siguiente la lista de nombres
                        Console.WriteLine(nombre);                        //DEBUG: encontró respuesta
                    }

                    return(new Respuesta(SiguientePaso, MensajeVuelta, _NodoActual));
                }
            }

            case Nodo.TiposNodo.Orden:
            {
                Environment.Exit(-1);                                       //Cerramos la aplicación //TODO: MEJORAR ESTO.....
                return(new Respuesta(0, new List <string>(), _NodoActual)); // NUNCA VA A LLEGAR AQUÍ
            }
            }
            return(new Respuesta(0, new List <string>(), _NodoActual)); //TODO: quitar esto de aquí
        }