Bueno, esto no furula ni pa dios XD. Debería valorar todas las variables de los coches y hacer fotos o no en consecuencia. El problema es que solo debe valorar los procesos que estén en la region dos, de ahí que rompa el bucle cuando no coinciden con la region (jugador es = a region). También intenté que no se repitieran las ids, de ahí lo de la variable lastid, pero tengo monitorizadas las ids con las que trabaja y se mantiene mucho tiempo con la misma id, de la region 2, pero la misma id.
Aquí dejo el código:
[code language="bennu"]global
int posibilidad_acertar[4]=0,0,100,0,50;
int posibilidad_fallar[4]=0,0,0,0,50;
end
process IA_miniradar(int jugador)
private
vehiculo_miniradar coche;
int disparar,vel,regi,lastid;
begin
write(0,miniradar_radar_x[jugador],miniradar_radar_y[jugador],4,"IA");
write_var(0,miniradar_radar_x[jugador],miniradar_radar_y[jugador]+8,4,coche);
write_var(0,miniradar_radar_x[jugador]-20,miniradar_radar_y[jugador]+15,4,vel);
write_var(0,miniradar_radar_x[jugador]+10,miniradar_radar_y[jugador]+15,4,regi);
repeat
if(miniradar_bonus[jugador]==5 && miniradar_flashing[jugador]==0)
foto_miniradar(jugador);
else
while(coche=get_id(type vehiculo_miniradar))
if(coche.region!=jugador || lastid==coche)break;end
vel=(coche.velocidad_publica*0.2);regi=(coche.region);
lastid=coche;
if((coche.velocidad_publica*0.2)>miniradar_vel_permitida && coche.region==jugador);
disparar=rand(0,100);
if(/*disparar<=100/*posibilidad_acertar[jugador] &&*/ miniradar_flashing[jugador]==0 && coche.fotos>0 && coche.y<miniradar_limite_inferior[jugador]-100)
foto_miniradar(jugador); break;
end
elif((coche.velocidad_publica*0.2)<=miniradar_vel_permitida && coche.region==jugador);
disparar=rand(0,100);
if(disparar<=posibilidad_fallar[jugador] && miniradar_flashing[jugador]==0 && coche.fotos>0 && coche.y<miniradar_limite_inferior[jugador]-100)
foto_miniradar(jugador);
break;
end
else break;
end
frame;
end
end
frame;
until(ganador<>0)
end[/code]
Muchas gracias a todos!
repito nuevamente, sin frame... no se puede usar frame dentro de un while con getid... el getid se resetea en cada frame...
He quitado el frame y se comporta igual.
De hecho me convenia que se resetease en cada frame, ya que cuando hay varios procesos del mismo tipo en pantalla, quiero que evalue uno, actue en consecuencia y pase al siguiente, pero al actuar necesita un frame para mostrar los resultados.
Cuando el primer coche que aparece (el primero de todos, el primero del programa) cumple con las condiciones, sí que funciona bien, pero a partir de ahí, hace lo que quiere, así que el proceso flojea por alguna parte.
me he fijado que cuando pilla un proceso, por mucho que yo me haya empeñado en romper el bucle, sigue a ese proceso hasta que el proceso muero y solo entonces cambia a otro
if(coche.region!=jugador || lastid==coche)break;end
Deberia ser continue.. no break.. y nose para que usas lastid pero teoricamente get_id no devuelve procesos repetidos
efectivamente lastid es para que no se repitan ids, pero si lo que me dices es cierto no tiene mucho sentido. Entonces no es que devuelva id repetidas, es que no cambia de id.
si fuera solo un while, sería un continue sí, pero como el while está en un repeat, pues he puesto un break y el while se vuelve a ejecutar. ¿puede ser ese el problema? espero que no, pero voy a ver.
get_id no devuelve repetidos...
import "mod_proc";
import "mod_string";
import "mod_say";
process test()
begin
loop
frame;
end
end
process test1()
begin
loop
frame;
end
end
process pframe()
begin
frame;
end
private
i, ii;
begin
test();
test();
test1();
test();
say ("without frame");
say ("");
while(i = get_id(type test))
say(i);
end
frame; // reset get_id
say ("");
say ("calling process with frame");
say ("");
ii = 0;
while(i = get_id(type test))
say(i);
pframe();
end
frame; // reset get_id
say ("");
say ("with frame");
say ("");
ii = 0;
while(i = get_id(type test))
say(i);
frame;
if (ii++ == 10) break; end
end
let_me_alone();
end
tu problema es el frame....
else break;
end
frame; <<<<
end
Get_id(tipo) devuelve el id del primer proceso de ese tipo que encuentra. Si el parametro es 0 devuelve el id del primer proceso que encuentra de cualquier tipo. Sucesivas llamadas en el mismo frame devuelven los siguientes procesos en la "lista". Cuando ya no quedan mas procesos devuelve 0.
Hey! gracias por las explicaciones! ahora entiendo el motivo del while y del continue, el frame hacía que volviera al principio de la lista! ahora entiendo todo! ja ja ja! ja jaja!
El proceso ha quedado actualmente así, y funcionar funciona, más o menos como esperaba, tiene algún comportamiento que no había previsto y que creo que tengo que pulir un poco, pero ya es cosa de avanzar, de momento por lo menos acaba con puntuación positiva en el marcador. Así ha quedado
[code language="bennu"]global
int posibilidad_acertar[4]=0,0,100,0,50;
int posibilidad_fallar[4]=0,0,0,0,50;
end
process IA_miniradar(int jugador)
private
vehiculo_miniradar coche;
int disparar,vel,regi,lastid;
begin
write(0,miniradar_radar_x[jugador],miniradar_radar_y[jugador],4,"IA");
write_var(0,miniradar_radar_x[jugador],miniradar_radar_y[jugador]+8,4,coche);
write_var(0,miniradar_radar_x[jugador]-20,miniradar_radar_y[jugador]+15,4,vel);
write_var(0,miniradar_radar_x[jugador]+10,miniradar_radar_y[jugador]+15,4,regi);
repeat
if(miniradar_bonus[jugador]==5 && miniradar_flashing[jugador]==0)
foto_miniradar(jugador);
else
while(coche=get_id(type vehiculo_miniradar))
if(coche.region!=jugador || lastid==coche)continue;end
vel=(coche.velocidad_publica*0.2);regi=(coche.region);
lastid=coche;
if((coche.velocidad_publica*0.2)>miniradar_vel_permitida && coche.region==jugador);
disparar=rand(0,100);
if(/*disparar<=100/*posibilidad_acertar[jugador] &&*/ miniradar_flashing[jugador]==0 && coche.fotos>0 && coche.y<miniradar_limite_inferior[jugador]-100)
foto_miniradar(jugador); break;
end
elif((coche.velocidad_publica*0.2)<=miniradar_vel_permitida && coche.region==jugador);
disparar=rand(0,100);
if(disparar<posibilidad_fallar[jugador] && miniradar_flashing[jugador]==0 && coche.fotos>0 && coche.y<miniradar_limite_inferior[jugador]-100 && coche.y>miniradar_limite_superior[jugador]+200)
foto_miniradar(jugador);
break;
end
else break;
end
end
end
frame;
until(ganador<>0)
end[/code]
gracias, gracias, gracias, je je, sois geniales.