2004/goofy.r
001 | /* |
002 | Nome : Goofy |
003 | Versione : m_8.r |
004 | Autore : Simone Ascheri |
005 |
006 |
007 | Commento |
008 | ======== |
009 |
010 | Goofy � un pasticcione. Uno di quei personaggi che sono capaci fare solo guai. Non � tutta colpa sua, poverino"! |
011 | Il modo in cui � venuto al mondo non � certo dei migliori, tirato fuori da una costola di Frankie, che gi� non ara un buon cmbattente. |
012 | Qui l'erredit� di Danica � ancora + pesante, dal momento che ne condivide anche l'attacco dinale, con pochissime varianti, se non nulle. |
013 | Sar� per l'anno prossimo (speriamo). |
014 |
015 | Strategia |
016 | ========= |
017 |
018 | 1)Goofy all'inizio del match si sposta nell'angolo piu' vicino � controlla se � rimasto solo. |
019 | In caso affermativo parte con l'attacco finale. |
020 |
021 | 2)Se, invece, i due angoli adiacenti sono occupati, oscilla alternativamente lungo i lati dell'arena con brevi movimenti, utilizzando le routine di Danica. |
022 |
023 | 3)Quando si accorge che uno degli angoli � disabitato, capisce che lo scontro � per lo meno a tre robot (un vero genio). |
024 | 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. |
025 |
026 | 4)Se, putacaso, trova invece altri due nemici, sfrutta la sua routine di attacco a tre nuova di zecca: |
027 | 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�.... |
028 |
029 | Note Tecniche |
030 | ============= |
031 |
032 | Nessuna. |
033 | */ |
034 |
035 | int ang, dx, dy; |
036 | int a, oa, r, or, s_lim, i_lim; |
037 | int h,a1,a2; |
038 | int ang_pref; |
039 | int max,rng,mr,z,t,ang_p2; |
040 | int dove,oldr,rng,run, switch ,dan,si; |
041 |
042 | int xs,ys,rd,ren,sc1,sc2,ff,xmax,xd,yd,xp,yp,dmax,dmin,zd; |
043 |
044 | main() |
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 |
061 | Run(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 |
077 | Check(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 |
083 | Dista(nx,ny) |
084 | int nx, ny; |
085 | { |
086 | return (h=((nx-=loc_x())*nx+(ny-=loc_y())*ny)); |
087 | } |
088 | |
089 | Stop() |
090 | { |
091 | PallaDiFuoco(PallaDiFuoco(drive(ang+=180,0))); |
092 | } |
093 |
094 |
095 |
096 | tre() |
097 | int 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 |
147 | conta(angolo) |
148 | int 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 |
168 | PallaDiFuoco(meglio) |
169 | int 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 |
192 | Rivela() |
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 |
204 | Sparare(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 | } |