Bennu Game Development

Foros en Español => Mesa de Ayuda => Mensaje iniciado por: Danielo515 en Septiembre 09, 2008, 04:47:35 pm

Título: el rand es rand pero con el rango que el quiere
Publicado por: Danielo515 en Septiembre 09, 2008, 04:47:35 pm
Si amigos, tengo un rand que siempre complace a la condición que tiene debajo, no se si es que se han liado o que. El caso es que esta línea



[code language="bennu"]crear=rand(0,200);
if(crear<=miniradar_probabilidad)
[/code]

Provoca que crear de un número aleatorio pero siempre dentro del rango (0,miniradar_probabilidad) en vez de (0,200)
¿por que pasa esto? uso la versión 0.93.
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: SplinterGU en Septiembre 09, 2008, 04:52:39 pm
q hay despues del if?

Código: [Seleccionar]
Program test;
Private
    b[41];
    i;
    n=0;
Begin
    set_mode(640,480,16);
    rand_seed(time()*10);
    n++;
    from i=0 to 41;
        b[i]=rand(0,200);
    end

    from i=0 to 20;
        write_int(0,100,10+i*10,0,&b[i*2]);
        write_int(0,200,10+i*10,0,&b[i*2+1]);
    end

    while (!key(_ESC))
        if (key(_ENTER))
            rand_seed(time()*10+n);
            n=(n+1)%10;
        end
        if (key(_ENTER)||key(_SPACE))
            from i=0 to 41;
                b[i]=rand(0,200);
            end
            while((key(_ENTER)||key(_SPACE)))
                frame;
            end
        end
        Frame;
    End
End

esto funciona perfectamente.
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: Danielo515 en Septiembre 09, 2008, 05:00:27 pm
[code language="bennu"]process creador_coches(jugador)
private
float tiempo;   
crear;
begin     
   file=fpg_minijuego;
   graph=1;
   y=20;
   
   switch(jugador)
      case 1: x=160; end
      case 2: x=320; end
      case 3: x=480; end
      case 4: x=640; end
   end
   
   write(0,x,y-3,4,jugador);
   write_var(0,x,y+3,4,crear);
   WRITE_VAR(0,x,y-10,4,timer[jugador]);
   repeat
      crear=rand(0,200);
      if(crear<=miniradar_probabilidad)
          vehiculo_miniradar(1,rand(miniradar_vel_min,miniradar_vel_max),jugador);
          timer[jugador]=0;
       end
 
     while(timer[jugador]<100)frame;end //esto garantiza que habrá al menos 1 segundo entre coche y coche

   until(ganador>0); //fin repeat cuando gane alguien
   
end //begin                   [/code]


este es el proceso.
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: SplinterGU en Septiembre 09, 2008, 07:52:56 pm
no se que valor tiene miniradar_probabilidad, pero por lo general el rand es disperso... o sea, ejecuta al azar elementos dentro de un rango que normalmente cumple con todos los valores con un orden "aleatorio"... la dispersion es mas o menos pareja... si queres una dispersion con tendencia deberias hacer operaciones combinatorias con varios rands, por ejemplo, sumar 2... o multiplicar entre si, y luego sacar el modulo para limitar a un valor maximo...

Tambien puedes buscar otros algoritmos rand... Bennu usa el de C...
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: Danielo515 en Septiembre 09, 2008, 08:06:28 pm
No me debo haber explicado, aunque eso de otros algoritmos me interesa.

