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:
- Spellcaster
- The
- The
- 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:
- Spellcaster
- The
- Best
- -
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 del traductor: 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 algun tutorial o cursillo interactivo de Pascal.
Si el Pascal no os va, o simplemente conocéis algún
otro lenguaje (BASIC, no gracias) no os será nada complicado
el pasarlo.
ÚLTIMA REVISIÓN EN FEBRERO DE 1999