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.
q hay despues del if?
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.
[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.
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...
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).
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...
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.
No tendra que ver con esto http://forum.bennugd.org/index.php?topic=102.msg1448#msg1448 ?
miniradar_probabilidad no es float?
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?
Yo creo que no es asi...
Ejemplo, Bennu...
#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 ?
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]
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???
<< 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...
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.
probaste con la version que te pase por pm?
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....
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 :-\
es lo que te dije
Quote from: SplinterGU on September 09, 2008, 08:29:58 PM
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...
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.
la cosa es que se ejecutan tantas instruccion a la vez que parece que siempre da true...
Efectivamente....