AI codigo fuente

Started by l1nk3rn3l, November 26, 2009, 10:54:11 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

l1nk3rn3l

 :D


Aqui varios codigo fuente para mover cantidad de Personajes
al tiempo.


program mi_programa;

/*
AI Example by Colombian Developers

 
  y
  ^     z
  !   /
  ! /
  *------->x
 
 
 
  switch with Integers


*/

local   
   ExecuteCont=0;
   
 

const
  mode8_width=640;      //res. Limit is 640x480 max.
  mode8_height=480;
  MaxGrupos=3; 
  MaxSoldiers=5;
  Incremento=1;//cada cuanto cambia

global 
  salida;
  GrupoActual=0;
  i,j=0;
 
 
process Soldier(grupo, SoldierID)
begin
   loop
     if (ExecuteCont < father.ExecuteCont)
      say("ejecutando AI Grupo: "+itoa(grupo)+" Soldier:"+itoa(SoldierID));
    
     //AI code Here
     // ..
     ExecuteCont= father.ExecuteCont;
    end;
   
    frame;
   end;
end;   


process Escuadron(grupo) //controla un grupo de Soldiers
local
   TimeeGroup;
begin
   for (j=1;j<MaxSoldiers;j++) //carga Soldiers del escuadron
     Soldier(grupo,j);       
   end;
     
   loop
   
     if (grupo == GrupoActual) //coordina la ejecucion de los Soldiers
      say("Update Group: "+itoa(grupo));       
                    
      ExecuteCont++; //actualiza los hijos      
    end;   
   
     frame;
   end;
end; 
   
   
begin               

  set_mode (mode8_width,mode8_height,16);

   WRITE_INT(0,430,20,0,offset GrupoActual);
   WRITE_INT(0,430,50,0,offset j);

   for (i=0;i<=MaxGrupos;i++)
      Escuadron(i);
   end;
   
  while ( !key(_esc)  )
   GrupoActual= (j>>Incremento)&MaxGrupos;
   j++;
   
     frame;                       
  end;               

  let_me_alone();
end



l1nk3rn3l

program mi_programa;

/*
AI Example by Colombian Developers
- Time Slicing Example-
 
  y
  ^     z
  !   /
  ! /
  *------->x
 
 
 
  switch with Time

  Nota: Este codigo se puede mejorar para que se ejecuten todos los Soldiers
  de una forma mas conveniente (es solo un borrador de un motor de IA)
 
  Este seudocodigo explica la tecnica de partir tiempos(time slicing), para
  evitar que se sobrecargue el procesador con todos los procesos al tiempo,
  asi logramos mayor velocidad cuando tenemos mas de 400 procesos activos . 
*/

local   
   ExecuteCont=0;
   
 

const
  mode8_width=640;      //res.  is 640x480 .
  mode8_height=480;
  MaxGroups=3; 
  MaxSoldiers=5;
  SplitTimeGlobal=100;
 

global   
  TimeeGlobal;
    i,j=0;
 
 
process Soldier(Group, SoldierID)
begin   
   loop
     
     if (ExecuteCont < father.ExecuteCont) //evita ejecutar bloques de codigo sino es necesario
      say("Run AI Group: "+itoa(Group)+" Soldier:"+itoa(SoldierID));
     // --- AI Code here
     // ---
    
     ExecuteCont= father.ExecuteCont;//evita que se repita en este ciclo    
    end;
   
    frame;
  end;
end;   



 
process Escuadron(Group, splitTime) //controla un Group de Soldiers
local
   TimeeGroup;
begin
   for (j=1;j<MaxSoldiers;j++) //carga Soldiers del escuadron
     Soldier(Group,j);       
   end;
   
   TimeeGroup= TimeeGlobal + splitTime;//se sincroniza
   
   loop
   
     if (TimeeGroup <  TimeeGlobal) //coordina la ejecucion de los Soldiers
      say("Update Group: "+itoa(Group));       
      
      TimeeGroup= TimeeGlobal + splitTime; //se sincroniza            
      ExecuteCont++; //actualiza los hijos      
    end;   
   
     frame;
   end;
end;
 
   
   
   
begin               

  set_mode (mode8_width,mode8_height,16);

   WRITE_INT(0,430,20,0,offset TimeeGlobal);
  // WRITE_INT(0,430,50,0,offset EjecutarFlag);

   TimeeGlobal= GET_TIMER(); //init timer
   
   
    Escuadron(0,SplitTimeGlobal);   //each 100ms  by example
   Escuadron(1,SplitTimeGlobal+100);  //each 200ms
   Escuadron(2,SplitTimeGlobal+200);  //each 300ms 
   Escuadron(3,SplitTimeGlobal+300); // etc etc


   
  while ( !key(_esc)  )     
     TimeeGlobal= GET_TIMER();
   
     frame;                       
  end;               

  let_me_alone();
end



Windgate

Es buena idea l1nk, pero hace falta limitar un número de frames máximos en los que no se ejecuta la IA. Por ejemplo, en mi juego de Droides hay momentos en los que un droide termina de matar a un enemigo y tiene otro en frente de sus narices, y es "extraño" ver cómo se queda buscando objetivo durante "demasiados" frames.

También había pensado en otra solución que no sé si ya conté... Si un droide con rango de visión N está adyacente a otro droide con radio de visión N+1 o superior, entonces toma el objetivo de ese droide y no se preocupa de buscar. Aplicado a escuadrones los de mayor rango son los que usan la IA mientras que el resto sólo esperan a que éstos obtengan objetivo.

Seguiremos investigando este tema... Esta semana no he programado apenas, he estado ocupado pero lo retomaré con ganas.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

l1nk3rn3l

Un codigo mas optimizado para busqueda de caminos por Windgate

http://rapidshare.com/files/337226921/Victor_IA_0.3.rar.html

Solo bastaria adicionarle un flag , a cada personaje que indique cual debe ejecutarse
mas ...

3000 personajes a 10fps, con pathfind.

Estoy mirando como termino el pathfind con (dll)

Windgate

Bravo l1nk, cualquier novedad será bienvenida, tengo pensado asociar a un mapa de terreno un mapa de durezas para que path_find pueda buscar caminos y evitar montañas... De momento no tengo nada al respecto, pero la idea me tortura tanto que cualquiera de estos la probaré.

Lo dicho, si sacas alguna .dll mejorada o cualquier otra cosa no dudes en ponernos aquí la descarguita :D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es