2002/romulus.r

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