1999/akira.r

001/**************************************************************************/
002/***   AKIRA.R   ( Y2K Crobots Tournament )                             ***/
003/***                                                                    ***/
004/***   Creatore  :  Katsuhiro Otomo                                     ***/
005/***   Autore    :  Stefano Francesi                                    ***/
006/***                                                                    ***/
007/***   Creazione :  12.10.1999                                          ***/
008/***   Revisione :  30.11.1999                                          ***/
009/**************************************************************************/
010 
011 
012/**************************************************************************/
013/**                      STRATEGIA DI COMPORTAMENTO                      **/
014/**                                                                      **/
015/**  Per costruire AKIRA sono andato a ripescare alcune buone idee dai   **/
016/**  miei precedenti robot, DIABLO e GOLEM, tentando come tutti gli anni **/
017/**  di prevedere (invano) la strategia dei robot piu' forti.            **/
018/**  Per contrastare l'ormai dilagante diffusione dei robot-pendolo ho   **/
019/**  deciso di utilizzare con un po' di coraggio un robot fermo.         **/
020/**  AKIRA e' infatti come un timido bambino che gioca tranquillo in un  **/
021/**  angolo. I suoi nemici non sanno pero' che la sua mente e' sveglia   **/
022/**  ed attenta ai movimenti altrui; per questo spara con buona preci-   **/
023/**  sione (utilizzando l'ottima routine di GOBLIN e di TOX, adattata    **/
024/**  alla vita in un angolo) e fugge al primo segno di pericolo in un    **/
025/**  angolo piu' tranquillo. Facendo questo cerca di farsi male il meno  **/
026/**  possibile attendendo le mosse nemiche. Spesso pero' la paura della  **/
027/**  morte prende il sopravvento su di lui e si getta in preda al panico **/
028/**  in mezzo all'arena irradiando di accecante energia psionica tutto   **/
029/**  cio' che lo circonda. Nella maggior parte dei casi questa mossa     **/
030/**  equivale al suo suicidio, ma si rivela molto efficace qualora un    **/
031/**  solo nemico abbia la sfortuna di incontrarlo.                       **/
032/**************************************************************************/
033 
034/***  N O T A  ************************************************************/
035/**  Chiedo scusa a chi stia tentando di comprendere questo listato per  **/
036/**  i forzati riferimenti al fumetto ma la mia creaturina ha piu' la    **/
037/**  pretesa di essere simpatica che di vincere premi ...                **/
038/**************************************************************************/
039       
040 
041int  tetsuo;             /* Contatore per possibile cambio strategia */
042int  destx, desty;       /* Punto di arrivo attuale */
043 
044int   ang;      /*  Angolo di scansione  */
045int  oang;      /*  Angolo di appoggio per operazioni  */
046 
047int  oriz;      /*  Direzione dei due lati di scansione  */
048int  vert;      /*  dell'angolo attualmente occupato     */          
049 
050int  rng, orng; /*  Distanza di fuoco per l'arma */
051int  nezu;      /*  Numero di ripetizioni prima di rilevare l'ultimo nemico */
052 
053int  sakaki;    /*  Direzione di movimento  */
054int  kay;       /*  Danno accumulato nell'angolo  */
055 
056int  num;       /* Numero nemici */
057int  s;         /* Contatore di servizio per il conto dei nemici */
058    
059 
060main()  
061{
062 
063   /**********************   A   K   I   R   A   **************************/
064   /*A*                                                                 *A*/
065   /***  ORE  23:59  del 30 Novembre 1999                               ***/
066   /*K*  Un nuovo tipo di crobot venne sperimentato sul torneo Y2k ...  *K*/
067   /***                                                                 ***/
068   /*I*  Nove ore piu' tardi ebbe inizio la Piu' Grande Guerra.         *I*/
069   /***  Furono bombardate dozzine di avversari ...                     ***/
070   /*R*  Infine, per la decima volta nella loro storia, gli autori di   *R*/
071   /***  crobots cominciarono un'opera di ricostruzione totale ...      ***/
072   /*A*                                                                 *A*/
073   /**********************   A   K   I   R   A   **************************/
074    
075    
076   /* Impostazione costanti */
077   ang=36000;  nezu = 0;
078    
079   desty=(loc_y()>500)*1000;    /*** Scelta angolo ***/
080   destx=(loc_x()>500)*1000;
081 
082   kaneda(0);
083 
084   while (1) {
085      tetsuo = 2150;     /***  E' finito l'effetto della pillola,  ***/
086      while (tetsuo) {   /***  meglio fare scorta  ...             ***/
087         kay=damage();  
088         akira();     
089      }
090      if (damage()<70) luce_accecante();
091   }
092
093 
094 
095 
096dist(x2,y2)     /** Formula di Pitagora **/
097int x2, y2;
098{
099  int x, y;
100 
101  x = loc_x() - x2;
102  y = loc_y() - y2;
103  return(sqrt((x*x) + (y*y)));
104}
105 
106 
107 
108ryu(xx,yy)     /** Trova la direzione che mi porti nell'angolo scelto **/
109int xx, yy;    /** Versione ridottissima adattata a questa strategia **/
110{
111  int r;
112  int curx, cury;
113 
114  curx = loc_x(); 
115  cury = loc_y();
116 
117  if (curx==xx) return (36090 + 180*(yy < cury));   /* --- Sud / Nord --- */
118 
119  r = 36000 + atan((100000 * (cury - yy)) / (curx - xx));
120  
121  if (xx > curx)
122     return (r + 360*(yy < cury));  /* --- Est --- */
123  else
124     return (r + 180);              /* --- Ovest --- */
125}
126 
127 
128  
129kaneda(clown)
130int clown;
131{
132  /***  Procedura di avvicinamento ad un angolo  ***/
133   
134  int dsic;    /*  Distanza e velocita' max  */
135 
136  dsic = 100;
137 
138  while (dsic) {
139        sakaki = ryu(destx,desty);  /*  Si dirige verso l'angolo scelto  */
140        drive(sakaki, dsic);
141        while ((dist(destx,desty) > dsic) && speed()) chiyoko(0);
142         
143        drive(sakaki,0);            /*  Frenata */
144        if (clown) {                /***  Ci sono teppisti in giro ***/
145           while(speed()>49);       /***  Meglio sbrigarsi !!      ***/
146           dsic=0;
147        } else {
148           dsic=10*(dsic==45) + 45*(dsic==100);   /*** Un if con due else! ***/
149           while (speed()>dsic) chiyoko(0);       /* Rallentamento */         
150        }
151  }
152 
153  oriz = 36000 + 180*(destx>500);       /*** Margini di scansione ***/
154  vert = 36090 + 180*(desty>500);     
155 
156  reset();
157}
158 
159reset()
160{
161   /***  Riallineamento scanner rispetto ai margini dell'angolo scelto ***/
162   if ((oriz+90)==vert)       /* Angolo iniziale */
163      ang=oriz-18;      /***  SO / NE  ***/
164   else ang=vert-18;    /***  NO / SE  ***/
165}
166 
167akira()
168{
169   /***  Procedura principale di stazionamento in un angolo ***/
170   
171   reset();
172     
173   oang=ang-21;
174   num=0; s=7;
175   while (--s)                 /*** Ricerca nemici ... ***/
176      num += (scan(oang+=21, 10)>0);
177   if (num<2) ++nezu; else nezu=0;
178 
179   if (nezu>1) luce_accecante();  /*** Strategia F2F ***/
180   else {
181      while ((--tetsuo)%10) {      /***  Controllo ogni dieci pillole  ***/
182         if (kay<damage()) {       /***  FUGA: Cambio angolo  ***/
183               if (scan(vert-10, 10) || scan(vert+10, 10)) {       /* C'e' nessuno? */
184                  if (!scan(oriz-10, 10) && !scan(oriz+10, 10)) {  /* Ehila' ? */
185                     destx = 1000*(destx<500);
186                     desty = loc_y();
187                     kaneda(1); return;
188                  }
189               } else {
190                     desty = 1000*(desty<500);
191                     destx = loc_x();
192                     kaneda(1); return;  
193               }
194     } else chiyoko(1);
195      }
196   }
197}
198 
199 
200chiyoko(takatataka)
201int takatataka;
202{
203   /***  Procedura di attacco -  Fermo / In movimento  ***/
204 
205   if (orng=scan(ang,10))
206   {
207        if (!scan(ang-=5,5)) ang+=10;
208        if (orng>650)
209        {
210        if (!scan(ang-=3,3)) ang+=6;
211            cannon(ang,orng); ang+=21;
212        } else {
213           if(scan(ang-5,1)) ang-=5;
214           if(scan(ang+5,1)) ang+=5;
215           if(scan(ang-3,1)) ang-=3;
216           if(scan(ang+3,1)) ang+=3;
217           if(scan(ang-1,1)) ang-=1;
218           if(scan(ang+1,1)) ang+=1;
219 
220           if (orng=scan(oang=ang,5))
221           {
222               if(scan(ang-5,1)) ang-=5;
223               if(scan(ang+5,1)) ang+=5;
224               if(scan(ang-3,1)) ang-=3;
225               if(scan(ang+3,1)) ang+=3;
226               if(scan(ang-1,1)) ang-=1;
227               if(scan(ang+1,1)) ang+=1;
228       
229 
230               if (rng=scan(ang,10))
231               {
232                   if (takatataka)       /***  Da fermo  ***/
233                   {
234                   cannon(ang+(ang-oang)*((1200+rng)>>9),
235                          rng*160/(160+orng-rng));
236                   }
237                   else
238                   {
239                   cannon(ang+(ang-oang)*((1200+rng)>>9)-(sin(ang-sakaki)>>14),
240                          rng*160/(160+orng-rng-(cos(ang-sakaki)>>12)));
241                   }
242                   return;               
243               }
244           }
245        }
246   } else {
247        if (scan(ang-=21,10));
248        else if (!scan(ang+=42,10)) ang+=21;
249   }
250         
251   if (takatataka) {                /* Da fermo conviene limitare          */
252      if ((oriz+90)==vert) {        /* l'ampiezza dell'angolo di scansione */
253          if (ang>oriz+120) ang=oriz-18;
254      } else {
255          if (ang>vert+120) ang=vert-18;
256      }
257   }
258}
259 
260 
261luce_accecante()
262{
263   /********************   A   K   I   R   A   *********************/
264   /*A*                                                          *A*/
265   /*K*   AAARRRGH !                                             *K*/
266   /*I*   Oh no! Ti prego, AKIRA, non farlo!                     *I*/
267   /*R*   Cos'e' questa luce accecante?!   Non e' possibile!     *R*/
268   /*A*   Si sta irradiando da AKIRA!                            *A*/
269   /***                                                          ***/
270   /********************   A   K   I   R   A   *********************/
271 
272 
273   /***   Strategia Finale : pendolamento corto orizzontale
274                             al centro dell'arena                ***/
275 
276   drive(sakaki=ryu(500, 500), 100);        /*** Il Cuore della Distruzione ***/
277   while (dist(500,500)>70) chiyoko(0);
278   drive(sakaki,0); chiyoko(0);
279   while(speed()>49);
280    
281   while(1) {
282      drive(sakaki=36180, 100);               /*** A Sinistra ***/
283      while (loc_x()>450) chiyoko(0);
284      drive(36180, 0);
285      
286      while (speed()>49);      /***  Non perdo tempo : qui in mezzo  ***/
287                               /***  Sta esplodendo tutto quanto !!  ***/
288   
289      drive(sakaki=36000, 100);                 /*** A Destra   ***/
290      while (loc_x()<550) chiyoko(0);
291      drive(36000,0);
292         
293      while (speed()>49);     
294   }      /*** Ci sara' un futuro per gli altri crobots ??!??! ***/
295}