Diseñando una aventura conversacional - Parte 4

Por Spellcaster

Traducido por DCG

La Entrada de comandos y el parser (cont.)

En este capítulo seguiremos con el parser. Después de convertir la entrada a mayúsculas ahora nos ocuparemos de eliminar los artículos del array 'Parsed'.

        Procedure EliminarArticulos(Var Parsed:TipoParsed);
        Var A:Byte;
        Begin
            For A:=1 To 10 Do
            Begin
                If Parsed[A]='THE' Then Elimin(Parsed,A);
                If Parsed[A]='A' Then Elimin(Parsed,A);
            End;
        End1;
     

Hay que poner un 'if' para cada artículo o palabra a eliminar (en castellano serían un, una, el, la, unos...). De momento no insistiré más en el tema... La rutina Elimin es una rutina que dada una variable de TipoParsed y un índice, elimina la palabra correspondiente a este índice... Lo hace copiando la posicion del array con la siguiente posición del mismo, la cual es copiada a su vez con la siguiente, y así sucesivamente...

        Procedure Elimin(Var Parsed:ParsedType;Var Indice:Byte);
        Var A:Byte;
        Begin
            For A:=Indice To 9 Do Parsed[A]:=Parsed[A+1];
            Parsed[10]:='';
            Dec(Indice);
        End;
      

Fijaos, que los dos parámetros se pasan por referencia (lo indicamos mediante la palabra reservada 'Var'), ya que necesitamos decrementar el Indice despues de cada llamada a esta rutina y también porque la rutina modifica el array... Pondré un ejemplo, imaginaros que Parsed tiene cuatro elementos...

Imaginad que la entrada fuera 'Spellcaster The The Best'. En ese caso, lo que tendríamos en el array sería:

  1. Spellcaster
  2. The
  3. The
  4. Best

EliminarArticulos recorrería el array parsed, comenzando en el índice 1. Al ver 'Spellcaster', incrementaría el indice. Ahora Indice=2. Después, vería 'The'... llamaría a la rutina Elimin, y el array quedaría:

  1. Spellcaster
  2. The
  3. Best
  4. -

Si no se pasara el Indice por referencia y se decrementara al final de la rutina Elimin, el índice se incrementaría y sería igual a 3, saltando el segundo 'The'... La cuestión es que si decrementas Indice, estarás de nuevo en Indice=2, y el segundo 'The' también será eliminado... Espectacular, ¿a que sí?

No te olvides de llamar EliminarArticulos después de las otras rutinas de parseo.

Probablemente ahora tengais en la primera posición del array el comando principal (verbo), y en las otras posiciones el nombre del objeto con el cual se realizará la acción.

Sigamos. Deberíamos tener una bandera (flag) que se active cuando el comando se ejecute con éxito, y así podríamos dar un mensaje de error diciendo que no se entendió el comando... Declárala como de tipo booleano, e inicializala a False justo después del Repeat.

Después, cada vez que ejecutes un comando, ponla a True, y al final (justo antes de Until), comprueba si está a cierto... Si no lo está, notifica el mensaje error... ¡También podrías tener varios de estos mensajes, de manera que el jugador no se canse de ver una y otra vez el mismo mensaje! En el programa de ejemplo, el programa selecciona aleatoriamente uno entre los dos irritantes 'Comando desconocido'... :)

Implementemos ahora dos verbos más simples... Los verbos Mirar y Fin (quit)... Esto debería ser fácil de comprender... Sólo tienes que añadir las siguientes líneas al programa, después de parsear la entrada:

        If Parsed[1]='MIRAR' Then
        Begin
            Valid:=True;
            Look(CurrentRoom);
        End;
        If Parsed[1]='FIN' Then
        Begin
            Valid:=True;
            TextColor(BrightRed);
            Writeln;
            Writeln('¿ De verdad quieres abandonar FangLore (S/N) ?');
            C:=ReadKey;
            If UpCase(C)='S' Then ExitFlag:=True;
        End;
      

Define la variable C como una variable de tipo Char... Y voila'... Dos verbos implementados !! Fanglore empieza a tomar forma... :)))


Verbos de Movimiento

Bien, esto es realmente obvio y sencillo de hacer... Sólo tenéis que comprobar si el verbo correspondiente ha sido introducido (ej. 'Norte', 'N', 'Sur', etc...), y si hay una salida en esa dirección, asegúrate de que vaya por ahí... Si puede ir, te queda mirar la habitación... Codificando sabiamente:

        If (Parsed[1]='N') Or (Parsed[1]='NORTE') Then
        Begin
            If Rooms[LocalidadActual].Norte=0 Then
            Begin
                TextColor(LightRed);
                Writeln;
                Writeln('Lo siento, oh Gran Señor, ¡ pero no puedes ir en esa dirección !');
                Writeln;
            End
            Else
            Begin
                TextColor(LightRed);
                Writeln;
                Writeln('Vas al norte...');
                CurrentRoom:=Rooms[LocalidadActual].Norte;
                Writeln;
                Mirar(LocalidadActual);
             End;
             Correcto:=True;
         End;
      

Haz otro tanto con las otras tres direcciones... Guay, ¿verdad? Bien, ahora ya puedes mirar, abandonar y deambular por Fanglore... En nuestra próxima entrega de la serie, nos introduciremos en los objetos y su interacción...

Todos los trozos de código que aparecen en este número han sido añadidos al fuente de FangLore.


Nota de Spanish Quest: En los primeros números de 'The Mag' se realizó un cursillo de Pascal la mar de majo. Como comprenderéis no es cuestión de que lo reproduzcamos aquí, después de todo esto es una revista sobre aventuras, y no de programación. A los que no conozcáis Pascal y sepáis inglés os remito directamente a 'The Mag'. A los demás buscaos un buen tutorial en castellano, que seguro que los habrá perdidos en algún rincón de la red o miraros alguno de esos CD-ROMS que regalan las revistas, que puede que venga algún tutorial o cursillo interactivo de Pascal. Si el Pascal no os va, o simplemente conocéis algún otro lenguaje no os será nada complicado el pasarlo.


[VOLVER]