2004/goofy.r

001/*
002Nome            : Goofy
003Versione        : m_8.r
004Autore      : Simone Ascheri
005 
006 
007Commento
008========
009 
010Goofy � un pasticcione. Uno di quei personaggi che sono capaci fare solo guai. Non � tutta colpa sua, poverino"!
011Il modo in cui � venuto al mondo non � certo dei migliori, tirato fuori da una costola di Frankie, che gi� non ara un buon cmbattente.
012Qui l'erredit� di Danica � ancora + pesante, dal momento che ne condivide anche l'attacco dinale, con pochissime varianti, se non nulle.
013Sar� per l'anno prossimo (speriamo).
014 
015Strategia
016=========
017 
0181)Goofy all'inizio del match si sposta nell'angolo piu' vicino � controlla se � rimasto solo.
019In caso affermativo parte con l'attacco finale.
020 
0212)Se, invece, i due angoli adiacenti sono occupati, oscilla alternativamente lungo i lati dell'arena con brevi movimenti, utilizzando le routine di Danica.
022 
0233)Quando si accorge che uno degli angoli � disabitato, capisce che lo scontro � per lo meno a tre robot (un vero genio).
024Conta quindi gli avversari, per vedere se puo' ricondurre (da vero matematico) la situazione a quella del punto 1. Nel qual caso, bello contento, parte con l'attacco finale.
025 
0264)Se, putacaso, trova invece altri due nemici, sfrutta la sua routine di attacco a tre nuova di zecca:
027si dirige per un breve tratto verso l'angolo rimasto libero, piega in direzione del nemico nell'angolo adiacente, oscilla in quella direzione e torna indietro seguendo lo stasso percorso: non � un triangolo, non � una L, ma nnon � nemmeno tutto questo granch�....
028 
029Note Tecniche
030=============
031 
032Nessuna.
033*/
034 
035int ang, dx, dy;
036int a, oa, r, or, s_lim, i_lim;
037int h,a1,a2;
038int ang_pref;
039int max,rng,mr,z,t,ang_p2;
040int dove,oldr,rng,run,switch,dan,si;
041 
042int xs,ys,rd,ren,sc1,sc2,ff,xmax,xd,yd,xp,yp,dmax,dmin,zd;
043 
044main()
045{
046  ang_pref=180*((dy=(loc_y(xp=60+(xs=loc_x(yp=60+(ys=(loc_y(sc1=sc2=1))>499)*880)>499)*880)>500)*960+20)>500)+90*((dx=(loc_x()>500)*960+20)!=dy);
047 
048  drive(xd=180*xs,100);
049 
050  yd=90+180*ys;
051 
052  while(1) {
053    Run(xd,xp,2-xs);   
054    Run(yd,yp,6-ys);   
055    tre();
056 
057  }
058 
059}
060 
061Run(d,l,m) {
062  int r;
063   
064  while(r<2) {
065  r+=drive(d,100);
066   
067  if (scan(d,10)) { a=d; while (scan(d,10)>840) ; } else while(Check(l,m)) ;
068     
069    
070  Sparare(d,0); 
071  while(speed()>49);
072  ++m; 
073  d+=180;
074  }
075}
076 
077Check(l,m) {
078  int c1;
079  if (m<5) c1=loc_x(); else c1=loc_y();
080  if (m%2) return (c1>l); else return (c1<l);  
081}  
082 
083Dista(nx,ny)
084int nx, ny;
085  {
086    return (h=((nx-=loc_x())*nx+(ny-=loc_y())*ny));
087  }
088  
089Stop()
090{
091         PallaDiFuoco(PallaDiFuoco(drive(ang+=180,0)));
092}
093 
094 
095 
096tre()
097int yy,xx,ang1,ang2,ang3,clock;
098{  
099    while   (1)
100 
101    {
102 
103 
104        if ((scan(ang_pref-10,10)==0)&&(scan(ang_pref+10,10)==0))
105        {
106            conta(ang_pref-40);
107            ang2=(ang1=ang_pref+10)+90;
108            ang3=ang_pref+180;
109        }  
110        else
111        {
112            if ((scan(ang_pref+80,10))+(scan(ang_pref+100,10))) return;
113            conta(ang_pref-40);
114            ang2=(ang1=ang_pref+90-10)-90;
115            ang3=ang_pref+270;
116        }
117 
118        ang_p2=ang2;
119        Sparare(ang=ang1,100);
120        while ((Dista(dx,dy)<20000))
121            PallaDiFuoco(h>(10000+0+0));
122        Stop();
123 
124        xx=loc_x(yy=loc_y());
125         
126        Sparare(a=ang=ang2,100);
127 
128        max=30000+30000*(clock^=1);
129        while ((Dista(xx,yy)<max))
130            PallaDiFuoco(h>(40000+0+0));
131        Stop();
132 
133        if (ang3%180)
134            while(((loc_x(PallaDiFuoco(drive(ang,100)))%930)>70));
135        else
136            while(((loc_y(PallaDiFuoco(drive(ang,100)))%930)>70));
137 
138        Stop();
139 
140        Sparare(ang=ang3,100);
141        while ((Dista(dx,dy)>3400))
142            {if (h>6500) PallaDiFuoco(h<25000+0+0);}
143        Stop();
144    }
145}
146 
147conta(angolo)
148int conto;
149    {
150        while((angolo+=20)<ang_pref+140)   
151            conto+=(scan(angolo,10)>0);
152        if (conto<2)
153        {
154            sc2=3;  ++ff; 
155            while(sc1=5)
156            {
157                  while (loc_x()<500+350*(rng<250)) Sparare(0,100);
158                  while (loc_y()<500) Sparare(90,100);
159                  while (loc_x()>499) Sparare(180,100);
160                  while (loc_y()>499) Sparare(270,100);
161            }
162 
163    }
164}
165 
166/*# a Spari */
167 
168PallaDiFuoco(meglio)
169int park,meglio;
170{
171  if (meglio);
172  else if (scan(a,10))
173    {
174      if ((or=Rivela(drive(ang,100)))<850)
175        {
176          if (r=Rivela())               
177             return cannon((oa+(a-oa)*3-(sin(a-ang)/19500)),(r*220/(220+or-r-(cos(a-ang)/4167))));
178        }
179    }     
180  if((r=scan(a,10))&&(r<850));
181  else if((r=scan(a+=339,10)));
182    else
183      if((r=scan(a+=42,10)));
184      else
185        if((r=scan(ang_p2,10))){ a=ang_p2;}
186        else
187          return (a+=43);
188 
189  cannon (a,2*scan(a,10)-r);
190}
191 
192Rivela()  
193{
194  if(scan((oa=a)-7,3)) a-=7;
195  if(scan(a+7,3)) a+=7;
196  if(scan(a-4,2)) a-=4;
197  if(scan(a+4,2)) a+=4;
198  if(scan(a-2,1)) a-=2;
199  if(scan(a+2,1)) a+=2;
200  return (scan(a,10));
201}
202 
203 
204Sparare(dir,v)
205{
206  drive(dir,v);
207  if (rng=scan(oa=a,10)) 
208  {   
209    if (scan(a+350,10)) a-=sc1; else a+=sc1;
210    if (scan(a+10,10)) a+=sc2; else a-=sc2;
211    cannon(a+(a-oa)*ff+0,(scan(a,10)<<1)-rng);
212  } else {
213      if (rng=scan(a+=340,10)) return cannon(a,rng);
214      if (rng=scan(a+=40,10))  return cannon(a,rng); 
215      while (!(rng=scan(a+=20,10))) ;
216      cannon(a,rng);
217  }
218}