CAAD

Comunidad de Aventuras Conversacionales y Relatos Interactivos
Fecha actual 11 Jul 2020 06:43

Todos los horarios son UTC + 1 hora




Nuevo tema Responder al tema  [ 32 mensajes ]  Ir a página Anterior  1, 2, 3  Siguiente
Autor Mensaje
 Asunto:
NotaPublicado: 24 Dic 2005 15:39 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 15 Dic 2004 21:28
Mensajes: 2302
Radio Marte Libre escribió:
Attomole, en su estado actual, no te va a ofrecer más facilidades que usar Inform "a pelo". Vamos a reconsiderar paso por paso tu duda y ver las alternativas.


Copiado de la documentación de io.h de Attomole:

Citar:
* BN_Input(ventana, array)
Espera a que el jugador complete una lí­nea de texto y pulse return
en la ventana que se le pasa como parámetro. Retorna en el array la
secuencia de letras que el jugador ha escrito. El elemento
array-->0 contendrá cuantas letras ha escrito y los elementos
array-->4 hasta array-->(4+array-->0) cada uno de los códigos ascii
de esas letras.

El array en cuestión debe haber sido declarado previamente con un
tamaño mí­nimo de TAMANYO_BUFFER_INPUT_LEN (constante definida en
io.h con el valor 120)


Además, en los fuentes de menus.h tienes el método ascii_a_entero que precisamente hace lo que quieres, y que puedes usar desde tu código (aunque no uses los menús).

Con Inform a pelo, te tendrí­as que currar tú esas funciones.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 24 Dic 2005 18:05 
Desconectado
Grafista
Grafista

Registrado: 09 Mar 2004 17:20
Mensajes: 504
presi escribió:
Copiado de la documentación de io.h de Attomole:

Citar:
* BN_Input(ventana, array)
Espera a que el jugador complete una lí­nea de texto y pulse return
en la ventana que se le pasa como parámetro. Retorna en el array la
secuencia de letras que el jugador ha escrito. El elemento
array-->0 contendrá cuantas letras ha escrito y los elementos
array-->4 hasta array-->(4+array-->0) cada uno de los códigos ascii
de esas letras.

El array en cuestión debe haber sido declarado previamente con un
tamaño mí­nimo de TAMANYO_BUFFER_INPUT_LEN (constante definida en
io.h con el valor 120)


...Que reaulta ser exactamente (y recalco lo de "exactamente") lo mismo (incluyendo la creación y manejo de los arrays) que harí­as en Inform con una simple sentencia "read" (compilando para Z) o llamando a la rutina "KeyboardPrimitive" (si compilas para Glulx). Y además esta rutina BN_Input() sigue sin manejar números. Lo cual confirma que, como decí­a, Atto, en su estado actual, no aporta ninguna ventaja ni facilidad adicional.

Presi escribió:
Además, en los fuentes de menus.h tienes el método ascii_a_entero que precisamente hace lo que quieres, y que puedes usar desde tu código (aunque no uses los menús).


...rutina que resulta hacer exactamente lo mismo que la función "IntentaNumero" que, como indicaba en los mensajes anteriores, ya existe en InformATE (es decir, transforma un input del usuario en su correspondiente valor numérico, si de un número se tratara) con la salvedad del lí­mite de 10000 (que se quita con una leve modificación del original). Lo cual confirma que, como decí­a, Atto, en su estado actual, no aporta ninguna ventaja ni facilidad adicional. (me encanta copypastearme a mi mismo :twisted: )

Presi escribió:
Con Inform a pelo, te tendrí­as que currar tú esas funciones.


Como ves, no es así­ :)
Usar Atto para esto está bien como curiosidad, pero no porque con ella vayas a conseguir cosas que no conseguirí­as con Inform-InformATE tal cual está ahora.

¡Hey! y como este sea probablemente mi último post del dí­a, aprovecho para desearos a todos que la nochebuena sea lo más feliz y divertida posible. Y a ver si el 2006 es el año en el que Attomole nos muestra a todos de verdad su potencial oculto (venga, presi, tu que estabas en ello... :) )


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 24 Dic 2005 18:17 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 15 Dic 2004 21:28
Mensajes: 2302
Radio Marte Libre escribió:
Presi escribió:
Con Inform a pelo, te tendrí­as que currar tú esas funciones.


Como ves, no es así­ :)
Usar Atto para esto está bien como curiosidad, pero no porque con ella vayas a conseguir cosas que no conseguirí­as con Inform-InformATE tal cual está ahora.


