2004/multics.r
001 | /* |
002 | Nome : Multics |
003 | Versione : V_al_??.??.r |
004 | Autore : Simone Ascheri |
005 |
006 |
007 | Commento |
008 | ======== |
009 |
010 | Multics vorrebbe essere un'evoluzione di Frankie, a cui vorrebbe almeno donare un attacco finale diverso. |
011 |
012 | Temo che, come l'originale progetto dei BELL LABS (se non erro) sar� un bel buco nell'acqua. |
013 |
014 | Ok, l'attacco � praticamente lo stesso. |
015 | L'unica differenza � che rende di piu' perche' conta gli avversari addirittura prima di muoversi... rischiando grosso di essere colpito. |
016 |
017 | Strategia |
018 | ========= |
019 |
020 | 1)Multics all'inizio del match si sposta nell'angolo piu' vicino � controlla se � rimasto solo. |
021 | In caso affermativo parte con l'attacco finale, che per ora � esattamente quello di Alcadia. Spero, nelle prox due ore, di |
022 | mettere insieme qualche cosa di vagamente piu' originale. |
023 |
024 | 2)Se, invece, i due angoli adiacenti sono occupati, oscilla alternativamente lungo i lati dell'arena con brevi movimenti, utilizzando le routine di Danica. |
025 |
026 | 3)Quando si accorge che uno ali angoli � disabitato, capisce che lo scontro � per lo meno a tre robot (un vero genio). |
027 | Conta 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 |
029 | 4)Se, putacaso, trova invece altri due nemici, sfrutta la sua routine di attacco a tre nuova di zecca: |
030 | si 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 |
032 | Note Tecniche |
033 | ============= |
034 |
035 | 1)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. |
036 | 2)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 |
039 | int ang, dx, dy; |
040 | int a, oa, r, or, s_lim, i_lim; |
041 | int h,a1,a2; |
042 | int ang_pref; |
043 | int max,rng,mr,z,t,ang_p2; |
044 | int dove,oldr,rng,run, switch ,dan,si; |
045 |
046 | int a,rng,oa,xs,ys,en,rd,ren,timer,sc1,sc2,ff,xmax,xd,yd,xp,yp,dmax,dmin,zd; |
047 |
048 | main() |
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 |
067 | Run(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 |
086 | Check(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 |
092 | Dista(nx,ny) |
093 | int nx, ny; |
094 | { |
095 | return (h=((nx-=loc_x())*nx+(ny-=loc_y())*ny)); |
096 | } |
097 | |
098 | Stop() |
099 | { |
100 | PallaDiFuoco(PallaDiFuoco(drive(ang+=180,0))); |
101 | } |
102 |
103 | att() |
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 |
134 | Fire() |
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 |
159 | tre() |
160 | int 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 |
212 | conta() |
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 |
229 | PallaDiFuoco(meglio) |
230 | int 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 |
253 | Rivela() |
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 |
264 | Fuoco(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 |
294 | Sparare(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 | } |