El valor de la variable probabilidad es indiferente, puede ser 49 o 70, el caso es que por algún motivo el rand siempre busca valores entre (0 y probabilidad) en vez de entre (0 y 200) por lo que la condición crear<probabilidad siempre es cierta, y eso no es lo que yo quiero, para eso pongo if(1).
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: SplinterGU en Septiembre 09, 2008, 08:29:58 pm
si importa el valor... porque si me decis que es 500 siempre va a dar cierto... o 199 es muy probable que de cierto...
proba el ejemplo que te puse, vas a ver que no es como decis... tampoco confundas velocidad con probabilidad, quizas estas ejecutando demasiados rands y parece que siempre da true porque crea muchos coches, pero tenes que ver cuantas veces no se cumple el if... yo pondria un else y un contador en el else y lo imprimiria...
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: Danielo515 en Septiembre 09, 2008, 08:51:15 pm
Si te fijas splinter, sí que pongo el valor del rand, y se actualiza una vez cada segundo y da tiempo de sobra a verlo. De hecho probé a poner probabilidad=1 y rand daba siempre igual a 0 y se seguía cumpliendo la condición, eternamente. Conozco como funciona rand y he utilizado estructuras similares en otros programas con muy buenos resultados, y no se que es lo que pasa ahora.
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: SplinterGU en Septiembre 09, 2008, 09:46:41 pm
No tendra que ver con esto http://forum.bennugd.org/index.php?topic=102.msg1448#msg1448 ?

miniradar_probabilidad no es float?
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: Danielo515 en Septiembre 09, 2008, 10:15:10 pm
No, no, miniradar_probabilidad no es float, aunque no está declarado. Hice un say antes y después del if con los valores de crear y este es el resultado

[code language="bennu"]
186 antes del if
186
157 antes del if
157
10 antes del if
10
134 antes del if
134
53 antes del if
53
66 antes del if
66
98 antes del if
98
186 antes del if
186
125 antes del if
125
157 antes del if
157
39 antes del if
39
174 antes del if
174
4 antes del if
4
182 antes del if
182
182 antes del if
182
158 antes del if
158
105 antes del if
105
100 antes del if
100
133 antes del if
133
99 antes del if
99
80 antes del if
80
136 antes del if
136
130 antes del if
130
117 antes del if
117
40 antes del if
40
166 antes del if
166
94 antes del if
94
63 antes del if
63
4 antes del if
4
71 antes del if
71[/code]

Si crear vale 71 la condición if(crear<=miniradar_probabilidad(que vale 1)) no debería ser cierta, ¿no?
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: SplinterGU en Septiembre 09, 2008, 10:23:25 pm
Yo creo que no es asi...

Ejemplo, Bennu...
Código: [Seleccionar]
#ifndef __VERSION__
    import "mod_sdlevthandler";
#else
    import "mod_rand";
    import "mod_say";
    import "mod_video";
    import "libsdlhandler";
#endif

import "mod_timers";
import "mod_key";

global
miniradar_probabilidad = 75;

private
float tiempo;
crear;
begin
repeat
crear=rand(0,200);
if(crear<=miniradar_probabilidad)
    say (crear);
  timer[0]=0;
      else
          say ("false");
  end

      while(timer[0]<100&&!key(_ESC))frame;end //esto garantiza que habrá al menos 1 segundo entre coche y coche

    until(key(_ESC)); //fin repeat cuando gane alguien

say ("end");

end //begin

podes mostrar la declaracion de miniradar_probabilidad ?
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: Danielo515 en Septiembre 09, 2008, 10:39:58 pm
splinter, he probado tu ejemplo, y , como es lógico, funciona perfectamente, no se que es lo que falla en el mío. ya para ponerte sólo la declaración, espero que no te  moleste, te pongo el código todo entero, es un inc, así que no  estan todas las funciones pero si creo las más importantes.

[code language="bennu"]global
     miniradar_vel_max=500;
     miniradar_vel_min=1;
    int miniradar_probabilidad=1; //la probabilidad de que aparezca un coche
     miniradar_vel_permitida;//la velocidad máxima permitida
     miniradar_altura_banda[4];
     miniradar_limite_superior[4];
     miniradar_limite_inferior[4];
     miniradar_multiplicador;
end


process velocimetro_miniradar(altura,velocidad,jugador);
private
   puntaje;
