2013/guanaco.r
001 | /* |
002 |
003 | Nome: guanaco.r (midi) |
004 | Autore: Franco Cartieri |
005 |
006 | Torneo 2013 |
007 |
008 | Descrizione robot: |
009 | Guanaco � sostanzialmente Leopon, con l'unica modifica che l'oscillazione nel 4vs4 non � fatta contro le pareti dell'angolo |
010 | ma un po pi� verso il centro dell'arena. |
011 | Ad ogni ciclo controlla se nel proprio angolo � presente un robot. |
012 | Migliora leggermente nel f2f, ma peggiora pesantemente nel 4vs4. |
013 | */ |
014 |
015 | int x,y,dir,rng,orng,deg,odeg,xs,ys,en,timer,xd,yd,xp,yp,dmax,dmin,zd,angolo; |
016 |
017 | spara(dir) |
018 | { |
019 | drive(dir,100); |
020 | if ((orng=scan(deg, 10)) ) |
021 | { |
022 | if (scan(deg-9,5)) |
023 | { |
024 | if (scan(deg-=13,5)) |
025 | { |
026 | if (scan(deg-3,5)) deg-=5; |
027 | else ++deg; |
028 | } |
029 | else |
030 | { |
031 | if (scan(deg-5,5)) deg-=5; |
032 | else ++deg; |
033 | } |
034 | } |
035 | else |
036 | { |
037 | if (scan(deg+9,5)) |
038 | { |
039 | if (scan(deg+=13,5)) deg+=5; |
040 | else --deg; |
041 | } |
042 | else |
043 | { |
044 | if (scan(deg+5,5)) deg+=5; |
045 | else --deg; |
046 | } |
047 | } |
048 | } |
049 | else |
050 | { |
051 | if ((orng=scan(deg-=20,10))) |
052 | { |
053 | if (scan(deg-9,10)) |
054 | { |
055 | if (scan(deg-=13,5)) deg-=5; |
056 | else ++deg; |
057 | } |
058 | else |
059 | { |
060 | if (scan(deg+9,10)) deg+=5; |
061 | else --deg; |
062 | } |
063 | } |
064 | else |
065 | { |
066 | if ((orng=scan(deg+=40,10))) |
067 | { |
068 | if (scan(deg+9,10)) deg+=12; |
069 | } |
070 | else |
071 | { |
072 | if ((orng=scan(deg+=20,10))); |
073 | else |
074 | { |
075 | if (orng=scan(deg-=80,10)) return cannon(deg,orng); |
076 | else if (orng=scan(deg-=20,10)) return cannon(deg,orng); |
077 | else if (orng=scan(deg+=120,10)) return cannon(deg,orng); |
078 | else if (orng=scan(deg+=20,10)) return cannon(deg,orng); |
079 | else if (orng=scan(deg-=160,10)) return cannon(deg,orng); |
080 | else return deg+=260; |
081 | } |
082 | } |
083 | } |
084 | } |
085 | if (rng=scan(deg,10)) |
086 | { |
087 | cannon (deg, rng*135/(135+orng-rng) ); |
088 | if (rng>1000) |
089 | return deg+=40; |
090 | } |
091 | else if (scan(deg-20,10)) deg-=20; |
092 | else if (scan(deg+=20,10)); |
093 | else deg+=40; |
094 | } |
095 |
096 | count() |
097 | { |
098 | while (dmin<=dmax) en+=(scan(dmin+=20,10)>0); |
099 | dmin=zd; |
100 | } |
101 |
102 | main() |
103 | { |
104 | xp=300+(xs=loc_x(yp=300+(ys=(loc_y(en=0))>499)*400)>499)*400; |
105 | drive(dir=((xd=180*xs)+180),100); |
106 | while (check(xp,3-xs)) drive(dir,100); |
107 | fire(dir,0); |
108 | while (speed()>59); |
109 | drive(dir=((yd=90+180*ys)+180),100); |
110 | while (check(yp,7-ys)) drive(dir,100); |
111 | fire(dir,0); |
112 | while (speed()>59); |
113 |
114 | count(dmax=(dmin=zd=(yd-115+90*(xs^ys)))+120); |
115 | angolo = dmin+250; |
116 |
117 | while (en>1) |
118 | { |
119 | run(xd,xp,2-xs); |
120 | run(yd,yp,6-ys); |
121 | } |
122 | f2f(); |
123 | } |
124 |
125 | fire(dir, v) |
126 | { |
127 | drive(dir,v); |
128 | if (rng=scan(odeg=deg,10)) |
129 | { |
130 | if (scan(deg-8,5)) |
131 | { |
132 | if (scan(deg-=5,2)) ; |
133 | else deg-=4; |
134 | } |
135 | else |
136 | { |
137 | if (scan(deg+8,5)) |
138 | { |
139 | if (scan(deg+=5,2)) ; |
140 | else deg+=4; |
141 | } |
142 | else |
143 | { |
144 | if (scan(deg,1)) ; |
145 | else if (scan(deg-=3,2)) ; else deg+=6; |
146 | } |
147 | } |
148 | return (cannon(deg+(deg-odeg),2*scan(deg,10)-rng)); |
149 | } |
150 | else |
151 | { |
152 | if (rng=scan(deg+=20,10)) cannon(deg,rng); |
153 | else if (rng=scan(deg-=40,10)) cannon(deg,rng); |
154 | else deg+=80; |
155 | } |
156 | } |
157 |
158 | run(d,l,m) |
159 | { |
160 | int r; |
161 | if (timer%12==2) |
162 | { |
163 | count(en=0); |
164 | } |
165 | while ((++r)<3) |
166 | { |
167 | drive(d,100); |
168 | if (++timer>400+damage()) f2f(); |
169 | if (scan(d,10)) |
170 | deg=d; |
171 | else if (scan(angolo,10)) |
172 | deg=angolo; |
173 | while (check(l,m)) ; |
174 | fire(d,0); |
175 | while (speed()>59) ; |
176 | ++m; |
177 | d+=180; |
178 | } |
179 | } |
180 |
181 | check(l,m) |
182 | { |
183 | int c1; |
184 | if (m<5) c1=loc_x(); else c1=loc_y(); |
185 | if (m%2) return (c1>l); else return (c1<l); |
186 | } |
187 |
188 | f2f() |
189 | { |
190 | int b,fp; |
191 | while (1) |
192 | { |
193 | if ((x=loc_x(y=loc_y()))>850) dir=155+50*(y>500); |
194 | else if (x<150) dir=335+50*(y<500); |
195 | else if (y>850) dir=245+50*(x<500); |
196 | else if (y<150) dir=65+50*(x>500); |
197 | else |
198 | { |
199 | if (orng<600) dir=deg+80+(b^=1)*190; |
200 | else dir=deg+50+(b^=1)*230; |
201 | } |
202 | spara(dir); |
203 | ++fp; if (fp>5) ++fp; fp=5; |
204 | spara(dir); |
205 | } |
206 | } |