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 :)
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
La semilla?perdona pero no te entiendo :-[
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 ;)
http://forum.bennugd.org/index.php?topic=849.0
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
Porque se basa en el tiempo (reloj del procesador), un ramdom no se genera por magia, tiene que basearse en algo.
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.
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
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 ^^
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.