2004/multics.r

001/*
002Nome            : Multics
003Versione        : V_al_??.??.r
004Autore      : Simone Ascheri
005 
006 
007Commento
008========
009 
010Multics vorrebbe essere un'evoluzione di Frankie, a cui vorrebbe almeno donare un attacco finale diverso.
011 
012Temo che, come l'originale progetto dei BELL LABS (se non erro) sar� un bel buco nell'acqua.
013 
014Ok, l'attacco � praticamente lo stesso.
015L'unica differenza � che rende di piu' perche' conta gli avversari addirittura prima di muoversi... rischiando grosso di essere colpito.
016 
017Strategia
018=========
019 
0201)Multics all'inizio del match si sposta nell'angolo piu' vicino � controlla se � rimasto solo.
021In caso affermativo parte con l'attacco finale, che per ora � esattamente quello di Alcadia. Spero, nelle prox due ore, di
022mettere insieme qualche cosa di vagamente piu' originale.
023 
0242)Se, invece, i due angoli adiacenti sono occupati, oscilla alternativamente lungo i lati dell'arena con brevi movimenti, utilizzando le routine di Danica.
025 
0263)Quando si accorge che uno ali angoli � disabitato, capisce che lo scontro � per lo meno a tre robot (un vero genio).
027Conta 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.
028 
0294)Se, putacaso, trova invece altri due nemici, sfrutta la sua routine di attacco a tre nuova di zecca:
030si 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�....
031 
032Note Tecniche
033=============
034 
0351)Il nome del robot non � riferito n� a Frankie Raykard ( si scriver� cosi'? che figure) n� a Frankie Goes to Holliwood, ma al buon vecchio mostro di Frankestain, visto il modo in cui ha visto la luce.
0362)Il conto ali avversari viene fatto in maniera inusuale: anzich� adoperare un ciclo vengono effettuate materialmente tutte le scansioni e tutte le somme, per guadagnare velocit� di esecuzione e partire all'attacco prima dei nemici. Sarebbe un'ottima cosa, disponendo di un attacco finale ano di questo nome.
037*/
038 
039int ang, dx, dy;
040int a, oa, r, or, s_lim, i_lim;
041int h,a1,a2;
042int ang_pref;
043int max,rng,mr,z,t,ang_p2;
044int dove,oldr,rng,run,switch,dan,si;
045 
046int a,rng,oa,xs,ys,en,rd,ren,timer,sc1,sc2,ff,xmax,xd,yd,xp,yp,dmax,dmin,zd;
047 
048main()
049{
050  ang_pref=180*((dy=(loc_y()>500)*960+20)>500)+90*((dx=(loc_x()>500)*960+20)!=dy);
051 
052 
053  xp=60+(xs=loc_x(yp=60+(ys=(loc_y())>499)*880)>499)*880;
054  drive(xd=180*xs,100);
055 
056  yd=90+180*ys;
057    conta();
058  while(1) {
059    Run(xd,xp,2-xs);   
060    Run(yd,yp,6-ys);   
061    tre();
062 
063  }
064 
065}
066 
067Run(d,l,m) {
068  int r;
069   
070  while(r<2) {
071  drive(d,100);
072   
073  ++r;
074  if (++timer>440+damage()) en=1;
075   
076  if (scan(d,10)) { a=d; while (scan(d,10)>840) ; } else while(Check(l,m)) ;
077     
078    
079  Sparare(d,0); 
080  while(speed()>49);
081  ++m; 
082  d+=180;
083  }
084}
085 
086Check(l,m) {
087  int c1;
088  if (m<5) c1=loc_x(); else c1=loc_y();
089  if (m%2) return (c1>l); else return (c1<l);  
090}  
091 
092Dista(nx,ny)
093int nx, ny;
094  {
095    return (h=((nx-=loc_x())*nx+(ny-=loc_y())*ny));
096  }
097  
098Stop()
099{
100         PallaDiFuoco(PallaDiFuoco(drive(ang+=180,0)));
101}
102 
103att()
104{
105   
106  run=2;
107  while(1)
108 {
109    dan=damage();
110    if ((oldr>400)&&(run>0))
111    {
112    while (loc_x()<500) Fire(drive(0,100));
113    Fire(drive(90,40));
114    while (loc_y()<500) Fire(drive(90,100));
115    Fire(drive(180,40));
116    while (loc_x()>499) Fire(drive(180,100));
117    Fire(drive(270,40));    
118    while (loc_y()>499) Fire(drive(270,100));
119    Fire(drive(0,40));
120    if (dan<damage()-15) --run;
121    }
122    else
123    {
124        while (loc_x()<509) Fuoco(0);
125        while (loc_y()<509) Fuoco(90);
126        while (loc_x()>492) Fuoco(180);
127        while (loc_y()>492) Fuoco(270); 
128        if (dan<damage()-20) ++run;
129    }
130  }
131 
132}
133 
134Fire()
135{
136  if (oldr=scan(oa=a,10))
137  {   
138            
139           if (scan(a-=7,4)){if (!(scan(a+=2,2))) a-=4; return(cannon(a+(a-oa),2*scan(a,10)-oldr));}
140           if (scan(a+=14,4)){if (!(scan(a-=2,2))) a+=4; return(cannon(a+(a-oa),2*scan(a,10)-oldr));}
141           if (scan(a-=7,4)){if (!(scan(a+=2,2))) a-=4; return(cannon(a+(a-oa),2*scan(a,10)-oldr));}
142 
143  } else {
144        if (scan(a+=340,10)) return Fire();
145        if (scan(a+=40,10))  return Fire();
146        if (scan(a+=300,10)) return Fire();
147        if (scan(a+=80,10))  return Fire();
148        if (scan(a+=260,10)) return Fire();
149        if (scan(a+=120,10)) return Fire();
150        if (scan(a+=220,10)) return Fire();
151        if (scan(a+=160,10)) return Fire();
152        if (scan(a+=180,10)) return Fire();
153        a+=270;
154  }
155}
156 
157 
158 
159tre()
160int yy,xx,ang1,ang2,ang3,clock;
161{  
162    while   (1)
163 
164    {
165 
166 
167        if ((scan(ang_pref-10,10)==0)&&(scan(ang_pref+10,10)==0))
168        {
169            conta();
170            ang1=ang_pref;
171            ang_p2=ang2=ang1+100;
172            ang3=ang_pref+180;
173        }  
174        else
175        {
176            if ((scan(ang_pref+80,10))+(scan(ang_pref+100,10))) return;
177            conta();
178            ang1=ang_pref+90;
179            ang_p2=ang2=ang1-100;
180            ang3=ang_pref+270;
181        }
182        Sparare(ang=ang1,100);ang_p2=ang2;
183        while ((Dista(dx,dy)<30000))
184            PallaDiFuoco(h>(20000+0+0));
185        Stop();
186 
187        xx=loc_x(yy=loc_y());
188        Sparare(ang_p2=ang=ang2,100);
189 
190        max=(max%90000)+15000;
191         
192 
193        while ((Dista(xx,yy)<max))
194            PallaDiFuoco(h>(40000+0+0));
195        Stop();
196 
197        if (ang3%180)
198            while(((loc_x(PallaDiFuoco(drive(ang,100)))%930)>70));
199        else
200            while(((loc_y(PallaDiFuoco(drive(ang,100)))%930)>70));
201 
202        Stop();
203 
204        ang_p2=ang2;
205        Sparare(ang=ang3,100);
206        while ((Dista(dx,dy)>3400))
207            {if (h>6500) PallaDiFuoco(h<25000+0+0);}
208        Stop();
209    }
210}
211 
212conta()
213    {
214        if(((!scan(ang_pref-34,10))+
215            (!scan(ang_pref-3,10))+
216            (!scan(ang_pref+18,10))+
217            (!scan(ang_pref+29,10))+
218            (!scan(ang_pref+50,10))+
219            (!scan(ang_pref+71,10))+
220            (!scan(ang_pref+92,10))+
221            (!scan(ang_pref+113,10))+
222            (!scan(ang_pref+134,10)))>7)
223                att();
224 
225    }
226 
227/*# a Spari */
228 
229PallaDiFuoco(meglio)
230int park,meglio;
231{
232  if (meglio);
233  else if (scan(a,10))
234    {
235      if ((or=Rivela(drive(ang,100)))<850)
236        {
237          if (r=Rivela())               
238             return cannon((oa+(a-oa)*3-(sin(a-ang)/19500)),(r*220/(220+or-r-(cos(a-ang)/4167))));
239        }
240    }     
241  if((r=scan(a,10))&&(r<850));
242  else if((r=scan(a+=339,10)));
243    else
244      if((r=scan(a+=42,10)));
245      else
246        if((r=scan(ang_p2,10))){ a=ang_p2;}
247        else
248          return (a+=43);
249 
250  cannon (a,2*scan(a,10)-r);
251}
252 
253Rivela()  
254{
255  if(scan((oa=a)-7,3)) a-=7;
256  if(scan(a+7,3)) a+=7;
257  if(scan(a-4,2)) a-=4;
258  if(scan(a+4,2)) a+=4;
259  if(scan(a-2,1)) a-=2;
260  if(scan(a+2,1)) a+=2;
261  return (scan(a,10));
262}
263 
264Fuoco(dove)
265{
266    drive (dove,100);
267    if (oldr=scan(a,10))
268    {
269            
270           if (scan(a,2)){if ((cannon(a+0+0+0+0+0,3*scan(a,10)-2*oldr))) return;}
271           else if (scan(a-=7,5)){if ((cannon(a-6+0+0,2*scan(a,10)-oldr))) return;}
272           else if (scan(a+=14,5)){if((cannon(a+7,2*scan(a,10)-oldr))) return;}
273           else if (scan(a+=10,5)){if((cannon(a+9,scan(a,10)))) return;}
274       else a+=20;
275    }
276        else if (rng=scan(a+=340,10)) return (cannon(a,rng));
277        else if (rng=scan(a+=40,10))  return (cannon(a,rng));
278        else if (rng=scan(a+=300,10)) return (cannon(a,rng));
279        else if (rng=scan(a+=80,10))  return (cannon(a,rng));
280        else if (rng=scan(a+=260,10)) return (cannon(a,rng));
281        else if (rng=scan(a+=120,10)) return (cannon(a,rng));
282        else if (rng=scan(a+=220,10)) return (cannon(a,rng));
283        else if (rng=scan(a+=160,10)) return (cannon(a,rng));
284        else if (rng=scan(a+=180,10)) return (cannon(a,rng));
285        else if (rng=scan(a+=200,10)) return (cannon(a,rng));
286        else if (rng=scan(a+=140,10)) return (cannon(a,rng));
287        else if (rng=scan(a+=240,10)) return (cannon(a,rng));
288        else if (rng=scan(a+=100,10)) return (cannon(a,rng));
289        else a+=310;
290    return Fuoco(dove);
291}
292 
293 
294Sparare(dir,v)
295{
296  drive(dir,v);
297  if (rng=scan(a,10)) 
298  {   
299    if (scan(a+350,10)) a-=1; else a+=1;
300    if (scan(a+10,10)) a+=1; else a-=1;
301    cannon(a+0+0+0+0,(scan(a,10)<<1)-rng);
302  } else {
303      if (rng=scan(a+=340,10)) return cannon(a,rng);
304      if (rng=scan(a+=40,10))  return cannon(a,rng); 
305      while (!(rng=scan(a+=20,10))) ;
306      cannon(a,rng);
307  }
308}