El que te confundes eres tú, Inform a pelo es Inform tal cual sin ninguna librerí­a, lo que pasa es que por una extraña razón tú estás usando como sinónimos Inform a pelo e Inform con InformATE, pero insisto que Inform se puede usar sin InformATE (y sin la librerí­a inglesa) y es a lo que yo me referí­a.


Arriba
 Perfil  
 
NotaPublicado: 25 Dic 2005 22:24 
Desconectado
Grafista
Grafista

Registrado: 09 Mar 2004 17:20
Mensajes: 504
A todo esto, la rutina "Decimal_a_Binario" de Blag tiene un comportamiento curioso. En Z no pilla bien decimales superiores a 31 y en Glulx se queda en 1023, usea, se lí­a a partir de 6 y 11 dí­gitos binarios respectivamente.

Lo cual nos lleva a que, si en ese caso no nos preocupa el lí­mite autoimpuesto por InformATE de 10000... la cosa es bastante sencilla.

Pongamos un ejemplo de juego en el que una orden determinada, llamemosla "xyzzy" invita al jugador a introducir un número y le devuelve su valor en binario. Para ello no habrí­a más que hacer una aventura estandar cualquiera, con sus habitaciones y objetos, y añadir por una parte la gramática de nuestra nueva acción, es decir, en cualquier sitio posterior al Include "gramatica"; pondrí­amos
Código:
Verb 'Xyzzy'
   *   ->   Xyzzy;


Y crearí­amos la rutina "sub" correspondiente, que podrí­a ser algo como esto:

Código:
[XyzzySub x;
   
   print "Introduce número:^";
   KeyboardPrimitive(buffer,parse);
   
   !Invita al usuario a introducir un número
   !y lo recibe llamando a KeyboardPrimitive,
   !en principio, esto funciona tanto en Glulx
   !como en Z
   
   x=IntentarNumero(1);
   if (x==-1000) "Eso no ha sido muy ~numérico~...";
   
   !llama a la rutina "IntentarNumero"
   !indicandole que trate de reconocer como
   !un numero la primera palabra del texto
   !introducido. Si no lo consigue, lo indica
   !con un mensaje y acaba la función
   
   Decimal_a_Binario(x);
   
   !llama a la rutina "Decimal_a_Binario de Blag
];


Con esto puedes teclear "Xyzzy" en cualquier momento de la aventura e invocar a la rutina de conversión... que adolecerá de las limitaciones expuestas en cuanto a los números que pueda aceptar.

Mientras caigo en qué es lo que falla exactamente con el problema de los números superiores a 31 y 1023, lo del "10000" tiene otro lado por donde cogerse. Si estamos en Glulx y, por tanto, no nos preocupa ese lí­mite, podemos hacer uso del punto de entrada "InterpretarNumero".
Este "punto de entrada" es, precisamente, llamado, siempre y cuando el usuario lo cree expresamente, desde la rutina "IntentarNumero". Es decir, "IntentarNumero" comprueba que "InterpretarNumero" existe, y, en caso afirmativo le cede el control siempre y cuando "InterpretarNumero" no retorne 0 (false).

Así­, si queremos saltarnos el comportamiento por defecto de "IntentarNumero" ya no tendrí­amos que pasar por el proceso estandar de reemplazarla (como yo mismo sugerí­a hace unos posts) sino que bastarí­a que creasemos una rutina llamada "InterpretarNumero" que analizase el texto sin autoimponerse el lí­mite de 10000. No habrí­a mayor problema con que retornase 0 porque en ese caso "IntentarNumero" seguirí­a su proceso normal, y el cero sí­ que puede manejarlo.

Aunque, por supuesto, mientras no tengamos claro qué es lo que pasa luego al convertir a binario no nos iba a servir de mucho, sigamos investigando... :?


Arriba
 Perfil  
 
NotaPublicado: 25 Dic 2005 23:19 
Desconectado
Grafista
Grafista

Registrado: 09 Mar 2004 17:20
Mensajes: 504
Radio Marte Libre escribió:
Aunque, por supuesto, mientras no tengamos claro qué es lo que pasa luego al convertir a binario no nos iba a servir de mucho, sigamos investigando... :?


Uuuupsiieeee, de momento ya he constatado que, en sus procesos internos, las variables de la rutina Decimal_a_Binario sobrepasan con creces, efectivamente, los valores máximos tanto para Z como para Glulx a poco que los números decimales introducidos sean superiores a 31 y 1023 respectivamente... :x habrí­a que pensar otra cosa para lo de la conversión en si...


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Dic 2005 00:36 
Desconectado
Dragón
Dragón
Avatar de Usuario

Registrado: 30 Nov 2005 20:53
Mensajes: 136
Ubicación: Lima - Perú
Jejeje....Parece que mi pequeño programa ha generado controversia :lol:

Recién hoy en la noche voy a continuar con mis experimentos :wink:

En realidad no me importa mucho que el programa soporte solamente ingresar el número 10...el 100...el 1000 o el 1,000,000 8) Lo único que quiero es demostrar que el Decimal a Binario se puede programar donde sea :D Simplemente voy a colocar el código fuente en Código Latino, junto con las versiones en PHP, ADA, C++...etc :D

De todos modos, gracias por todas sus colaboraciones y comentarios.....Si se puede hacer que el programa sea 100% estable, pues estarí­a más que feliz :twisted:

Saludos,

Blag :twisted:

_________________
Alvaro Tejada Galindo
Consultor ABAP Senior - Mentor SAP
http://atejada.blogspot.com
http://tinyurl.com/jnlfd
Lima - Perú


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Dic 2005 15:07 
Desconectado
Dragón
Dragón
Avatar de Usuario

Registrado: 30 Nov 2005 20:53
Mensajes: 136
Ubicación: Lima - Perú
:cry: Ayer estuve haciendo unos experimentos....y no funciona :cry:

Espero que sea simplemente por el hecho de no tengo mucha experiencia en InformATE :wink:

Aquí­ está el código....

Código:
Constant Historia "Decimal a Binario^";
Constant Titular "^Blag - SinglePath games design. ";
Release 1;

Array numero_dec->12;

Include "EParser";
Include "Acciones";

Object Programa "Programa"
    with descripcion "Programa",
has luz;

Object Num "Numero" Programa
   with nombre 'numero',
   antes
   [;
   examinar:
        ascii_a_entero(numero_dec,2);
        print numero_dec;
!        ConvertirSub(numero_dec);
        "";
   ],
has masculino;

[Decimal_a_Binario num suma expo digito;
suma = 0;
expo = 1;

while (num > 0)
{
digito = num % 2;
num = num / 2;
suma = suma + digito * expo;
expo = expo * 10;
}
print suma;
];

[ ConvertirSub ;
  Decimal_a_Binario(numero_dec);
];

[ascii_a_entero cad len res i;

       if (len==0) return -1;
       res = 0;
       for (i=0:i<len:i++)
       {
          res=res*10;
          if ((cad->i < '0') || (cad->i >'9')) return -1;
          res=res+(cad->i - '0');
       }
       return res;
];

[Inicializar Test;

print "Ingresa un número: ";
numero_dec->0=9;
KeyboardPrimitive(numero_dec,Test);

localizacion = Programa;
];

Include "Gramatica";

verb 'convierte'
* number -> Convertir;


Como pueden ver....he intentado utilizar la rutina ascii_a_entero y luego imprimir el valor ingresado por el usuario...pero no se puede :cry: Si por ejemplo ingreso el número 15, el programa imprime 5006....

Saludos,

Blag :cry:

_________________
Alvaro Tejada Galindo
Consultor ABAP Senior - Mentor SAP
http://atejada.blogspot.com
http://tinyurl.com/jnlfd
Lima - Perú


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Dic 2005 15:20 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 15 Dic 2004 21:28
Mensajes: 2302
Blag escribió:
Como pueden ver....he intentado utilizar la rutina ascii_a_entero y luego imprimir el valor ingresado por el usuario...pero no se puede :cry: Si por ejemplo ingreso el número 15, el programa imprime 5006....


ascii_a_entero() devuelve el entero, no cambia el parámetro.

Por cierto esa función viene en Attomole, que se distribuye bajo LGPL, asi que tu código también deberá hacerlo bajo esa misma licencia.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Dic 2005 15:32 
Desconectado
Dragón
Dragón
Avatar de Usuario

Registrado: 30 Nov 2005 20:53
Mensajes: 136
Ubicación: Lima - Perú
Citar:
ascii_a_entero() devuelve el entero, no cambia el parámetro.


Lo sé :wink: Me di cuenta por el return res; :D Lo que pasa es que no sabí­a como declarar variables.....y tení­a un poco de sueño....así­ que lo deje así­ 8)

Citar:
Por cierto esa función viene en Attomole, que se distribuye bajo LGPL, asi que tu código también deberá hacerlo bajo esa misma licencia.


De eso no hay duda...Yo siempre respeto el trabajo de los demás 8) Es lo mí­nimo que debe de hacer un programador :D

Pero aún así­....no me sale :cry:

Código:
[Inicializar Test numero_aux;

print "Ingresa un número: ";
numero_dec->0=9;
KeyboardPrimitive(numero_dec,Test);
numero_aux = ascii_a_entero(numero_dec,2);
print numero_aux;

localizacion = Programa;
];