begin
   if(altura<miniradar_limite_superior && altura>miniradar_limite_inferior) //si está dentro de los límites de la foto
         if(velocidad>miniradar_vel_permitida)
            puntaje=velocidad*miniradar_multiplicador;
         else
                                puntaje=velocidad*miniradar_multiplicador*(-1);
         end
            
         puntos[jugador]+=puntaje;
   end //if de evaluación de límites
end //begin     



process foto_miniradar(jugador)
begin
frame;
end



Process vehiculo_miniradar(tipo,float velocidad,jugador);
Private
   pulsandoboton;
   fotos=1;   //valor máximo 1
   vel_G;
Begin
   file=0;
   velocidad=velocidad/100;
   graph=map_clone(fpg_minijuego,1);
   vel_G=write_in_map(0,velocidad,4);
   map_put(0,graph,vel_G,25,15);
   switch(jugador)
      case 1: x=160; end
      case 2: x=320; end
      case 3: x=480; end
      case 4: x=640; end
   end
         
      
      repeat
         y+=velocidad;
      
         if(botones[jugador] && fotos>0)
            velocimetro_miniradar(y,velocidad,jugador);
            foto_miniradar(jugador);
            fotos--;
         end     
         frame;
      until(y<0);
      
      

   //explosión de las naves o algo
End   
   
      
         
process creador_coches(jugador)
private
float tiempo;   
int crear;
begin     
   file=fpg_minijuego;
   graph=1;
   y=20;
   
   switch(jugador)
      case 1: x=160; end
      case 2: x=320; end
      case 3: x=480; end
      case 4: x=640; end
   end
   
   write(0,x,y-3,4,jugador);
   write_var(0,x,y+6,4,crear);
   WRITE_VAR(0,x,y-10,4,timer[jugador]);
   repeat
      crear=rand(0,200);
      say(crear+" antes del if");
      
      if( crear << 10 )
         vehiculo_miniradar(1,rand(miniradar_vel_min,miniradar_vel_max),jugador);
          timer[jugador]=0;
       else
       say("false");
       end
       
        say(crear);
     while(timer[jugador]<100)frame;end //esto garantiza que habrá al menos 1 segundo entre coche y coche

   until(ganador>0); //fin repeat cuando gane alguien
   
end //begin                   


process dificultad_miniradar();
private
tiempo_corto;
tiempo_largo;
tiempo_super;
begin
timer[5]=0;
repeat
   if(timer[5]>100)
      tiempo_corto++;
      tiempo_largo++;
      tiempo_super++;
   end
   
   if(tiempo_corto>=5)
      miniradar_vel_max+=10;
      tiempo_corto=0;
      
   end
   
   if(tiempo_largo>=10)
      miniradar_vel_min+=5;
      tiempo_corto=0;
      
   end 
   
   if(tiempo_super>=30)
   //aqui poner el cambio de escenario
   tiempo_super=0;
   end
   
   timer[5]=0;
   frame;
   
until(ganador>0)
end


Process miniradar();
Begin
   // RECURSOS
    fpg_minijuego=LOAD_FPG("minialunizaje.fpg");
   // COLOCAMOS OBJETOS EN PANTALLA Y PREPARAMOS EL MINIJUEGO
   drawing_map(0,0);   //dibujamos en el fondo un suelo verde
   drawing_color(200);
   draw_box(0,400,800,600);
   from i=1 to jugadores; creador_coches(i); end //creamos los creadores XD
   // PREPARADOS, LISTOS...
   getready();
   // YA! 
   dificultad_miniradar();
   while(ganador==0) frame; end //aquí nos quedamos hasta que gane alguien
   // ESPERAMOS UNOS SEGUNDOS Y SALIMOS DEL MINIJUEGO
   frame(5000); //esperamos un poquico
   menu(1); //y salimos del minijuego
