Inteligencia estúpida (escaneador de procesos malparido)

Started by Danielo515, September 23, 2008, 02:07:15 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Danielo515

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!

SplinterGU

repito nuevamente, sin frame... no se puede usar frame dentro de un while con getid... el getid se resetea en cada frame...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

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.

Danielo515

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

Packo_z007

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
[STRING] *PANIC Too many strings, allocating more space

Danielo515

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.

SplinterGU

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

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

tu problema es el frame....

      else break;
      end   
      frame;  <<<<
   end
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Packo_z007

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.

[STRING] *PANIC Too many strings, allocating more space

Danielo515

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.