2013/guanaco.r

001/*
002 
003Nome:   guanaco.r       (midi)
004Autore: Franco Cartieri
005 
006Torneo 2013
007 
008Descrizione robot:
009Guanaco � sostanzialmente Leopon, con l'unica modifica che l'oscillazione nel 4vs4 non � fatta contro le pareti dell'angolo
010ma un po pi� verso il centro dell'arena.
011Ad ogni ciclo controlla se nel proprio angolo � presente un robot.
012Migliora leggermente nel f2f, ma peggiora pesantemente nel 4vs4.
013*/
014 
015int x,y,dir,rng,orng,deg,odeg,xs,ys,en,timer,xd,yd,xp,yp,dmax,dmin,zd,angolo;
016 
017spara(dir)
018{
019    drive(dir,100);
020    if ((orng=scan(deg, 10)) )
021    {
022        if (scan(deg-9,5))
023        {
024            if (scan(deg-=13,5))
025            {
026                if(scan(deg-3,5)) deg-=5;
027                else ++deg;
028            
029            else
030            {  
031                if (scan(deg-5,5)) deg-=5;
032                else ++deg;
033            }
034        }
035        else   
036        {
037            if(scan(deg+9,5))
038            {
039                if (scan(deg+=13,5)) deg+=5;
040                else --deg;
041            
042            else   
043            {
044                if(scan(deg+5,5)) deg+=5;
045                else --deg;
046            }
047        }
048    
049    else   
050    {
051        if ((orng=scan(deg-=20,10)))
052        {
053            if (scan(deg-9,10))
054            {
055                if (scan(deg-=13,5)) deg-=5;
056                else ++deg;
057            }
058            else
059            {  
060                if(scan(deg+9,10)) deg+=5;
061                else --deg;
062                
063        }
064        else   
065        {
066            if ((orng=scan(deg+=40,10)))
067            {
068                        if (scan(deg+9,10)) deg+=12;
069            
070            else   
071            {
072                if ((orng=scan(deg+=20,10)));
073                else
074                {
075                    if (orng=scan(deg-=80,10))      return cannon(deg,orng);
076                    else if (orng=scan(deg-=20,10))     return cannon(deg,orng);   
077                    else if (orng=scan(deg+=120,10))    return cannon(deg,orng);   
078                    else if (orng=scan(deg+=20,10))     return cannon(deg,orng);   
079                    else if (orng=scan(deg-=160,10))    return cannon(deg,orng);
080                    else return deg+=260;
081                }
082            }
083        }
084    }
085    if (rng=scan(deg,10))
086    {   
087        cannon (deg, rng*135/(135+orng-rng) );
088        if(rng>1000)
089            return deg+=40;
090        
091    else if(scan(deg-20,10)) deg-=20;
092            else if(scan(deg+=20,10));
093            else deg+=40;
094}
095 
096count()
097{
098    while (dmin<=dmax) en+=(scan(dmin+=20,10)>0);
099    dmin=zd;
100}
101 
102main()
103{
104    xp=300+(xs=loc_x(yp=300+(ys=(loc_y(en=0))>499)*400)>499)*400;
105    drive(dir=((xd=180*xs)+180),100);
106    while(check(xp,3-xs)) drive(dir,100);
107    fire(dir,0); 
108        while(speed()>59);
109    drive(dir=((yd=90+180*ys)+180),100);
110    while(check(yp,7-ys)) drive(dir,100);
111    fire(dir,0); 
112        while(speed()>59);
113 
114    count(dmax=(dmin=zd=(yd-115+90*(xs^ys)))+120);
115    angolo = dmin+250;
116 
117    while(en>1)
118    {
119            run(xd,xp,2-xs);   
120            run(yd,yp,6-ys);   
121    }
122    f2f();
123}
124 
125fire(dir, v)
126{
127    drive(dir,v);
128    if (rng=scan(odeg=deg,10))
129    {
130        if (scan(deg-8,5))
131        {  
132            if (scan(deg-=5,2)) ;
133            else deg-=4;
134        }
135        else
136        {
137            if (scan(deg+8,5))
138            {
139                if (scan(deg+=5,2)) ;
140                else deg+=4;
141            }
142            else
143            {
144                if (scan(deg,1)) ;
145                else if (scan(deg-=3,2)) ; else deg+=6;
146            }
147        }
148        return(cannon(deg+(deg-odeg),2*scan(deg,10)-rng));
149    }
150    else
151    {
152        if(rng=scan(deg+=20,10))    cannon(deg,rng);
153        else if(rng=scan(deg-=40,10))   cannon(deg,rng);
154        else deg+=80;  
155    }
156}
157 
158run(d,l,m)
159{
160    int r;
161    if(timer%12==2)
162    {
163        count(en=0);
164    }
165    while((++r)<3)
166    {
167        drive(d,100);
168        if (++timer>400+damage()) f2f();
169        if (scan(d,10))
170            deg=d;
171        else    if (scan(angolo,10))
172                deg=angolo;
173        while(check(l,m)) ;
174            fire(d,0); 
175        while(speed()>59) ;
176        ++m; 
177        d+=180;
178    }
179}
180 
181check(l,m)
182{
183    int c1;
184    if (m<5) c1=loc_x(); else c1=loc_y();
185    if (m%2) return (c1>l); else return (c1<l);
186}  
187 
188f2f()
189{
190    int b,fp;
191    while(1)
192    {
193        if ((x=loc_x(y=loc_y()))>850) dir=155+50*(y>500);
194                else    if (x<150) dir=335+50*(y<500);
195            else    if (y>850) dir=245+50*(x<500);
196                else    if (y<150) dir=65+50*(x>500);
197        else
198        {
199            if (orng<600) dir=deg+80+(b^=1)*190;
200            else  dir=deg+50+(b^=1)*230;
201        }
202        spara(dir);
203        ++fp; if(fp>5) ++fp; fp=5;
204        spara(dir);
205    }
206}