2002/romulus.r
001 | /* |
002 | ROMULUS.r |
003 |
004 | Scritto da: |
005 | Angelo Ciufo |
006 |
007 |
008 | Il robot e' una netta espansione di harris.r del 2001. |
009 | La tattica del robot e' molto simile a quella del fratellino |
010 | Remus.r |
011 | Si reca nell'angolo piu' vicino, e oscilla percorrendo un movimento |
012 | triangolare ('rubato' a tornado.r del 98) |
013 | Se e' colpito cerca un angolo libero. |
014 | Dopo 1140 chiamate alle funzioni di sparo attacca i superstiti |
015 | se e' in buone condizioni |
016 | */ |
017 |
018 |
019 |
020 | int rng, deg; /* Distanza e Gradi */ |
021 | int orng, odeg; /* Distanza e Gradi Old */ |
022 | int dir; /* La mia direzione */ |
023 | int ne; /* Numero avversari */ |
024 | int normal; |
025 |
026 | int danni; |
027 | int i,b,d; |
028 | int x,y; |
029 | int t; |
030 | int att; |
031 |
032 | main() |
033 | { |
034 | ne=3; |
035 | if (loc_x ()<500) x=100; else x=900; |
036 | if (loc_y ()<500) y=85; else y=915; |
037 | vai (x,y); |
038 | |
039 | while (danni=damage()+25) { |
040 | /*angle ();*/ |
041 | while (damage(i=9)<danni) { |
042 | /*oscilla (9);*/ |
043 | while (--i) { |
044 | if (loc_x()<500) if (loc_y()<500) |
045 | { xsmin(160,0); xsmag(80,135); ysmag(80,270); } |
046 | else |
047 | { ysmag(840,270); ysmin(920,45); xsmag(80,180); } |
048 | else if (loc_y()<500) |
049 | { ysmin(160,90); ysmag(80,225); xsmin(920,0); } |
050 | else |
051 | { xsmag(840,180); xsmin(920,315);ysmin(920,90); } |
052 | } |
053 | if (!orng||orng>850) { |
054 | i=-10; ne=0; |
055 | while (i<360) { |
056 | if (scan (i+=20, 10)) ++ne; |
057 | } |
058 | if (ne<2) boom (); |
059 | else if (t>1140) { |
060 | if (ne<3 && damage()<60) seek(att=70); |
061 | else if (damage()<40) seek(att=45); |
062 | else t=0; |
063 |
064 | } |
065 | } |
066 | } |
067 | /*move ();*/ |
068 | if (loc_y()<500) { |
069 | if (libero(90)) vai(x,y=915); |
070 | else sxdx (); |
071 | } else { |
072 | if (libero(270)) vai(x,y=85); |
073 | else sxdx (); |
074 | } |
075 | } |
076 | } |
077 |
078 | sxdx () |
079 | { |
080 | if (loc_x()<500) { |
081 | if (libero(0)) vai(x=900,y); |
082 | } |
083 | else { |
084 | if (libero(180)) vai(x=100,y); |
085 | } |
086 | } |
087 |
088 | xsmag(x,d) { while (loc_x()>x) spara(drive(d,100)); drive(d,0); } |
089 | xsmin(x,d) { while (loc_x()<x) spara(drive(d,100)); drive(d,0); } |
090 | ysmag(y,d) { while (loc_y()>y) spara(drive(d,100)); drive(d,0); } |
091 | ysmin(y,d) { while (loc_y()<y) spara(drive(d,100)); drive(d,0); } |
092 |
093 | vai (x,y) |
094 | { |
095 | spara(drive (dir=deg(x,y),100)); |
096 | while (dist(x,y)>22500) fuoco(drive (dir,100)); |
097 | while (dist(x,y)>12000) spara(drive (dir,100)); |
098 | while (dist(x,y)>1600) drive (dir,100); |
099 | spara(drive (dir,0)); |
100 | } |
101 |
102 | /* Angolo per andare in una certa direzione */ |
103 | deg(x,y) { return (180+((x-=(loc_x()))>0)*180+ atan (((y-loc_y())*100000)/x)); } |
104 |
105 | /* Calcola la distanza rispetto ad un punto dato */ |
106 | dist(x,y) { return (((x-=loc_x())*x+(y-=loc_y())*y)); } |
107 |
108 |
109 | /* rende vero se il dato angolo e' libero */ |
110 | libero (gradi) |
111 | { |
112 | return (!(scan(gradi+350,10) ||scan(gradi+10,10))); |
113 | } |
114 |
115 |
116 | fuoco() { |
117 | ++t; |
118 | if (orng=scan(deg,10)) |
119 | { |
120 | if (orng>850) if (ne>1) {deg+=40; return ;} |
121 | if (!scan(deg+=354,6)) deg+=12; |
122 | find(); |
123 | if (orng=scan(odeg=deg,10)) |
124 | { |
125 | find(); |
126 | if (rng=scan(deg,10)) |
127 | { |
128 | cannon(deg+((deg-odeg)*((700+rng))>>9)-( sin (deg-dir)>>14), |
129 | rng*179/(179+orng-rng-( cos (deg-dir)>>12))); |
130 | } |
131 | |
132 | } |
133 | else search(); |
134 | } |
135 | else search(); |
136 | } |
137 |
138 | find() |
139 | { |
140 | if (scan(deg-7,3)) deg-=7; |
141 | if (scan(deg+7,3)) deg+=7; |
142 | if (scan(deg-4,2)) deg-=4; |
143 | if (scan(deg+4,2)) deg+=4; |
144 | if (scan(deg-2,1)) deg-=2; |
145 | if (scan(deg+2,1)) deg+=2; |
146 | } |
147 |
148 | |
149 | search() |
150 | { |
151 | if (!(orng=scan(deg+=339,10))){ |
152 | if (!(orng=scan(deg+=41,10))) { |
153 | if (!(orng=scan(deg+=21,10))) { |
154 | deg+=41; |
155 | return ; |
156 | } |
157 | } |
158 | } |
159 | else if (!scan(deg+=354,6)) deg+=12; |
160 | cannon(deg,orng); |
161 | } |
162 |
163 | spara() |
164 | /* routine di sparo*/ |
165 | { |
166 | ++t; |
167 | if ((orng=scan(deg, 10)) ) { |
168 | if (orng<150) return cannon(deg,2*scan(deg,10)-orng); |
169 | if (scan(deg-8,4)) { |
170 | if (scan(deg-=8+3,2)) { |
171 | if (scan(deg+=3-2,1)) deg-=2; |
172 | } else if (scan(deg-3,2)) deg-=3; |
173 | } else if (scan(deg+8,4)) { |
174 | if (scan(deg+=8+3,2)) deg+=3; |
175 | else --deg; |
176 | } else if (scan(deg+2,2)) deg+=2; |
177 | else --deg; |
178 |
179 | } else if ((orng=scan(deg-=20,10))) { |
180 | if (orng<150) return cannon(deg,2*scan(deg,10)-orng); |
181 | if (scan(deg-8,4)) { |
182 | if (scan(deg-=8-3,2)) deg-=3; |
183 | else ++deg; |
184 | } else if (scan(deg+7,4)) deg+=7; |
185 | } else if ((orng=scan(deg+=40,10))) { |
186 | if (orng<150) return cannon(deg,2*scan(deg,10)-orng); |
187 | if (scan(deg+7,4)) deg+=7; |
188 | } else if (!(orng=scan(deg+=20,10))) { |
189 | if ((orng=scan(deg+=21,10))) { |
190 | if (orng>850) { |
191 | cannon(deg,700); |
192 | if (!att) deg+=57; |
193 | return ; |
194 | } |
195 | } else { |
196 | if (!(scan(deg+=21,10))) deg+=40; |
197 | return ; |
198 | } |
199 | } |
200 | if (rng=scan(deg,10)){ |
201 | cannon (deg, rng*165/(165+orng-rng) ); |
202 | if (rng>720) if (!att) if (rng>orng || rng>850) { |
203 | deg+=57; |
204 | return orng=0; |
205 | } |
206 |
207 | } else if (scan(deg-20,10)) deg-=20; |
208 | else if (!scan(deg+=21,10)) deg+=57; |
209 | } |
210 |
211 | seek() { |
212 | i=320; |
213 | while (!(b=scan(i+=20, 10))); |
214 | deg=i; |
215 | while (i<700) { |
216 | if ((d=scan(i+=20, 10)) ) { |
217 | if (d<b) { |
218 | b=d; |
219 | deg=i; |
220 | } |
221 | } |
222 | } |
223 | drive(dir=deg,100); |
224 | b=0; |
225 | while ((damage(spara(drive(dir,100)))<att)&&orng) { |
226 | if (t%2) { |
227 | if (loc_x()>910 ) dir=180; |
228 | else if (loc_x()<90 ) dir=360; |
229 | else if (loc_y()>910 ) dir=270; |
230 | else if (loc_y()<90) dir=90; |
231 | else dir=deg+70+(b^=1)*215; /*65*/ |
232 | } |
233 | } |
234 | att=0; |
235 | drive((dir+180),100); |
236 | vai (x,y); |
237 | } |
238 |
239 | boom() |
240 | { |
241 | b=att=1; |
242 | while (1) { |
243 | if (t%2) { |
244 | if (loc_x()>910 ) dir=180; |
245 | else if (loc_x()<90 ) dir=360; |
246 | else if (loc_y()>910 ) dir=270; |
247 | else if (loc_y()<90) dir=90; |
248 | else dir=deg+65+(b^=1)*205+180*(orng<250); /*65*/ |
249 | spara(drive(dir,100)); |
250 | } else { |
251 | if (orng>400) fuoco(drive(dir,100)); |
252 | else spara(drive(dir,100)); |
253 | } |
254 | } |
255 | } |