Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Danielo515 on September 23, 2008, 02:07:15 PM

Title: Inteligencia estúpida (escaneador de procesos malparido)
Post by: Danielo515 on September 23, 2008, 02:07:15 PM
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!
Title: Re: Inteligencia estúpida (escaneador de procesos malparido)
Post by: SplinterGU on September 23, 2008, 02:15:06 PM
repito nuevamente, sin frame... no se puede usar frame dentro de un while con getid... el getid se resetea en cada frame...
Title: Re: Inteligencia estúpida (escaneador de procesos malparido)
Post by: Danielo515 on September 23, 2008, 02:49:50 PM
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.
Title: Re: Inteligencia estúpida (escaneador de procesos malparido)
Post by: Danielo515 on September 23, 2008, 02:54:30 PM
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
Title: Re: Inteligencia estúpida (escaneador de procesos malparido)
Post by: Packo_z007 on September 23, 2008, 03:12:35 PM
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
Title: Re: Inteligencia estúpida (escaneador de procesos malparido)
Post by: Danielo515 on September 23, 2008, 03:25:10 PM
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.
Title: Re: Inteligencia estúpida (escaneador de procesos malparido)
Post by: SplinterGU on September 23, 2008, 03:27:50 PM
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

Title: Re: Inteligencia estúpida (escaneador de procesos malparido)
Post by: SplinterGU on September 23, 2008, 03:29:48 PM
tu problema es el frame....

      else break;
      end   
      frame;  <<<<
   end
Title: Re: Inteligencia estúpida (escaneador de procesos malparido)
Post by: Packo_z007 on September 23, 2008, 03:33:52 PM
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.

Title: Re: Inteligencia estúpida (escaneador de procesos malparido)
Post by: Danielo515 on September 23, 2008, 03:57:21 PM
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.