Herramientas de usuario

Herramientas del sitio


preprocesado_de_la_entrada

Preprocesado de la entrada

Los métodos de análisis de la entrada (parseCommand) que hemos ido utilizando a lo largo de esta documentación, y detallado más en la sección sobre métodos de análisis de la entrada, son el mecanismo principal para definir o modificar cómo un mundo de AGE procesa las entradas del jugador. Como hemos visto, estos métodos reciben la entrada preprocesada, es decir, no trabajan directamente con el texto que teclea el jugador, sino que AGE le hace a dicho texto una serie de transformaciones (dividirlo en oraciones simples, cambiar los verbos a infinitivo, hacer correcciones en palabras mal escritas, sustituir los pronombres por los objetos a los que se refieren, etc.). 1) En general, dichas transformaciones son útiles porque le quitan trabajo al programador de aventuras, que no tiene que preocuparse de problemas como tratar con diferentes formas verbales o pronombres. Sin embargo, puede haber situaciones donde, por cualquier motivo, el programador quiera acceder directamente al texto tecleado por el usuario, sin que AGE interfiera. Esto se puede hacer mediante el método de preprocesado de la entrada.

Para definir este método en PUCK, vamos al panel de código de mundo, hacemos click derecho, y seleccionamos Insertar código → Redefinir métodos de mundo → Método de preprocesado de la entrada.

Nos aparecerá algo así:

/*
Método de preprocesado de la entrada. Con él podemos obtener y procesar directamente la entrada
que introduce un jugador o criatura, antes de que entre en juego el parser de AGE.
La cadena que devolvamos desde este método será la que se pase al parser.
*/
String preprocessCommand ( Mobile aCreature , String inputText )
{
	/* Manipulación del comando */
 
	return inputText;
}

El método de preprocesado de la entrada se llama preprocessCommand y toma dos parámetros: el jugador que ha introducido una determinada entrada (Mobile aCreature) y el texto que ha escrito (String inputText). Como se ha mencionado, este último parámetro nos proporciona el texto tal cual ha sido escrito, sin ninguna modificación hecha por AGE.

El método debe devolver un resultado de tipo String, que será la cadena que se pase al parser de AGE (que realiza todo el preprocesado mencionado anteriormente, y después llama a los métodos parseCommand y realiza el procesado por defecto). Utilizar este valor de retorno nos permite emplear el método preprocessCommand no sólo para conocer y procesar la entrada del jugador; sino también para modificarla. Por ejemplo, si quisiéramos que una aventura exigiera que el jugador le pidiese todo por favor para funcionar, podríamos hacer algo como:

String preprocessCommand ( Mobile aCreature , String inputText )
{
  if ( inputText.toLowerCase().startsWith("por favor") )
  {
    StringTokenizer st = new StringTokenizer(inputText);
    st.nextToken(); //consume la palabra por
    st.nextToken(); //consume la palabra favor
    return st.nextToken("").trim(); //devuelve el resto de las palabras
  }
  else
  { 
    aCreature.write("Eres un maleducado. No haré nada si no me lo pides con la palabra mágica.\n");
    end(); 
  }
}

En este ejemplo, si la entrada que nos ponen no empieza por “por favor”, mostramos un mensaje de protesta interrumpimos el procesado con end(), que funciona de la misma forma que en los métodos parseCommand, interrumpiendo el procesado de la orden. Nótese que si se interrumpe una orden a este nivel, nunca llegará a ser procesada por los métodos parseCommand, ya que preprocessCommand va antes.

En el caso de que la entrada sí empiece por “por favor”, le quitamos el “por favor” del principio dejando que AGE procese el resto de la oración de forma normal. Así pues, será la oración sin “por favor”, que es lo que devolvemos, la que sea procesada por los métodos parseCommand.

Produciendo salidas como ésta:

> ve al norte
Eres un maleducado. No haré nada si no me lo pides con la palabra mágica.
> por favor, ve al norte
Me dirijo hacia el norte.
Estoy en un camino de tierra, desde aquí puedo ir al norte, al sur o al oeste.
> ve al sur
Eres un maleducado. No haré nada si no me lo pides con la palabra mágica.

Nótese que, en el caso de no interrumpir el procesado con un end(), devolver un valor de tipo String es obligatorio. En el caso de no querer hacer ningún cambio a la cadena de entrada antes de que AGE la procese, simplemente devolveríamos el propio parámetro inputText.

1) Estas transformaciones están documentadas en detalle en la sección sobre métodos de análisis de la entrada
preprocesado_de_la_entrada.txt · Última modificación: 2011/03/24 14:03 por al-khwarizmi