3 * http://royale.zerezo.com/zerace/
5 * Copyright (C) 2004 Antoine Jacquet <royale@zerezo.com>
8 * This robot uses the idea described on this page :
9 * http://rars.sourceforge.net/selection/felix.html
10 * Thanks to Doug Eleveld
20 void bot_ia(char *trackname,struct _car *car,SDL_Surface *fun,int *ku,int *kd,int *kl,int *kr)
22 int a1,a2,l,x1,x2,x3,x4,y1,y2,y3,y4;
27 /* adjust the properties depending of the track, this was "manually" optimized ;) */
28 if (strcmp(trackname,"car")==0)
37 else if (strcmp(trackname,"first")==0)
46 else if (strcmp(trackname,"icy")==0)
55 else if (strcmp(trackname,"hairpins")==0)
64 else if (strcmp(trackname,"simple")==0)
73 else if (strcmp(trackname,"loop")==0)
82 else if (strcmp(trackname,"formula")==0)
91 else if (strcmp(trackname,"wave")==0)
100 else if (strcmp(trackname,"bio")==0)
106 s=car->speed/3.3+0.4;
109 else if (strcmp(trackname,"city")==0)
115 s=car->speed/3.3+0.4;
118 else if (strcmp(trackname,"desert")==0)
124 s=car->speed/3.3+0.4;
127 else if (strcmp(trackname,"http")==0)
133 s=car->speed/3.4+0.4;
136 else if (strcmp(trackname,"kart")==0)
142 s=car->speed/3.3+0.4;
145 /* some default values that may work on some tracks */
152 s=car->speed/3.3+0.4;
156 /* should we accelerate or brake ? */
157 c=getpixel(fun,car->x,car->y);
161 x1=car->x-cos(car->angle)*l*s;
162 y1=car->y-sin(car->angle)*l*s;
163 if (x1>0 && y1>0 && x1<fun->w && y1<fun->h) c=getpixel(fun,x1,y1); else c=SDL_MapRGB(fun->format,0,0,0);
164 SDL_GetRGB(c,fun->format,&t,&g,&t);
165 if (g<og && car->speed>m) { *ku=0,*kd=1; break; }
168 /* should we turn ? left or right ? */
173 x2=car->x-cos(car->angle)*l*s;
174 y2=car->y-sin(car->angle)*l*s;
175 x3=car->x-cos(car->angle-o)*l*s;
176 y3=car->y-sin(car->angle-o)*l*s;
177 x4=car->x-cos(car->angle+o)*l*s;
178 y4=car->y-sin(car->angle+o)*l*s;
180 if (x3>0 && y3>0 && x3<fun->w && y3<fun->h) c=getpixel(fun,x3,y3); else c=SDL_MapRGB(fun->format,0,0,0);
181 SDL_GetRGB(c,fun->format,&t,&tg,&t);
182 if (x4>0 && y4>0 && x4<fun->w && y4<fun->h) c=getpixel(fun,x4,y4); else c=SDL_MapRGB(fun->format,0,0,0);
183 SDL_GetRGB(c,fun->format,&t,&g,&t);
184 if (g>tg) { *kr=1; break; } else if (g<tg) { *kl=1; break; }