version 0.4
[zeRace] / bot_anticip.c
1 /*
2  * zeRace "anticip" bot
3  * http://royale.zerezo.com/zerace/
4  * 
5  * Copyright (C) 2004  Antoine Jacquet <royale@zerezo.com>
6  * Licensed under GPL
7  *
8  * This robot uses the idea described on this page :
9  * http://rars.sourceforge.net/selection/felix.html
10  * Thanks to Doug Eleveld
11  */
12
13 #include "bot.h"
14
15 char *bot_name()
16 {
17   return "Anticip";
18 }
19
20 void bot_ia(char *trackname,struct _car *car,SDL_Surface *fun,int *ku,int *kd,int *kl,int *kr)
21 {
22   int a1,a2,c,g,tg,og,l,x1,x2,x3,x4,y1,y2,y3,y4;
23   float o,m,s;
24   
25   /* adjust the properties depending of the track, this was "manually" optimized ;) */
26   if (strcmp(trackname,"car")==0)
27   {
28     a1=190;
29     a2=180;
30     o=0.1;
31     m=0.1;
32     s=car->speed/3.3+0.4;
33     og=130;
34   }
35   else if (strcmp(trackname,"first")==0)
36   {
37     a1=240;
38     a2=230;
39     o=0.1;
40     m=0.1;
41     s=car->speed/3.3+0.3;
42     og=120;
43   }
44   else if (strcmp(trackname,"icy")==0)
45   {
46     a1=250;
47     a2=240;
48     o=0.3;
49     m=0.1;
50     s=car->speed/3.3+0.3;
51     og=120;
52   }
53   else if (strcmp(trackname,"hairpins")==0)
54   {
55     a1=220;
56     a2=210;
57     o=0.6;
58     m=0.1;
59     s=car->speed/3.3+0.4;
60     og=120;
61   }
62   else if (strcmp(trackname,"simple")==0)
63   {
64     a1=190;
65     a2=180;
66     o=0.2;
67     m=0.1;
68     s=car->speed/3.3+0.4;
69     og=1;
70   }
71   else if (strcmp(trackname,"loop")==0)
72   {
73     a1=150;
74     a2=90;
75     o=0.8;
76     m=0.1;
77     s=car->speed/3.3+0.4;
78     og=1;
79   }
80   /* some default values that may work on some tracks */
81   else
82   {
83     a1=190;
84     a2=180;
85     o=0.2;
86     m=0.1;
87     s=car->speed/3.3+0.4;
88     og=1;
89   }
90   
91   /* should we accelerate or brake ? */
92   c=getpixel(fun,car->x,car->y);
93   *ku=1,*kd=0;
94   for (l=0;l<a1;l++)
95   {
96     x1=car->x-cos(car->angle)*l*s;
97     y1=car->y-sin(car->angle)*l*s;
98     if (x1>0 && y1>0 && x1<fun->w && y1<fun->h) c=getpixel(fun,x1,y1); else c=0;
99     g=(c>>GSHIFT)&0xff;
100     if (g<og && car->speed>m) { *ku=0,*kd=1; break; }
101   }
102   
103   /* should we turn ? left or right ? */
104   *kl=0;
105   *kr=0;
106   for (l=0;l<a2;l++)
107   {
108     x2=car->x-cos(car->angle)*l*s;
109     y2=car->y-sin(car->angle)*l*s;
110     x3=car->x-cos(car->angle-o)*l*s;
111     y3=car->y-sin(car->angle-o)*l*s;
112     x4=car->x-cos(car->angle+o)*l*s;
113     y4=car->y-sin(car->angle+o)*l*s;
114     
115     if (x3>0 && y3>0 && x3<fun->w && y3<fun->h) c=getpixel(fun,x3,y3); else c=0;
116     tg=(c>>GSHIFT)&0xff;
117     if (x4>0 && y4>0 && x4<fun->w && y4<fun->h) c=getpixel(fun,x4,y4); else c=0;
118     g=(c>>GSHIFT)&0xff;
119     if (g>tg) { *kr=1; break; } else if (g<tg) { *kl=1; break; }
120   }
121 }