2003/dave.r

001/*
002Dave.r
003Macro robot per il torneo 2003.
004 
005Scritto da:
006Angelo Ciufo
007 
008 
009Il robot e' basato su Remus.r del 2001, con notevoli ottimizzazioni.
010Si reca nell'angolo piu' vicino, e oscilla con un movimento a 45�.
011Se c'e' un unico superstite attacca con le routine di Pippo2a.
012Stesso discorso se, dopo 820 chiamate alle funzioni di sparo,
013e' in condizioni decenti e ha al max 2 avversari.
014A differenza del predecessore (e del fratellone) non cambia mai angolo.
015*/
016 
017 
018 
019int rng, deg;     /* Distanza e Gradi          */
020int orng, odeg;   /* Distanza e Gradi Old      */
021int dir;               /* La mia direzione          */
022int ne;                /* Numero avversari          */
023 
024int i;
025int x,y;
026int t;
027 
028main()
029{
030    vai (x=100+800*(loc_x (ne=3)>500),y=100+800*(loc_y ()>500));
031     
032            while (1) {
033 
034                if(!orng||orng>850) {
035                        i=-10; ne=0;
036                        while (i<360) {
037                                if (scan (i+=20, 10)) ++ne;
038                        }
039                        if (ne<2) {
040                                boom ();
041                        } else if(t>620) {
042                                if((ne<3) && (damage()<60)) boom();
043                                else if(damage()<40) boom();
044                                else t=0;
045 
046                        }
047                }
048                                        /*oscilla (9);*/
049                i=9;
050                while (--i) {
051                        spara(drive (dir,100));
052                        while (loc_y()<=y) spara(drive (dir,100));
053                        dir+=180;
054                        spara(drive (dir,100));
055                        while (loc_y()>=y) spara(drive (dir,100));
056                        dir-=180;
057                }
058                drive (dir,0);
059            }
060                                        /*move ();*/
061}
062 
063 
064vai (x,y)
065{
066    spara(drive (dir=deg(x,y),100));
067    while (dist(x,y)>22500) fire(drive (dir,100));
068    while (dist(x,y)>12000) spara(drive (dir,100));
069    while (dist(x,y)>1600) drive (dir,100);
070    spara(drive (dir,0));
071    if (y<500) {
072        if (x<500) {dir=135;}
073        else {dir=45;}
074    } else {
075        if (x<500) {dir=45;}
076        else {dir=135;}
077    }
078 
079}
080 
081/* Angolo per andare in una certa direzione */
082deg(x,y) { return (180+((x-=(loc_x()))>0)*180+atan(((y-loc_y())*100000)/x)); }
083 
084/* Calcola la distanza rispetto ad un punto dato */
085dist(x,y) { return (((x-=loc_x())*x+(y-=loc_y())*y)); }
086 
087 
088/* rende vero se il dato angolo e' libero */
089libero (gradi)
090{
091    return (!(scan(gradi+350,10) ||scan(gradi+10,10)));
092}
093 
094 
095fire() {
096    ++t;
097  if (scan(deg,10))
098    {
099      if ((orng=find(scan(deg,10)))<850)
100        {
101          if (rng=find())               
102             return cannon((odeg+(dag-odeg)*3-(sin(deg-dir)/19500)),(rng*200/(200+orng-rng-(cos(deg-dir)/4167))));
103        }
104    }     
105  if((rng=scan(deg,10))&&(rng<850));
106  else
107    if((rng=scan(deg+=339,10)));
108    else
109      if((rng=scan(deg+=42,10)));
110      else
111        return (deg+=40);
112  cannon (deg,2*scan(deg,10)-rng);
113}
114 
115find()  
116{
117  if(scan((odeg=deg)-7,3)) deg-=7;
118  if(scan(deg+7,3)) deg+=7;
119  if(scan(deg-4,2)) deg-=4;
120  if(scan(deg+4,2)) deg+=4;
121  if(scan(deg-2,1)) deg-=2;
122  if(scan(deg+2,1)) deg+=2;
123  return (scan(deg,10));
124}
125  
126spara()
127/* routine di sparo*/
128{
129        ++t;
130        if ((orng=scan(deg, 10)) ) {
131                if (orng<150) return cannon(deg,2*scan(deg,10)-orng);
132                if (scan(deg-8,4)) {
133                        if (scan(deg-=8+3,2)) {
134                                if(scan(deg+=3-2,1)) deg-=2;
135                        else if (scan(deg-3,2)) deg-=3;
136                } else if(scan(deg+8,4)) {
137                        if (scan(deg+=8+3,2)) deg+=3;
138                        else --deg;
139                else if(scan(deg+2,2)) deg+=2;
140                else --deg;
141 
142        else if ((orng=scan(deg-=20,10))) {
143                if (orng<150) return cannon(deg,2*scan(deg,10)-orng);
144                if (scan(deg-8,4)) {
145                        if (scan(deg-=8-3,2)) deg-=3;
146                        else ++deg;
147                } else if(scan(deg+7,4)) deg+=7;
148        else if ((orng=scan(deg+=40,10))) {
149                if (orng<150) return cannon(deg,2*scan(deg,10)-orng);
150                if (scan(deg+7,4)) deg+=7;
151        else if (!(orng=scan(deg+=20,10))) {
152                if ((orng=scan(deg+=21,10))) {
153                        if (orng>850) {
154                                cannon(deg,700);
155                                return deg+=57;
156                        }
157                } else {
158                        if (!(scan(deg+=21,10))) deg+=40;
159                        return;
160                }
161    }
162        if (rng=scan(deg,10)){ 
163                cannon (deg, rng*165/(165+orng-rng) );
164                if(rng>720) if(rng>orng || rng>850) {
165                                deg+=57;
166                                return orng=0;
167                        }
168 
169        else if(scan(deg-20,10)) deg-=20;
170        else if(!scan(deg+=21,10)) deg+=57;
171}
172 
173boom()
174{
175 
176 while(1)
177 {
178  sx(350);
179  dx(650);
180 }
181  
182}
183 
184dx(xx)
185 {
186  while(loc_x()<xx) vs(00);
187  stop();
188 }
189sx(xx)
190 {
191  while(loc_x()>xx) vs(180);
192  stop();
193 }
194 
195 
196vs(xx)
197 {
198  drive(dir=xx,100);
199  fuoco();
200 }
201 
202 
203stop()
204 {
205  drive(dir,0);
206  while(speed()>50);
207 }
208 
209 
210fuoco() {
211    if (orng=scan(deg,10));
212    else if (orng=scan(deg-=20,10));
213    else if (orng=scan(deg+=40,10));
214    else return deg+=41;
215    {
216        if (orng>850)  {return deg+=41;}
217        if (!scan(deg+=354,6)) deg+=12;
218        if(scan(deg-6,2)) deg-=6;
219        else if(scan(deg+6,2)) deg+=6;
220        fnd();
221        if (orng=scan(odeg=deg,10))
222        {
223           if(scan(deg-7,3)) deg-=7;
224           else if(scan(deg+7,3)) deg+=7;
225           fnd();
226           if (rng=scan(deg,10))
227           {
228                cannon(deg+((deg-odeg)*((700+rng))>>9)-(sin(deg-dir)>>14),
229                       rng*179/(179+orng-rng-(cos(deg-dir)>>12)));
230           }
231  
232        }
233        else {
234                if (!(orng=scan(deg+=339,10))){ 
235                        if (!(orng=scan(deg+=41,10))) {
236                                if(!(orng=scan(deg+=21,10))) {
237                                        return deg+=41;
238                                }
239                        }
240                }
241                else if (!scan(deg+=354,6)) deg+=12; 
242                return cannon (deg, 2*scan(deg,10)-orng);
243        }
244     }
245}
246 
247 
248 
249fnd()
250{
251 if(scan(deg-4,1)) deg-=4;
252 if(scan(deg+4,1)) deg+=4;
253 if(scan(deg-2,1)) deg-=2;
254 if(scan(deg+2,1)) deg+=2;
255}