CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 22 Oct 2019 13:44

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 3 mensajes ] 
Autor Mensaje
NotaPublicado: 21 Nov 2011 23:40 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 735
Hola. Después de un tiempo sin andar programando nada he vuelto a ponerme con una mini aventura que tenía por ahí a medias, pero me he quedado medio bloqueado enseguida. En lo que ya tenía hecho, hay un momento en el que se almacena la entrada que teclea el jugador y se compara con varias palabras; algo así a lo que se haría si se le pidiese al jugador teclear una contraseña y comprobar si lo que ha tecleado es válido o no. Tal cuál lo tengo ahora, la palabra tecleada por el jugador se almacena en un array de caracteres y la comprobación se hace letra a letra:

Código:
!!------------------------------------------------------------------------------
!! Lee una cadena de caracteres de teclado. Los caracteres son colocados en un
!! array 'buffer' cuya primera palabra contiene el número de caracteres que han
!! sido tecleados, y sus siguientes bytes contienen esos caracteres.
!! @param: El array sobre el que se va a escribir la entrada.
!! @param: El número máximo de caracteres que se van a leer (entero)
!! @return: El número de caracteres tecleados.
!!
#Ifdef    TARGET_ZCODE;
[ KeyLine buf max;
   buf->0 = max;
   buf->1 = 0;
   read buf 0;
   buf->0 = 0;
   !! Recorta el array
   TrimString(buf);
   return buf-->0;
];
#Ifnot;   !TARGET_GLULX
[ KeyLine buf max;
   glk($00D0, gg_mainwin, buf+WORDSIZE, max, 0); ! request_line_event
   while (true) {
      glk($00C0, gg_event); ! select
      if (gg_event-->0 == 3 && gg_event-->1 == gg_mainwin) break;
   }
   buf-->0 = gg_event-->2;
   !! Recorta el array
   TrimString(buf);
   !! Lo pasa a minúsculas
   LowerCaseString(buf);
   !! Retorna
   return buf-->0;
];
#Endif;   !TARGET_

!!------------------------------------------------------------------------------
!! Elimina todos los espacios en blanco (caracter ' ') del final de un array
!! @param: El array sobre el que se realizará el recorte
!!
[ TrimString buf;
   while ( buf->(WORDSIZE+(buf-->0)-1) == ' ' ) buf-->0 = buf-->0 - 1;
];

!!------------------------------------------------------------------------------
!! Transforma todos los caracteres de un array dado a minúsculas
!! @param: El array sobre el que se realizan las modificaciones
!!
[ LowerCaseString buf
   i c;
   for ( i=0 : i<buf-->0 : i++) {
      c = buf->(i+WORDSIZE);
      buf->(i+WORDSIZE) = LowerCase(c);
   }
];

Código:
[ IsPasswordCorrect array i;
   i = WORDSIZE+(array-->0);
   if (array-->0~=4) return false;
   if ( (array->(i-4)=='g') && (array->(i-3)=='e') && (array->(i-2)=='m') && (array->(i-1)=='a') ) return true;
   else return false;
];

Y aunque esto funciona, se me ha ocurrido una cosilla en que se haría básicamente lo mismo, solo que en lugar de comprobar si la entrada del usuario se corresponde con una o dos palabras (el "gema" del código anterior), se debería poder comprobar con conjuntos de palabras de, no sé, cincuenta o cien o más palabras. ¿Alguien sabe cuál sería la mejor forma de hacer algo así? Supongo que podría ir añadiendo líneas de comprobación a la función IsPasswordCorrect(), pero he pensado que tal vez se pueda hacer de alguna otra forma, sin tener que meter ese porrón de ifs seguidos.

Un saludo.


Arriba
 Perfil  
 
NotaPublicado: 22 Nov 2011 09:10 
Desconectado
Betatester
Betatester
Avatar de Usuario

Registrado: 23 Mar 2010 20:11
Mensajes: 1141
Ubicación: Valencia
Yo hice esto para El Último Jedi... con algunas pequeñas modificaciones te podría valer:

Spoiler: Mostrar
Código:
Array StringBuffer1->102;

[ StrCmp len first second i j k l aux;
   j=0;
   aux=second.print_to_array(StringBuffer1,102);

   if (len<aux) k=len;
   else k=aux;
   for(i=0:i<k&&j==0:i++){l=i+4;
    j=((StringBuffer1->l)-(first->i));}
   return j;
];


Y se usaría así:

Código:
wn = consult_from;
 w = WordAddress(wn);

 if (StrCmp(WordLength(wn),w,"subir")==0 || StrCmp(WordLength(wn),w,"saltar")==0 || StrCmp(WordLength(wn),w,"trepar")==0
    || StrCmp(WordLength(wn),w,"levitar")==0 || StrCmp(WordLength(wn),w,"escalar")==0 || StrCmp(WordLength(wn),w,"salir")==0)
   "Uno de los poderes de la Fuerza es SALTAR donde otras criaturas no pueden alcanzar.";


La función devuelve 0 si las 2 cadenas son iguales y distinto de 0 si no lo son. Bueno, en realidad tal y como está devuelve 0 si first es la subcadena inicial de second, pero con un simple if al principio comparando longitudes se obtiene la comparación exacta.
El primer parámetro es la longitud de la cadena introducida por el usuario, el segundo la propia cadena y el tercero la cadena con la que la queremos comparar.
Con un while se podría comparar fácilmente con un grupo de cadenas de cualquier tamaño.

_________________
El humor existe para recordarnos que por muy alto que sea el trono en el que uno se siente, todo el mundo usa su culo para sentarse.


Arriba
 Perfil  
 
NotaPublicado: 26 Nov 2011 16:28 
Desconectado
Grafista
Grafista
Avatar de Usuario

Registrado: 04 Sep 2008 17:23
Mensajes: 735
Muchas gracias Joruiru. A ver si encuentro tiempo este fin de semana para seguir enredando con la aventurilla y lo pruebo. No estoy seguro de poder hacerlo, pero bueno, si soy capaz de sacar el puzzle adelante creo que tendría una participante lista para la Minicomp.


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 3 mensajes ] 

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM