CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 20 Oct 2019 22:54

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 36 mensajes ]  Ir a página Anterior  1, 2, 3
Autor Mensaje
 Asunto:
NotaPublicado: 18 Ene 2005 01:34 
gerish escribió:
noo si pasarme
me ha pasado
digo que el ejemplo que se me ha puesto no termino de entenderlo
pero me hago una idea de como funciona
de todas formas me resulta más sencillo trastear con código picado (aun que no lo entienda) que entender algo que he leido decenas de veces sin entenderlo

saludso


Tu haz caso a Jen y no te limites a copiar códigos, trata, hasta donde puedas, de comprenderlos, así­ en el futuro podrás adaptarlos a tus necesidades (y no tener que adaptarte tu a ellos XDD)

En cualquier caso, vamos con el turrón de la versión Glulx de nuestras contraseñas. Vayamos por partes. El problema ya no es sólo que KeyboardPrimitive rellene de diferente manera en Glulx los elementos de su buffer (que es nuestro array). Para darle más emoción al asunto, resulta que en Z la rutina usa un elemento de Inform, la sentencia "read" inexistente en Glulx. Este "read" entre otras cosas, se encarga por su cuenta de limitar el número de caracteres que el jugador introduzca al tamaño del array que reciba como parámetro, lo cual proporciona la seguridad de que no se sobreescribiran inadvertidamente zonas de memoria que no debieran. Este resorte de seguridad adicional no lo tenemos en Glux, así­ que hay que procurarlo de alguna manera. Lo que haremos será meter el resultado de KeyboardPrimitive en "buffer", un array de sobrado tamaño predefinido en la librerí­a precisamente para su uso con esta rutina.
Por otra parte en Glulx no "traga" con que no le indiquemos el parámetro de la tabla de parse, como pasaba en Z, así­ que se lo indicaremos (le señalaremos, precisamente, el array "parse" que ya viene debidamente definido en "Eparser.h"). Vamos allá:




Código:
Constant MAX_LONG_PASSW 10;

!Señalamos en una constante lo que queramos poner como lí­mite
!máximo de la longitud de las contraseñas (en este caso 10). Se
!puede poner el que se quiera, pos supuesto, y además así­ se
!puede cambiar con comodidad (conque lo cambies en esta linea
!ya te olvidas)

Include "EParser";
Include "Acciones";
Include "Mensajes";
Include "Gramatica";

array contrasena1 -> MAX_LONG_PASSW;
array contrasena2 -> MAX_LONG_PASSW;

!definimos los arrays especificando su tamaño con
!ese valor máximo

[inicializar x;
   do
   {
      print "Introduce password (máximo ", MAX_LONG_PASSW, " caracteres):^";
      KeyboardPrimitive(buffer,parse);
   }
   until (buffer-->0~=0 && buffer-->0<=MAX_LONG_PASSW);

!la farragosa comprobación del final del bucle se encarga de
!garantizar
!que su longitud se halla estrictamente entre uno y 10
!Notese que en Glulx la longitud de la cadena introducida
!por el jugador se almacena en la "palabra" numero "cero" del
!buffer utilizado, (que en Glulx ocupa 4 bytes), por eso nos
!referimos a ella como "buffer-->0" (el motivo se explica
!en detalle en el enlace del otro dí­a sobre las diferencias de
!KeyboardPrimitive en Glulx y Z)
   
   for (x=0:x<=(buffer-->0)-1:x++)
      contrasena1->x=buffer->(x+4);

!aquí­ hacemos otra maniobra nueva, pasamos uno a uno el
!contenido de buffer a nuestro primer array "contrasena1"
!Notese que sacamos a partir de la quinta posicion (la numero
! cuatro) de buffer e introducimos en "contrasena1" a partir de
!la cero (la primera)
!De momento ya tenemos la primera contraseña felizmente
!asegurada en "contrasena1"
   
   for(::)
      if (confirmar_contrasena()==true) break;

!llama insistentemente a "confirmar_contrasena" hasta que
!esta devuelva true, igual que la otra vez

   localizacion=limbo;
];

