TECNICAS DE PROGRAMACION

LOS PERSONAJES PSEUDO-INTELIGENTES (IV)

Si en la anterior entrega enumerábamos las características más envidiables de los PSI mejor formados en toda la historia de las conversacionales asistidas por ordenador, comenzamos rápidamente en este nuevo ejemplar escribiendo poderosas rutinas para llevar a la práctica todos y cada uno de los apartados descritos.

I. LA MOVILIDAD

¡Qué maravilla observar cómo tus creaciones deambulan de una lado a otro, yendo y viniendo en un fastuoso alarde de habilidad programatoria!, ¡y qué regocijo al imaginar, siquiera, la horrenda frustración del jugador que necesita con urgencia la colaboración de uno de tus PSI, y que se recuesta sobre su asiento al pensar que el maldito puede estar en CUALQUIERA de las múltiples localidades y en constante movimiento! En efecto muchachos, es éste uno de los grandes atractivos de la aventura...

Para una rutina de movimiento aleatorio os remito al número 7, donde ya escribimos una que cumplía perfectamente con esta función. Sin embargo, nos resta por comentar algunos que otros tipos de movimiento igualmente interesantes. Por ejemplo, en innumerables ocasiones os habréis visto en la obligación de teclear algo así como DILE AL FANTASMA "SIGUEME". ¿Qué ocurre cuando tecleamos algo así? Una entrada en Respuestas se encarga de llamar a una tabla de Procesos ocupada en albergar a un gran pedazo de nuestro PSI -visto en números anteriores- pues bien, es en esa tabla donde incluiréis una entrada más o menos así:

SIGUEME  _    LT         11    1
              SET        11
              LET         5   10
              MESSAGE "El fantasma asiente"
              DONE

SIGUEME _ MESSAGE "¡Estoy en ello!"

DONE

Y en Procesos 2:

SIGUEME  _    GT         11    1
              NOTZERO     5
              NOTSAME (flagpsi) 38
              COPYFF     38 (flagpsi)
              MESSAGE "El fantasma aparece"

Y más bonito aún, también en Procesos 2:

SIGUEME  _    EQ          5    1
              CLEAR      11
              MESSAGE "El fantasma dice: No veo porqué he de seguirte más"

Ya lo tenemos. Veamos ahora qué ocurre exactamente. En la tabla de Procesos, la orden PARSE interpreta el mensaje entre comillas que dice "SIGUEME" (sinónimos aconsejados: SIGUE, SEGUI), y entonces encuentra nuestra primera entrada. Si el PSI no está siguiendo al jugador (11=0), se pone a ello (11=255) y lo hace saber. Si lo sigue, ignora la primera entrada (porque 11 es diferente de 0) y también se lo comunica al jugador. Habiendo cambiado el valor de 11, o habiendo dicho que el PSI ya está siguiendo al aventurero, lee luego Procesos 2 y se encuentra con que si a) 11 es distinto de 0 (está siguiendo al jugador), b) 5 no es 0 (otra comprobación), c) el PSI no está en la misma localidad que el jugador, entonces copia el contenido de la bandera 38 en la bandera que lleve la localidad del PSI, lo que hace que PSI=Jugador, y lo hace saber.

Si alguna de estas comprobaciones falla, no sale de la tabla, si no que sigue buscando otras entradas -un programa aún debe hacer muchas comprobaciones, ajustes, cambios, etc-, y si además, la bandera 5 tiene el valor 1, se da por terminado el acto de seguimiento, por así decirlo, restaurando el valor de 11 a 0. El jugador está en postura, por supuesto, de volver a teclear SIGUEME al PSI para que todo vuelva a empezar.

Acordaos de desactivar la rutina de movimiento aleatorio cuando el PSI esté siguiendo al jugador, mediante un simple condacto al principio de la entrada principal (estaba en P2) que chequee que 11 sea 0.

Otro tipo de movimiento, cuando simplemente sea interesante que el PSI se mueva en una dirección determinada si así se lo indica el jugador. DILE AL FANTASMA "VETE AL NORTE" (como muy bien habéis pensado, el ordenador entiende una simple N).

En la tabla de Procesos asignada:

_        _  (insertar en   LT       34   14
             posición 0)   MOVE (flagpsi)
                           MESSAGE "El fantasma se marcha"
                           DONE

_        _  (insertar en   LT       34   14
             posición 1)   MESSAGE "El fantasma no puede ir en esa dirección"
                           DONE