Me imprime -1 cuando ingreso "15" :cry:

Saludos,

Blag :(

_________________
Alvaro Tejada Galindo
Consultor ABAP Senior - Mentor SAP
http://atejada.blogspot.com
http://tinyurl.com/jnlfd
Lima - Perú


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Dic 2005 16:15 
Desconectado
Semimomio
Semimomio
Avatar de Usuario

Registrado: 15 Dic 2004 21:28
Mensajes: 2302
Blag escribió:
Código:
[Inicializar Test numero_aux;

print "Ingresa un número: ";
numero_dec->0=9;
KeyboardPrimitive(numero_dec,Test);
numero_aux = ascii_a_entero(numero_dec,2);
print numero_aux;

localizacion = Programa;
];


Me imprime -1 cuando ingreso "15" :cry:


El problema está en que no interpretas bien el array procedente de Keyboardprimitive(), que según el manual de Inform el primer carácter del usuario se devuelve en la posición 2, es decir en numero_dec->2.


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Dic 2005 18:11 
Desconectado
Grafista
Grafista

Registrado: 09 Mar 2004 17:20
Mensajes: 504
Blag escribió:
Me imprime -1 cuando ingreso "15" :cry:
Saludos,
Blag :(


Si te estoy siguiendo bien, tu intención es hacer un programa que empieze pidiendo un número al usuario, luego lo situe en una localidad llamada "programa" en la que hay un objeto "numero" que al ser "examinado" devuelve el valor binario del numero introducido al principio ¿correcto?

Si vas a incluir las librerí­as de InformATE, no necesitas ni declarar los arrays ni copiar la rutina ascii_a_entero de Attomole, porque ese trabajo ya está hecho en estas. Veamos un ejemplo (siempre asumiendo, claro, que no te importan los lí­mites de los que hablaba antes)

Código:
Constant Historia "~Inputting Blag~";
Constant Titular "^Ensayando...^";
Release 0;

!Las constantes habituales...

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

!Los includes de rigor...

Object programa "Programa"
with
descripcion "Programa",
has luz;

!La localidad "programa"...

Object num "Número" Programa
with
nombre 'numero',
valor 0,
descripcion
[;
   Decimal_a_Binario (self.valor);
],
has masculino;

!El objeto "numero". Notese que le hemos
!colocado una propiedad llamada "valor" y que a su
!vez la propiedad "descripcion" lo que hace es pasarsela
!a la rutina "Decimal_a-binario"

[Inicializar;
   print "Ingresa número:^";
   KeyboardPrimitive (buffer, parse);
   num.valor=IntentarNumero(1);
   localizacion = Programa;
];

!En la rutina inicializar le pedimos un
!numero al jugador mediante "KeyboardPrimitive"
!lo convertimos en un valor numerico mediante
!"IntentarNumero", y adjudicamos el resultado
!a la propiedad valor del objeto "num"
!La única salvedad a tener en cuenta es que si
!metemos numeros fuera de los limites mencionados
!o cualquier otra cosa el resultado será cualquier
!cosa inesperada

[Decimal_a_Binario num suma expo digito;
   
   suma = 0;
   expo = 1;

   while (num > 0)
   {
      digito = num % 2;
      num = num / 2;
      suma = suma + digito * expo;
      expo = expo * 10;
   }
   
   print suma;
];

Include "Gramatica";


Prueba a ver si te gusta así­! Y si eso ya luego pensamos alguna manera de saltarnos los lí­mites (suponiendo que merezca la pena el esfuerzo XDD )

Por otra parte, lo mismo ni te interesa andar usando la estructura habitual de una "aventura", es decir, andar liandote con habitaciones y objetos...
El siguiente ejemplo no pasa ni de la rutina inicializar. En ella el programa le pide un número al usuario y le devuelve su valor binario. El proceso se repite indefinidamente hasta que se introduce cualquier texto no numerico, momento en que se cierra el programa:

Código:
Include "EParser";
Include "Acciones";
Include "Mensajes";

[Inicializar num_dec;
   while (true)
   {
      print "Ingresa número:^";
      KeyboardPrimitive (buffer, parse);
      num_dec=IntentarNumero(1);
      if (num_dec==-1000) break;
      Decimal_a_Binario(num_dec);
   }
   quit;
];

[Decimal_a_Binario num suma expo digito;
   
   suma = 0;
   expo = 1;

   while (num > 0)
   {
      digito = num % 2;
      num = num / 2;
      suma = suma + digito * expo;
      expo = expo * 10;
   }
   
   print suma,"^";
];

Include "Gramatica";


Un poco más minimalista, pero supongo que más parecido a lo que estabas haciendo en otros lenguajes, ¡todo es probar variantes del tema! :wink:


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Dic 2005 19:53 
Desconectado
Momio
Momio
Avatar de Usuario

Registrado: 09 Mar 2004 16:14
Mensajes: 4651
Movido el tema a 'General InformATE', donde al menos esta un poco on-toppic, porque en el foro de Autores de Aventuras no :lol:

_________________
Sígueme en twitter: @uto_dev
http://www.ngpaws.com


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Dic 2005 20:27 
Desconectado
Dragón
Dragón
Avatar de Usuario

Registrado: 30 Nov 2005 20:53
Mensajes: 136
Ubicación: Lima - Perú
Citar:
Movido el tema a 'General InformATE', donde al menos esta un poco on-toppic, porque en el foro de Autores de Aventuras no :lol:


Y yo que pensaba que las ibas a dejar, porque se trata de una aventura numérica :lol:

Citar:
Por otra parte, lo mismo ni te interesa andar usando la estructura habitual de una "aventura", es decir, andar liandote con habitaciones y objetos...
El siguiente ejemplo no pasa ni de la rutina inicializar. En ella el programa le pide un número al usuario y le devuelve su valor binario. El proceso se repite indefinidamente hasta que se introduce cualquier texto no numerico, momento en que se cierra el programa:


Acabo de probar tu código y me he dado cuenta de dos cosas...

La primera....Radio Marte Libre es mi nuevo í­dolo aventurero :D :D :D Y la segunda.... :wink: Tengo que estudiar más InformATE :wink:

La verdad es que código me ha encantado...Muy bueno!!!

Lo voy a publicar en Código Latino # 4 8) Así­ que no dudes en que los correspondientes agradecimientos van a ir incluidos :D

Citar:
i te estoy siguiendo bien, tu intención es hacer un programa que empieze pidiendo un número al usuario, luego lo situe en una localidad llamada "programa" en la que hay un objeto "numero" que al ser "examinado" devuelve el valor binario del numero introducido al principio ¿correcto?


Esa era mi idea inicial....Puesto que como InformATE sirve para hacer juegos IF....Pero en fí­n.....más vale la simplicidad que la belleza :wink:

Una vez más, gracias a todos y sobre todo al gran Radio Marte Libre :idea:

Por mi parte, el programa está terminado, y este post finalizado 8)

Saludos,

Blag :twisted:

_________________
Alvaro Tejada Galindo
Consultor ABAP Senior - Mentor SAP
http://atejada.blogspot.com
http://tinyurl.com/jnlfd
Lima - Perú


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Dic 2005 21:34 
Desconectado
xyzzy

Registrado: 09 Mar 2004 22:50
Mensajes: 9150
Blag escribió:
Lo voy a publicar en Código Latino # 4 8) Así­ que no dudes en que los correspondientes agradecimientos van a ir incluidos :D
Blag :twisted:


¿Agradecimientos?
Yo sinceramente, le darí­a la autorí­a. ;P

Saludos
Jenesis (presidenta del club de fans de RML) :D


Arriba
 Perfil  
 
 Asunto:
NotaPublicado: 27 Dic 2005 21:48 
Desconectado
Dragón
Dragón
Avatar de Usuario

Registrado: 30 Nov 2005 20:53
Mensajes: 136
Ubicación: Lima - Perú
Citar:
¿Agradecimientos?
Yo sinceramente, le darí­a la autorí­a. ;P


Bueno......este......humm......yo...... :oops:

Es un código compartido.... RML me ayudó con lo que todaví­a no habí­a aprendido de InformATE.... :wink:

Su código es este:

Código:
[Inicializar num_dec;
   while (true)
   {
      print "Ingresa número:^";
      KeyboardPrimitive (buffer, parse);
      num_dec=IntentarNumero(1);
      if (num_dec==-1000) break;
      Decimal_a_Binario(num_dec);
   }
   quit;
];


y el mí­o es este:

Código:
[Decimal_a_Binario num suma expo digito;
   
   suma = 0;
   expo = 1;

   while (num > 0)
   {
      digito = num % 2;
      num = num / 2;
      suma = suma + digito * expo;
      expo = expo * 10;
   }
   
   print suma,"^";


Obviamente, el programa no funcionarí­a si ambas partes, así­ que los agradecimientos, se convierten en una [b]CO-AUTORí

_________________
Alvaro Tejada Galindo
Consultor ABAP Senior - Mentor SAP
http://atejada.blogspot.com
http://tinyurl.com/jnlfd
Lima - Perú


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

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