[confirmar_contrasena x;
   do
   {
      print "Confirma password:^";
      KeyboardPrimitive(buffer,parse);
   }
   until (buffer-->0~=0 && buffer-->0<=MAX_LONG_PASSW);

!pide la confirmacion de la contraseña, igual que arriba, se
!cuda muy mucho de que lo introducido en "buffer" no se salga
!de los limites, o sea, que no sea una cadena vací­a ni mayor de
!10 (o de lo que hayamos puesto en MAX_LONG_PASSW)

   for(x=0:x<=MAX_LONG_PASSW-1:x++)
      contrasena2->x=0;

!pequeño parche de seguridad, borra uno a uno todo lo que haya
!en "contrasena2". Es para evitar que, tras un intento
!fallido, su contenido quede con restos de una contraseña
!incorrecta (es raro, pero podrí­a suceder)

   for(x=0:x<=(buffer-->0)-1:x++)
   {   
      contrasena2->x=buffer->(x+4);
   }

!pasa caracter a caracter el contenido de buffer a
!contrasena2, igual que arriba hizo con "contrasena1"

   for(x=0:x<=MAX_LONG_PASSW-1:x++)
   {   
      if (contrasena1->x ~= contrasena2->x)
      {   print "Password INCORRECTO^";
         rfalse;
      }
   }
   "^Password CORRECTO^";

!bucle de comprobacion letra a letra. Tras todas las precauciones
!anteriores, es (casi, siempre casi, recuerda XDD) seguro que
!contrasena1 y contrasena2 tienen el contenido correcto en la
!posición correcta

];

object limbo "limbo"
with descripcion "¿Como has llegado aquí­?^ Malditos betatesters...^^",
has luz;



¡Bueno! pues ya tenemos una versión Glulx de nuestro follón de contraseñas... que no funciona en absoluto en Z XDD

Por supuesto, ahora es posible mezclar los dos códigos y hacer un código fuente biplataforma usando debidamente las directivas del compilador adecuadas de tal suerte que el mismo fichero compile correctamente tanto para la una como para la otra...

¡Pero creo que a estas alturas cuanto menos ya sí­ que has comprendido lo que decí­a al principio de que esta era una situación para la que Inform no estaba preparado!


Arriba
  
 
 Asunto:
NotaPublicado: 18 Ene 2005 09:22 
Desconectado
Yiepp
Yiepp
Avatar de Usuario

Registrado: 03 Nov 2004 11:38
Mensajes: 61
Ubicación: Barcelona
Muchas gracias. Me va que ni pintado, ya que tení­a pensado poner una contraseña en mi aventura en Glulx y no sabí­a como hacerlo. Me habeis ahorrado el tener que preguntarlo más adelante... :wink:
O sea, que te cojo el código que has puesto, para mi aventura, con tu permiso, claro, porque, por que no decirlo, se ve muy claro y está bien explicado.
Fan.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Ene 2005 19:57 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 07 Sep 2004 21:52
Mensajes: 1897
gerish escribió:
urbatain escrivió:
bueno, he dicho que los ejemplos de documentate referidos a while do until etc etc no los entiendo.
ese manual ya me lo he leido muchas veces
pero
si no está para preguntar dudas....
¿para que está el foro?????? saludooooosssss!!! y gracias!!!


Pero eso que dices es información básica... sino entiendes eso...
Sólo queda un remedio, ponme código que no entiendas de los bucles y trataré de explicártelos. Dime que no entiendes exáctamente.

_________________
Ruber "Urbatain" Eaglenest.
------------------------
http://www.indieorama.com/author/rubereaglenest/


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 18 Ene 2005 21:16 
no ... no es que no entienda código
es que no se para que sirve en realidad el for do until...
tampoco se usarlo xdddd
pero, como he visto que quieren traducir la inform beginners haber si cuando esté le hecho un vistazo y así­ lo entiendo ...
gracias,
SaLuDoS!


Arriba
  
 
 Asunto:
NotaPublicado: 19 Ene 2005 04:02 
Desconectado
Implementador
Implementador
Avatar de Usuario

Registrado: 07 Sep 2004 21:52
Mensajes: 1897
¿Sólo el For Do? O todos en general?

While

Do Until

For To

¿?¿?¿?

_________________
Ruber "Urbatain" Eaglenest.
------------------------
http://www.indieorama.com/author/rubereaglenest/


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 19 Ene 2005 13:54 
todos en general...


Arriba
  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 36 mensajes ]  Ir a página Anterior  1, 2, 3

Todos los horarios son UTC + 1 hora


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado


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:  
cron
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpBB-Es.COM