2003/dave.r
001 | /* |
002 | Dave.r |
003 | Macro robot per il torneo 2003. |
004 |
005 | Scritto da: |
006 | Angelo Ciufo |
007 |
008 |
009 | Il robot e' basato su Remus.r del 2001, con notevoli ottimizzazioni. |
010 | Si reca nell'angolo piu' vicino, e oscilla con un movimento a 45�. |
011 | Se c'e' un unico superstite attacca con le routine di Pippo2a. |
012 | Stesso discorso se, dopo 820 chiamate alle funzioni di sparo, |
013 | e' in condizioni decenti e ha al max 2 avversari. |
014 | A differenza del predecessore (e del fratellone) non cambia mai angolo. |
015 | */ |
016 |
017 |
018 |
019 | int rng, deg; /* Distanza e Gradi */ |
020 | int orng, odeg; /* Distanza e Gradi Old */ |
021 | int dir; /* La mia direzione */ |
022 | int ne; /* Numero avversari */ |
023 |
024 | int i; |
025 | int x,y; |
026 | int t; |
027 |
028 | main() |
029 | { |
030 | vai (x=100+800*(loc_x (ne=3)>500),y=100+800*(loc_y ()>500)); |
031 | |
032 | while (1) { |
033 |
034 | if (!orng||orng>850) { |
035 | i=-10; ne=0; |
036 | while (i<360) { |
037 | if (scan (i+=20, 10)) ++ne; |
038 | } |
039 | if (ne<2) { |
040 | boom (); |
041 | } else if (t>620) { |
042 | if ((ne<3) && (damage()<60)) boom(); |
043 | else if (damage()<40) boom(); |
044 | else t=0; |
045 |
046 | } |
047 | } |
048 | /*oscilla (9);*/ |
049 | i=9; |
050 | while (--i) { |
051 | spara(drive (dir,100)); |
052 | while (loc_y()<=y) spara(drive (dir,100)); |
053 | dir+=180; |
054 | spara(drive (dir,100)); |
055 | while (loc_y()>=y) spara(drive (dir,100)); |
056 | dir-=180; |
057 | } |
058 | drive (dir,0); |
059 | } |
060 | /*move ();*/ |
061 | } |
062 |
063 |
064 | vai (x,y) |
065 | { |
066 | spara(drive (dir=deg(x,y),100)); |
067 | while (dist(x,y)>22500) fire(drive (dir,100)); |
068 | while (dist(x,y)>12000) spara(drive (dir,100)); |
069 | while (dist(x,y)>1600) drive (dir,100); |
070 | spara(drive (dir,0)); |
071 | if (y<500) { |
072 | if (x<500) {dir=135;} |
073 | else {dir=45;} |
074 | } else { |
075 | if (x<500) {dir=45;} |
076 | else {dir=135;} |
077 | } |
078 |
079 | } |
080 |
081 | /* Angolo per andare in una certa direzione */ |
082 | deg(x,y) { return (180+((x-=(loc_x()))>0)*180+ atan (((y-loc_y())*100000)/x)); } |
083 |
084 | /* Calcola la distanza rispetto ad un punto dato */ |
085 | dist(x,y) { return (((x-=loc_x())*x+(y-=loc_y())*y)); } |
086 |
087 |
088 | /* rende vero se il dato angolo e' libero */ |
089 | libero (gradi) |
090 | { |
091 | return (!(scan(gradi+350,10) ||scan(gradi+10,10))); |
092 | } |
093 |
094 |
095 | fire() { |
096 | ++t; |
097 | if (scan(deg,10)) |
098 | { |
099 | if ((orng=find(scan(deg,10)))<850) |
100 | { |
101 | if (rng=find()) |
102 | return cannon((odeg+(dag-odeg)*3-( sin (deg-dir)/19500)),(rng*200/(200+orng-rng-( cos (deg-dir)/4167)))); |
103 | } |
104 | } |
105 | if ((rng=scan(deg,10))&&(rng<850)); |
106 | else |
107 | if ((rng=scan(deg+=339,10))); |
108 | else |
109 | if ((rng=scan(deg+=42,10))); |
110 | else |
111 | return (deg+=40); |
112 | cannon (deg,2*scan(deg,10)-rng); |
113 | } |
114 |
115 | find() |
116 | { |
117 | if (scan((odeg=deg)-7,3)) deg-=7; |
118 | if (scan(deg+7,3)) deg+=7; |
119 | if (scan(deg-4,2)) deg-=4; |
120 | if (scan(deg+4,2)) deg+=4; |
121 | if (scan(deg-2,1)) deg-=2; |
122 | if (scan(deg+2,1)) deg+=2; |
123 | return (scan(deg,10)); |
124 | } |
125 | |
126 | spara() |
127 | /* routine di sparo*/ |
128 | { |
129 | ++t; |
130 | if ((orng=scan(deg, 10)) ) { |
131 | if (orng<150) return cannon(deg,2*scan(deg,10)-orng); |
132 | if (scan(deg-8,4)) { |
133 | if (scan(deg-=8+3,2)) { |
134 | if (scan(deg+=3-2,1)) deg-=2; |
135 | } else if (scan(deg-3,2)) deg-=3; |
136 | } else if (scan(deg+8,4)) { |
137 | if (scan(deg+=8+3,2)) deg+=3; |
138 | else --deg; |
139 | } else if (scan(deg+2,2)) deg+=2; |
140 | else --deg; |
141 |
142 | } else if ((orng=scan(deg-=20,10))) { |
143 | if (orng<150) return cannon(deg,2*scan(deg,10)-orng); |
144 | if (scan(deg-8,4)) { |
145 | if (scan(deg-=8-3,2)) deg-=3; |
146 | else ++deg; |
147 | } else if (scan(deg+7,4)) deg+=7; |
148 | } else if ((orng=scan(deg+=40,10))) { |
149 | if (orng<150) return cannon(deg,2*scan(deg,10)-orng); |
150 | if (scan(deg+7,4)) deg+=7; |
151 | } else if (!(orng=scan(deg+=20,10))) { |
152 | if ((orng=scan(deg+=21,10))) { |
153 | if (orng>850) { |
154 | cannon(deg,700); |
155 | return deg+=57; |
156 | } |
157 | } else { |
158 | if (!(scan(deg+=21,10))) deg+=40; |
159 | return ; |
160 | } |
161 | } |
162 | if (rng=scan(deg,10)){ |
163 | cannon (deg, rng*165/(165+orng-rng) ); |
164 | if (rng>720) if (rng>orng || rng>850) { |
165 | deg+=57; |
166 | return orng=0; |
167 | } |
168 |
169 | } else if (scan(deg-20,10)) deg-=20; |
170 | else if (!scan(deg+=21,10)) deg+=57; |
171 | } |
172 |
173 | boom() |
174 | { |
175 |
176 | while (1) |
177 | { |
178 | sx(350); |
179 | dx(650); |
180 | } |
181 | |
182 | } |
183 |
184 | dx(xx) |
185 | { |
186 | while (loc_x()<xx) vs(00); |
187 | stop(); |
188 | } |
189 | sx(xx) |
190 | { |
191 | while (loc_x()>xx) vs(180); |
192 | stop(); |
193 | } |
194 |
195 |
196 | vs(xx) |
197 | { |
198 | drive(dir=xx,100); |
199 | fuoco(); |
200 | } |
201 |
202 |
203 | stop() |
204 | { |
205 | drive(dir,0); |
206 | while (speed()>50); |
207 | } |
208 |
209 |
210 | fuoco() { |
211 | if (orng=scan(deg,10)); |
212 | else if (orng=scan(deg-=20,10)); |
213 | else if (orng=scan(deg+=40,10)); |
214 | else return deg+=41; |
215 | { |
216 | if (orng>850) { return deg+=41;} |
217 | if (!scan(deg+=354,6)) deg+=12; |
218 | if (scan(deg-6,2)) deg-=6; |
219 | else if (scan(deg+6,2)) deg+=6; |
220 | fnd(); |
221 | if (orng=scan(odeg=deg,10)) |
222 | { |
223 | if (scan(deg-7,3)) deg-=7; |
224 | else if (scan(deg+7,3)) deg+=7; |
225 | fnd(); |
226 | if (rng=scan(deg,10)) |
227 | { |
228 | cannon(deg+((deg-odeg)*((700+rng))>>9)-( sin (deg-dir)>>14), |
229 | rng*179/(179+orng-rng-( cos (deg-dir)>>12))); |
230 | } |
231 | |
232 | } |
233 | else { |
234 | if (!(orng=scan(deg+=339,10))){ |
235 | if (!(orng=scan(deg+=41,10))) { |
236 | if (!(orng=scan(deg+=21,10))) { |
237 | return deg+=41; |
238 | } |
239 | } |
240 | } |
241 | else if (!scan(deg+=354,6)) deg+=12; |
242 | return cannon (deg, 2*scan(deg,10)-orng); |
243 | } |
244 | } |
245 | } |
246 |
247 |
248 |
249 | fnd() |
250 | { |
251 | if (scan(deg-4,1)) deg-=4; |
252 | if (scan(deg+4,1)) deg+=4; |
253 | if (scan(deg-2,1)) deg-=2; |
254 | if (scan(deg+2,1)) deg+=2; |
255 | } |