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 |
041 | int tetsuo; /* Contatore per possibile cambio strategia */ |
042 | int destx, desty; /* Punto di arrivo attuale */ |
043 |
044 | int ang; /* Angolo di scansione */ |
045 | int oang; /* Angolo di appoggio per operazioni */ |
046 |
047 | int oriz; /* Direzione dei due lati di scansione */ |
048 | int vert; /* dell'angolo attualmente occupato */ |
049 |
050 | int rng, orng; /* Distanza di fuoco per l'arma */ |
051 | int nezu; /* Numero di ripetizioni prima di rilevare l'ultimo nemico */ |
052 |
053 | int sakaki; /* Direzione di movimento */ |
054 | int kay; /* Danno accumulato nell'angolo */ |
055 |
056 | int num; /* Numero nemici */ |
057 | int s; /* Contatore di servizio per il conto dei nemici */ |
058 | |
059 |
060 | main() |
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 |
096 | dist(x2,y2) /** Formula di Pitagora **/ |
097 | int 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 |
108 | ryu(xx,yy) /** Trova la direzione che mi porti nell'angolo scelto **/ |
109 | int 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 | |
129 | kaneda(clown) |
130 | int 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 |
159 | reset() |
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 |
167 | akira() |
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 |
200 | chiyoko(takatataka) |
201 | int 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 |
261 | luce_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 | } |