Problema con numeros aleatorios

Started by errpoh, March 18, 2011, 11:41:46 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

errpoh

Hola buenas! este es mi primer post,y aprovecho para decir que acabo de ponerme a programar con BennuGD,aunque no es la primera vez que programo,y la verdad que me parece un lenguaje muy simple y con grandes posibilidades,pero probandolo me ha surgido un problema,no se si es una tonteria o que no lo hago bien,pero cada vez que intento calcular un numero aleatorio,siempre me sale el mismo:
PROGRAM controls;
import "mod_video";
import "mod_joy";
import "mod_text";
import "mod_proc";
import "mod_say";
import "mod_rand";
INCLUDE "DLL\import.prg";

GLOBAL
   vel=10;
   tam=30;
   i=0;
   c;
   num;
BEGIN
   set_mode(320,240,16);
   load_fpg("images/sprites.fpg");
   fondo();
   movs();
   num=rand(1,100);
   FOR(c=0;c<=num;c+=1)
         enemigo();
      END
   LOOP

      //--------------------------fin del bucle(captura de teclas de EXIT)--------------------------
      IF (key(_esc))            //Condición: Si se pulsa la tecla _esc
         exit(0);            //Salimos del juego
      END               //Fin de la condición
      IF (get_joy_button(0,8))
         let_me_alone(); exit();
      END
      FRAME;               //Mostramos el resultado por pantalla
   END               //Fin de las instrucciones que se repiten siempre
END                  //Fin del programa

PROCESS movs()
BEGIN
graph=1;
   x=160;
   y=120;
   z=1;
   LOOP
      IF (get_joy_button(0,0))//ARRIBA
         y-=5;
      END
      IF (get_joy_button(0,1))//ARRIBA/IZQUIERDA
         y-=5;
         x-=5;
      END
      IF (get_joy_button(0,2))//IZQUIERDA
         x-=5;
      END
      IF (get_joy_button(0,3))//IZQUIERDA/ABAJO
         y+=5;
         x-=5;
      END
      IF (get_joy_button(0,4))//ABAJO
         y+=5;
      END
      IF (get_joy_button(0,5))//ABAJO/DERECHA
         y+=5;
         x+=5;
      END
      IF (get_joy_button(0,6))//DERECHA
         x+=5;
      END
      IF (get_joy_button(0,7))//DERECHA/ABAJO
         y-=5;
         x+=5;
      END
      //---------------DISPAROS--------------------
      IF(get_joy_button(0,15))//DISPARO ARRIBA
         disparo1();
      END
      IF(get_joy_button(1,1))//DISPARO ARRIBA
         disparo1();
      END
      IF(get_joy_button(0,13))//DISPARO DERECHA
         disparo2();
      END
      IF(get_joy_button(0,14))//DISPARO ABAJO
         disparo3();
      END
      IF(get_joy_button(0,12))//DISPARO IZQUIERDA
         disparo4();
      END
      //---------------LIMITES DE MOVIMIENT0----------
      IF(x<tam/2)
         x=tam/2;
      END
      IF(x>320-tam/2)
         x=320-tam/2;
      END
      IF(y<tam/2)
         y=tam/2;
      END
      IF(y>240-tam/2)
         y=240-tam/2;
      END
      FRAME;
   END   
END

PROCESS disparo1()
BEGIN
   x=father.x;
   y=father.y;
   graph=2;
   size=size-40;
   z=2;
   LOOP
      y-=vel;
      IF(y<0)
         BREAK;
      END
      FRAME;
   END
END
PROCESS disparo2()
BEGIN
   x=father.x;
   y=father.y;
   graph=2;
   size=size-40;
   z=2;
   LOOP
      x+=vel;
      IF(x>320)
         BREAK;
      END
      FRAME;
   END
END
PROCESS disparo3()
BEGIN
   x=father.x;
   y=father.y;
   graph=2;
   size=size-40;
   z=2;
   LOOP
      y+=vel;
      IF(y>240)
         BREAK;
      END
      FRAME;
   END
END
PROCESS disparo4()
BEGIN
   x=father.x;
   y=father.y;
   graph=2;
   size=size-40;
   z=2;
   LOOP
      x-=vel;
      IF(x<0)
         BREAK;
      END
      FRAME;
   END
END
PROCESS fondo()
BEGIN
   x=0;
   y=0;
   graph=3;
   z=3;
   LOOP
      FRAME;
   END
END
PROCESS enemigo()
BEGIN
   x=rand(10,310);
   graph=2;
   z=2;
   LOOP
      y+=5;
      IF(y>240)
         y=0;
         x=rand(10,310);
      END
      IF ( collision ( type disparo1 ) or collision(type disparo2) or collision(type disparo3)or collision(type disparo4))
         BREAK;
      END
      FRAME;
   END;
END;

El juego lo estoy desarrollando para Caanoo,pero eso es lo de menos,ya que tambien funciona en el PC,aunque los controles no funcionan para el PC claro...

El problema me lo da la variable num del bucle FOR

Gracias de antemano  :)

FreeYourMind

Esto ya lo he comentado por aqui hace tiempo, te sale por tu procesador de Caanoo xD
Tienes que definir la semilla al iniciar el programa para que funcione  :D

errpoh

La semilla?perdona pero no te entiendo  :-[

FreeYourMind

Te voy a enseñar un truco, ya que es mejor enseñarte a pescar que darte el pez :)
En el buscador escribe semilla, veras como al instante sabras lo que te falta  ;)


errpoh

Muchas gracias,todo solucionado  ;D

he metido rand_seed(time()); y todo va perfecto,lo que no termino de entender es para que sirve...
porque time()? y si pongo una variable o un numero fijo?en que cambia?

espero no resultar pesado jeje

FreeYourMind

Porque se basa en el tiempo (reloj del procesador), un ramdom no se genera por magia, tiene que basearse en algo.

SplinterGU

los numeros random se calculan a partir de una semilla, para una misma semilla siempre obtendras el mismo conjunto de numeros, time() te da los segundos transcurridos desde 1 enero de 1970... con setear la semilla con el valor retornado por time() te aseguras que por lo menos por cada segundo obtendras un conjunto de numeros random diferentes.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Todo ok, pero en mi experiencia recuerdo que el primer número generado de la serie (Al menos en ejecuciones relativamente cercanas) también resulta igual o bastante cercano en valor al anterior.

Generalmente suelo poner:

rand_seed ( time ( ) );
rand ( 0 , 1 );

La segunda instrucción para "desperdiciar" ese primer valor, manías mías :D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

errpoh

si,yo sabia que los numeros aleatorios,en un pc al menos se tomaban de una tabla de aleatorios o algo asi...bueno,todos los dias se aprende algo jeje

Muchas gracias ^^

SplinterGU

no se toman de una tabla, sino de unos calculos que en cada llamada usan el valor anterior... o mejor dicho, el ultimo valor modifica la semilla y el algoritmo usa la semilla actual como dato de entrada para el algoritmo que da un numero random.

yo tenia la formula estandard, pero vaya a saber donde esta.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2