End

               
[/code]
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: HaCkZJuaNN en Septiembre 09, 2008, 11:21:16 pm
dos cosas. La primera, te recomiendo que pongas los tipos de todas las variables, especialmente las de los parametros de los procesos y funciones, ya que eso te puede dar muchos problemas, no siempre se presupone que es int si se omite, sino el último tipo que declaraste, o algo así... lo mejor es ponerlo siempre en todas las variables. La segunda, el <<, sé que significa mucho menor en matemáticas(creo), pero en bennu no sé como actúa... me suena que en c es algo de los bits... por qué lo has usado???
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: SplinterGU en Septiembre 10, 2008, 12:08:39 am
<< es rotacion de bits... eso no es comparacion... obviamente eso te dara true...

cuando uno pone un ejemplo de algo que supuestamente falla, hay que tratar de ponerlo tal cual lo esta usando...

PD: Danielo515, revisa tus PMs...
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: Danielo515 en Septiembre 10, 2008, 12:30:29 am
Lo he usado porque ya estaba desesperado, con la versión normal tampoco funcionaba. Normalmente pongo todos los tipos de variables, pero me estava volviendo algo vago. Mejoraré eso.

Bueno, he quitado la rotación de bits y sigo teniendo el mismo problema.
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: SplinterGU en Septiembre 10, 2008, 01:30:26 am
probaste con la version que te pase por pm?
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: Danielo515 en Septiembre 10, 2008, 10:48:24 am
Splinter, ya te he contestado el PM.
Volviendo a esta locura de código, decidí documentar el error todo lo que pudiera y puse un say, en ese if dentro del else, y en el stout pone

122 antes del if
false
122

El caso es que también puse say("true") dentro de ese mismo if y solo sale cuando la condición es cierta, y por supuesto no aparece el false

10 antes del if
true
10

Es como si solo se ejecutaran esas dos sentencias (la del coche y la que pone el contador a cero) porque sí, como si estuvieran fuera del if, pero el say está debajo de ellas y lo toma como dentro....
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: Danielo515 en Septiembre 10, 2008, 10:55:52 am
Tataratataaaaaaaaaaaaa, piiiiiiiiiiipiripipiiiiiiiiiiiii wuuwuuuwuuwuuuuuuuuuuuuuuuuuu lolololooooooooooo pegadme pegadme un tiiiiro, pegadme patadas en los webiiillos, ya he encontrado el problema y ahora, me doy pena. (lease con cierto hilo musical). El problema de todo esto, es que el único frame que tenía el proceso era dentro de

while(timer[jugador]<100)frame;end

Esto probocaba que el resto de las veces las demás sentencias se ejecutaran a tal velocidad que no se apreciaban y pareciera que la condición siempre fuera verdadera, pero no, el problema es que solo se mostraba cuando era verdadera y el resto de las veces se ejecutaba el código a toda hostia. Con poner un frame justo al final del loop principal, todo empezó a funcionar como dios manda. MUCHAS GRACIAS A TODOS POR VUESTRA PACIENCIA Y CONFIANZA!!

pd: QUE ridiculo  me siento  :-\
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: SplinterGU en Septiembre 10, 2008, 11:46:24 am
es lo que te dije

tampoco confundas velocidad con probabilidad, quizas estas ejecutando demasiados rands y parece que siempre da true porque crea muchos coches, pero tenes que ver cuantas veces no se cumple el if... yo pondria un else y un contador en el else y lo imprimiria...
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: Danielo515 en Septiembre 10, 2008, 11:57:08 am
Es que  yo te entendí que como los coches bajaban muy rápido parecía que salían muchos muy seguidos, y el problema es que solo se mostraban por pantalla los resultados que cumplían la condición, por eso parecía siempre verdadera. Problemas de frames que arrastro desde los 12 años en div2.
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: SplinterGU en Septiembre 10, 2008, 01:42:03 pm
la cosa es que se ejecutan tantas instruccion a la vez que parece que siempre da true...
Título: Re: el rand es rand pero con el rango que el quiere
Publicado por: Danielo515 en Septiembre 10, 2008, 10:44:39 pm
Efectivamente....