2000/newzai17.r
001 | /* |
002 | Nome del robot : AleZai17.r |
003 | Autore : Alessandro Tassara |
004 |
005 | NewZai17 in realt� ha poche parentele con il mio vecchio robottino: |
006 | innanzitutto all'inizio della partita, raggiunto l'angolo piu' vicino, conta |
007 | i nemici, e se ne ha solo uno attacca. |
008 | Inoltre non sta mai fermo, dal momento che tale comportamento mi pare poco |
009 | raccomandabile in un universo dove tutti stanno cercando di farti la pelle. |
010 | Oscilla alternativamente in direzione di un nemico o brevemente lungo la |
011 | diagonale (in stile dav46). |
012 | L'unica particolarita' e' rappresentata dall'ampiezza dell'oscillazione, che |
013 | viene calcolata al volo in modo di non arrivare mai a meno di 600 metri dal |
014 | nemico. |
015 | Se comunque lo infastidiscono troppo salta sulla sua Peugeot106 (che per motivi |
016 | di budget ancora non ha potuto cambiare, nonostante ormai mostri tutti i suoi |
017 | anni) e scappa in un altro angolo. |
018 | La routine finale e' il robot Satana di Dario Serino. |
019 | Immagino che quest'anno le scuole di pensiero saranno due: |
020 | - Satana like |
021 | - Anti Satana. |
022 | Dal momento che non sono riuscito nella seconda mi accontento della prima. |
023 |
024 | Quest'anno l'efficienza dei miei robottini e' veramente scandalosa, ragion per |
025 | cui non dovrei fare dediche, tuttavia..... |
026 | ......................Dedicato a Z. |
027 | */ |
028 |
029 | int oang,ndist,vdist,min; |
030 | int ang,dir,curx,cury,dan,anni,last,flag4; |
031 | int normal,rng,orng; |
032 | int l,noia,str,a,oa,vista, clock ; |
033 |
034 | main() |
035 | { |
036 | min=4000; /*distanza minima del bordo*/ |
037 | last=curx=(1000*(loc_x()>500)); |
038 | cury=loc_y(); /*calcola posizione*/ |
039 | dir=180*(curx<loc_x()); /*e direzione per arrivare a destinazione*/ |
040 | Peugeot(); |
041 | stop(); |
042 | curx=loc_x(); |
043 | cury=(1000*(loc_y()>500)); |
044 | dir=90+180*(cury<loc_y()); |
045 | Peugeot(); |
046 | stop(); |
047 | curx=last; |
048 | /* anni=20; |
049 | Vai(); |
050 | */ while (1) /*inizia il loop, nel quale, con una routine copiata da goblin, calcola l' angolo*/ |
051 | { |
052 | if (loc_x()<500) if (loc_y()<500) dir=90; else dir=0; |
053 | else if (loc_y()<500) dir=180; else dir=270; |
054 | str=dir; |
055 | if (++noia<12) |
056 | { |
057 | dir+=315; |
058 | while (Loin(curx,cury)<12000) {drive (dir,100);fire(1);} |
059 | dir=(360+((curx-loc_x())<0)*180+ atan (((cury-loc_y())*100000)/(curx-loc_x()))); |
060 | } |
061 | else |
062 | { |
063 | if ((scan(dir,10))<scan(dir+270,10)) dir+=270; |
064 | l=scan(dir,10)-700; |
065 | if ((l*=l)>45000) l=45000; |
066 | if (l<12000) l=12000; |
067 | while (Loin(curx,cury)<l) {drive (dir,100);fire(1);} |
068 | dir+=180; |
069 | } |
070 | if (noia>20) noia=0; |
071 | while (speed()>49) drive (dir,0); |
072 | min=11000; |
073 | Peugeot(); |
074 | drive (dir,0); |
075 | min=4000; |
076 | if (noia==11) while (Loin(curx,cury)>5000) drive(dir,40); |
077 | dir=str; |
078 | Vai(); |
079 | } |
080 | } |
081 |
082 | Vai() |
083 | { |
084 | if (((++anni)>20)&&(damage()<90)) /*controlla se per caso e' rimasto un solo superstite e in quel caso attacca*/ |
085 | { |
086 | stop(); |
087 | anni=10; |
088 | last=0; |
089 | while ((anni+=20)<750) last+=(scan(anni,10)>0); |
090 | if (last<3) |
091 | mainsat(); |
092 | anni=0; |
093 | } |
094 |
095 | if ((dan<damage()-24)||((vdist)&&(vdist<500))) |
096 | { |
097 | if (Scan(dir)) /*controlla se l' angolo precedente e' libero*/ |
098 | { |
099 | Viaggia(); |
100 | } |
101 | else if ((Scan(dir+270))) /*controlla se l' angolo seguente e' libero*/ |
102 | { |
103 | dir+=270; |
104 | Viaggia(); |
105 | } |
106 | else if (Scan(dir+315)) /*controlla se l' angolo opposto e' libero*/ |
107 | { |
108 | dir+=315; |
109 | Viaggia(); |
110 | } |
111 | dan=damage(); |
112 | } |
113 | } |
114 |
115 | Viaggia() |
116 | { |
117 | if ( sin (dir)) cury=1000-cury; /*calcola le nuove coordinate delle destinazioni*/ |
118 | if ( cos (dir)) curx=1000-curx; |
119 | Peugeot(); /*va a destinazione*/ |
120 | stop(); |
121 | } |
122 |
123 | Peugeot() /*Si sposta verso le coordinate date*/ |
124 | { |
125 | drive(dir,100); |
126 | while ((Loin(curx,cury)>27000)&&(speed())) |
127 | fire(1); /*quando e' lontano dai bordi usa le routine di Jedi*/ |
128 | drive(dir,80); |
129 | while ((Loin(curx,cury)>min)&&(speed())) |
130 | fire2(); /*quando e' vicino ai bordi usa le routine di Drago6*/ |
131 | } |
132 |
133 | /* Utilities per raccogliere il codice */ |
134 |
135 | Scan(i) |
136 | int i; |
137 | { |
138 | return ((scan(i+350,10)+scan(i+10,10))<400); /*effettua una scansione allargata di 14 gradi*/ |
139 | } |
140 |
141 |
142 | Loin(nx,ny) /*da Son-Goku (ciao Simo)*/ |
143 | int nx, ny; |
144 | { |
145 | return (((nx-=loc_x())*nx+(ny-=loc_y())*ny)); |
146 | } |
147 |
148 | stop() /*da Arale*/ |
149 | { |
150 | drive(dir,0); |
151 | while (speed() > 49) |
152 | if ((ndist=scan(ang,10))&&(ndist<770)) cannon(ang,ndist); |
153 | else Dove(); |
154 | } |
155 |
156 | /* Le routines d'attacco */ |
157 |
158 | fire(si) /* fire() - routine di sparo in movimento - generoso lascito di nonno Jedi */ |
159 | int si; |
160 | { |
161 | if (vdist=scan(ang,10)) |
162 | { |
163 | if (vdist>700) |
164 | return fire2(); |
165 |
166 | if (!scan(ang-=5,10)) ang+=10; |
167 |
168 | if (scan(ang+354,1)) ang+=354; /*tranne questo che viene da Coppi*/ |
169 | if (scan(ang+6, 1)) ang+=6; |
170 | if (scan(ang+356,1)) ang+=356; |
171 | if (scan(ang+4, 1)) ang+=4; |
172 | if (scan(ang+358,1)) ang+=358; |
173 | if (scan(ang+2, 1)) ang+=2; |
174 |
175 | if (vdist=scan(oang=ang,5)) |
176 | { |
177 | if (scan(ang+354,1)) ang+=354; |
178 | if (scan(ang+6, 1)) ang+=6; |
179 | if (scan(ang+356,1)) ang+=356; |
180 | if (scan(ang+4, 1)) ang+=4; |
181 | if (scan(ang+358,1)) ang+=358; |
182 | if (scan(ang+2, 1)) ang+=2; |
183 |
184 | if (ndist=scan(ang,10)) |
185 | { |
186 | cannon((ang+(ang-oang)*((1200+ndist)>>9)-(si)*( sin (ang-dir)>>14)),(ndist*160/(160+vdist-ndist-(si)*( cos (ang-dir)>>12)))); |
187 | } |
188 | } |
189 | else fire2(); |
190 | } |
191 | else Dove(); |
192 | } |
193 |
194 | fire2() /*da Drago6*/ |
195 | { |
196 | if ((vdist=scan(ang,10))&&(vdist<770)) |
197 | { |
198 | if (!scan(ang+=355,5)) ang+=10; |
199 | if (!scan(ang+=357,3)) ang+=6; |
200 | cannon(ang,3*scan(ang,10)-2*vdist); |
201 | } |
202 | else |
203 | if ((ndist=scan(ang+=340,10))) |
204 | cannon(ang,ndist); |
205 | else |
206 | if ((ndist=scan(ang+=40,10))) |
207 | cannon(ang,ndist); |
208 | else |
209 | if ((ndist=scan(ang+=300,10))) |
210 | cannon(ang,ndist); |
211 | else |
212 | if ((ndist=scan(ang+=80,10))) |
213 | cannon(ang,ndist); |
214 | else |
215 | return (ang+=40); |
216 | } |
217 |
218 | Dove() /*da Coppi, ma almeno qui c' e' del mio*/ |
219 | { |
220 | if ((ndist=scan(ang+339,10))) cannon (ang+=339,ndist); |
221 | else if ((ndist=scan(ang+21,10))) cannon (ang+=21,ndist); |
222 | else if (ndist=scan(dir,10)) |
223 | cannon (ang=dir,scan(ang,10)); |
224 | else return (ang+=40); |
225 | } |
226 |
227 | mainsat() { |
228 |
229 | while (normal=3) { |
230 | if (dir==270) while (focus(loc_y()<275)); |
231 | else if (dir==90) while (focus(loc_y()>725)); |
232 | else if (dir) while (focus(loc_x()<275)); |
233 | else while (focus(loc_x()>725)); |
234 |
235 | if (normal) drive((dir+180)%=360,50); |
236 | else drive(dir=(( ((a+180)/90) + ( clock ^=1) )*90)%360,50); |
237 |
238 | while (speed()>50) |
239 | Dove(); |
240 |
241 | drive(dir,100); |
242 | } |
243 | } |
244 |
245 | focus( exit ) { |
246 | if ( exit ) return 0; |
247 | else { |
248 | drive(dir,100); |
249 |
250 | if (scan(a,10)); |
251 | else if (scan(a+=21,10)); |
252 | else if (scan(a-=42,10)); |
253 | else {a+=84; return --normal;} |
254 |
255 | if (scan(a-=5,5)); else a+=10; |
256 | if (scan(a+5,2)) a+=5; if (scan(a-5,2)) a-=5; |
257 | if (scan(a+3,1)) a+=3; if (scan(a-3,1)) a-=3; |
258 | if (scan(a+1,1)) a+=1; if (scan(a-1,1)) a-=1; |
259 | if (orng=scan(oa=a,5)) { |
260 | if (scan(a+13,10)) a+=5; if (scan(a-13,10)) a-=5; |
261 | if (scan(a+12,10)) a+=3; if (scan(a-12,10)) a-=3; |
262 | if (scan(a+10,10)) a+=1; if (scan(a-10,10)) a-=1; |
263 |
264 | if (rng=scan(a,10)) |
265 | cannon(a+ (a-oa)*((1200+rng)>>9)- ( sin (a-dir)>>14), |
266 | rng*192/(192+ orng-rng- ( cos (a-dir)>>12))); |
267 |
268 | if (a==oa) return normal>>=1; |
269 | } |
270 | return --normal; |
271 | } |
272 | } |