Herramientas de usuario

Herramientas del sitio


manejo_de_eventos

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
manejo_de_eventos [2016/07/07 20:51]
al-khwarizmi
manejo_de_eventos [2016/07/08 13:49] (actual)
al-khwarizmi
Línea 205: Línea 205:
 Donde "​[oa]"​ significa que en esa posición hay o bien la letra "​o",​ o bien la letra "​a"​. De ese mismo modo, las expresiones regulares permiten expresar otras muchas cosas, no sólo sobre caracteres individuales sino también sobre rangos numéricos, alfanuméricos,​ límites entre palabras, etc. Donde "​[oa]"​ significa que en esa posición hay o bien la letra "​o",​ o bien la letra "​a"​. De ese mismo modo, las expresiones regulares permiten expresar otras muchas cosas, no sólo sobre caracteres individuales sino también sobre rangos numéricos, alfanuméricos,​ límites entre palabras, etc.
  
-Por ejemplo,+Por ejemplo, ​si nos fijamos bien en el último código para la conversación con Manolo, podemos darnos cuenta de que la forma de detectar si el interlocutor le habla de perros no es la más adecuada. Estamos mirando si el texto contiene "​perr",​ pero esto también va a suceder si alguien le dice a Manolo que está "​emperrado"​ en regatearle el precio de una alfombra, o que el dibujo de uno de sus productos es "​hiperrealista"​. Con expresiones regulares, podemos afinarlo mucho más, convirtiendo la línea en algo como:
  
 +<code java>
 +else if ( text.matches("​.*\\bperr[oa]s?​\\b.*"​) )
 +</​code>​
  
 +que mira si la cadena contiene las palabras "​perro",​ "​perra",​ "​perros"​ o "​perras":​ los ''​\\b''​ representan un límite de palabra (es decir, un carácter de espaciado, o bien el principio o final de la cadena), los ''​.*''​ representan que puede haber cualquier número de caracteres (incluyendo 0) antes o después de esa palabra, y la interrogación después de la letra "​s"​ quiere decir que ésta es opcional.
  
 +En este documento no detallaremos toda la lista de posibles expresiones regulares que se pueden construir, ya que se pueden encontrar tanto en la documentación de Java (de la [[
 +https://​docs.oracle.com/​javase/​6/​docs/​api/​java/​util/​regex/​Pattern.html|clase Pattern]] antes mencionada) como en numerosos libros y tutoriales online.
 +
 +Con estos mimbres y lo visto en secciones anteriores de la documentación,​ se pueden construir personajes con conversaciones muy ricas y complejas. Por supuesto, lo que se puede hacer va mucho más allá de las secuencias de ''​if''​ como hemos visto en el caso de Manolo, ya que podemos aprovechar los estados y relaciones de AGE para hacer que la conversación de un personaje cambie según el contexto del diálogo. A modo de ejemplo, el siguiente código de conversación pertenece a una mujer que se encuentra el héroe de la aventura "​Fuego"​ (se ha editado un poco para modernizar el código, ya que esa aventura se hizo en una versión antigua de AGE y de Java menos potente que la actual, donde conseguir algunas cosas era más engorroso):
 +
 +<code java>
 +(...)
 +
 +else if ( lText.contains("​hola"​) || lText.contains("​buenas"​) ​
 + || lText.contains("​saludo"​) || lText.contains("​buenos d") )
 + {
 + //nos están saludando, saludamos de vuelta
 + self.say("​Hola..."​);​
 + //miramos si conocemos el nombre del interlocutor
 + String nombre = get ( self , "​nombre",​ m );
 + if ( nombre == null || nombre.equals("​unknown"​) )
 + {
 + //si no conocemos el nombre, se lo preguntamos. Esperamos que nos lo diga.
 + self.say("​¿Cómo te llamas?"​);​
 + set ( self , "​esperandonombre"​ , m , true );
 + }
 + }
 +
 +(...)
 +
 +else
 +{
 + //si estamos esperando nombre, asumiremos que lo que nos dice lo es.
 + if ( get ( self , "​esperandonombre"​ , m ) )
 + {
 + if ( !lText.matches("​(\\w*\\W*){1,​3}"​) )
 + {
 + //si nos dice algo con más de tres palabras, probablemente no nos esté diciendo su nombre de verdad. Se ha ido por las ramas.
 + self.say("​Uy,​ ese nombre es muy largo. Dudo que pueda recordarlo. ¿No te puedo llamar por algún nombre más corto?"​);​
 + }
 + else
 + {
 + //hacer que el nombre empiece por mayúscula
 + if ( !Character.isUpperCase(lText.charAt(0)) )
 + lText = Character.toUpperCase(lText.charAt(0)) + lText.substring(1);​
 + //​actualizar las relaciones, reflejando que conocemos el nombre del personaje (y cuál es)
 + set ( self , "​nombre"​ , m , (String)lText );
 + set ( self , "​esperandonombre"​ , m , false );
 + self.say("​Encantado,​ " + self.getRelationshipPropertyValueAsString ( m , "​nombre"​ ) + ". Yo soy María."​);​
 + }
 + }
 + else
 + {
 +
 +(...)
 +</​code>​
 +
 +En este ejemplo, cuando alguien saluda a María, ésta le pregunta su nombre. Cuando el interlocutor se lo dice, María se queda con el dato (almacenado en una relación con el interlocutor,​ llamada "​nombre"​) y lo usará a lo largo de la conversación:​
 +
 +''//>​ decir "​hola"//​\\
 +Dices "​hola"​.\\
 +La mujer dice "​Hola..."​.\\
 +La mujer dice "​¿Cómo te llamas?"​.\\
 +//> decir "​juan"//​\\
 +La mujer dice "​Encantado,​ Juan. Yo soy María."''​
 +
 +De este modo, a partir de propiedades y relaciones, podemos hacer que las reacciones de los personajes a lo que les decimos varíen de acuerdo a lo que se ha dicho antes en la conversación,​ y por supuesto también a otros factores como identidad del interlocutor,​ humor actual del personaje, situación en el mundo, eventos que hayan sucedido, y un largo etcétera. El único límite es la imaginación y el esfuerzo dedicado a añadir detalle a la simulación.
manejo_de_eventos.1467917505.txt.gz · Última modificación: 2016/07/07 20:51 por al-khwarizmi