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(); }
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); }
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())); }
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); }
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í }