Muy bien. Esta es una entrada sencilla que, además, la tenéis comentada en el libro Guía de Referencia que trae consigo el PAW, por lo que no le daremos mayor importancia.

Algo que aporta un extraordinario encanto a un PSI es que sea capaz de, diligentemente, dirigirse por el camino más corto y rápidamente a un punto de destino. Ya hablamos de esto anteriormente, por lo que únicamente nos ocuparemos ahora de hacerlo realidad.

Se trata de hacer que un PSI vaya desde un sitio a otro pasando por un número variable de localidades. Es por esto que no escribiremos una rutina lista para ser tecleada, como hacemos siempre, si no que que explicaremos cómo funciona todo.

En primer lugar, debemos establecer cuando y dónde va a iniciarse la ruta. Sería algo así:

_        _    EQ     (flagpsi) 17
              LT         11     1
              SET        11

Aquí, en Procesos 2, esta entrada comprueba que el PSI esté en la localidad 17, lo cual es un modo tan bueno como cualquier otro de establecer una condición a modo de ejemplo. Vosotros, en vuestros propios programas, probablemente necesitéis alguna que otra comprobación -chequear el valor de una bandera, verificar que un objeto ha sido dejado, cogido, puesto, etc- pero esto no os supondrá -¡eso espero!- un problema. Ahora que el ordenador sabe que debe activar la ruta, haremos una llamada a una nueva tabla de procesos que contendrá exclusivamente nuestra ruta. En realidad, como sucedía en el movimiento aleatorio, también en P2, una si PSI=Jugador y otra para cuando éste no sea el caso.

_        _    GT        11     1
              SAME  (flagpsi) 38
              PROCESS    X
              SET       12

_        _    LT        12     1
              GT        11     1
              NOTSAME (flagpsi) 38
              PROCESS    Y

_        _    CLEAR     12

Examinemos esto. Aquí, la bandera 12 actúa como un control para que la segunda entrada de las tres que forman el llamamiento a la rutina de movimiento no se ejecute si la primera de ellas ya lo ha hecho. Más lógico sería poner un sencillo DONE en esta última, para que PAW ordenase una salida de la tabla, ¿no es cierto? Bien, la verdad es que no. Establezcamos ahora una especie de regla de oro: Por lo general, y salvo muy pocas excepciones, las tablas 1 y 2 jamás contendrán condactos que ordenen salidas de tablas, puesto que deben ser leídas enteras.

Luego, PAW envía al intérprete a leer la tabla de Procesos X si el PSI está en la misma localidad que el jugador, y la Y si no es así. Vosotros deberéis asignar el número de tablas que queráis. Veamos pues cómo sería:

_        _    EQ    (flagpsi) 17
              LET       33    13
              MOVE  (flagpsi)
              SAME  (flagpsi) 38
              MESSAGE "El fantasma aparece"
              DONE

La primera de estas dos entradas, la establecida en X comprueba que el PSI está en 17, intenta moverlo al norte (definida en el vocabulario como nombre de valor 13) y si lo consigue (simplemente porque existe una salida al norte registrada en la tabla de conexiones en la localidad 17) se lo hace saber al jugador, y ¡voilá! nuestro fantasma ya está en otra localidad.

La que se encuentra en Procesos Y hace lo mismo, pero suponiendo que estuviésemos ya en la SIGUIENTE localidad, a donde va el PSI luego de haberse desplazado al norte, entonces nos diría que el fantasma aparece porque se movió al norte. Como veis, las dos entradas se complementan perfectamente. Para que el PSI se moviera desde la nueva localidad (digamos, 18) a una nueva que se encuentra, digamos también al este, habría que modificar los EQ (bandera PSI) 17 por un EQ (bandera PSI) 18, el LET por un LET 33 3 (por que ESTE es 3 en el vocabulario) y en el MESSAGE de X, decir que "el fantasma va al este". ¡Y ya está! El esquema de las localidades sería este:

                 --+ +-----+ +--
                 ? +-¦  18 +-¦  ?
                   ¦ ¦    ++-+->
                 --+ +----++ +--
                     +----++
                     ¦  17¦¦ 
                     ¦     ¦
                     +-----+

Pensad que los cambios que debéis hacer para que el PSI haga un recorrido mucho más completo son evidentes, pero acordaos de desconectar la rutina alterando el valor de la bandera que cumplía esta función (en nuestro ejemplo, la 11). En la próxima entrega trataremos el interesante tema del apartado 2, ¡la manipulación de objetos!

Carlos Sisí