/* Nome del robot : Serse Nome del file : Serse.r Autore : Gianni Ino Il robot all'inizio del match si reca nell'angolo piu' vicino, e controlla che non sia uno scontro a singolar tenzone: se e' cosi' attacca con la routine finale che è identica a quella dei miei due microbi. Altrimenti utilizza la strategia di gioco di Attila.r, leggermente modificata: infatti sono sparite le routine di fuoco precise di Michelangelo Messina, sostituite dalla grezzissima fire(). D'altra parte doveva stare in 1000 istruzioni......... Anche Serse, inoltre, non non si separa mai dall'angolo iniziale. */ int ang,verso,a,oang,r,or; int dx,dy,sx,dw,x,y; int inverti,how,count,dam; int nrg,rg,t,b; int park, ux, uy; int dan,vang; int dir, ango, oang, range, orange; int dang, alfa, corr, anco,dir,ang; main() { int delta; dx=980-960*(sx=((x=loc_x(dy=980-960*(dw=((y=loc_y())<500))))<500)); if (x-=dx) a=540+180*(x>0)+atan(((y-dy)*100000)/x); else a=630-180*dw; drive(ang=a+180,100); while(GeoMetra(dx,dy)>5200) fire(); Consiglieri(); Babilonia(ang=(verso=225-180*dw+90*(sx^dw))); how=65000; delta=45; dan=damage(); while(Babilonia()) { if (or && (or<770)) { dam=damage(); Arbitra(verso+90*inverti-45); if (damage()>dam+8) {how=65000; delta=21-delta; inverti^=1;} } else if ((r=scan(verso+delta-21,10)+scan(verso+delta,10))&&(r<770)) { Arbitra(a=verso+90*(inverti^=1)-45); how=65000; delta=21-delta; } else { if (scan(verso-delta,10)+scan(verso-delta+21,10)) { if (r); else if (scan(verso,10)); else duello(); branchprediction(); } else if (r) { if (scan(verso,10)); else duello(); how=65000; delta=21-delta; branchprediction(inverti^=1); } else duello(); } if (damage()>80) while (1) Babilonia(); } } GeoMetra(nx,ny) int nx, ny; { return (((nx-=loc_x())*nx+(ny-=loc_y())*ny)); } Arbitra(look) { count=2; while(count) { Babilonia(); if (or && (or<770)) count=2; else if ((r=scan(look,10)) && (r<770)) {a=look; count=2;} else --count; } } Babilonia() { fire(fire(fire(fire(fire(fire(drive(verso,100))))))); Consiglieri(); Goniometro(dx,dy); while (GeoMetra(dx,dy)>7200) fire(drive(ang,100)); Consiglieri(); return ang=verso; } branchprediction() { a=verso+90*inverti-45; fire(drive(ang+=60*inverti-30,100)); while(GeoMetra(dx,dy)800) fire(); else fire(); Consiglieri(how+=1000); fire(drive(ang,100)); while(GeoMetra(dx,dy)>5200) fire(); Consiglieri(); return ang=verso; } Consiglieri() { fire(fire(drive(ang+=180,0)));} fire() { if (or=scan(a,10)) { if (r=scan(a,1)) return cannon(a,2*scan(a,10)-r); else if (r=scan(a-5,4)) return cannon(a-=7,2*scan(a,10)-r); else if (r=scan(a+5,4)) return cannon(a+=7,2*scan(a,10)-r); } else if (r=scan(a-=20,10)) return cannon(a,r); else if (r=scan(a+=40,10)) return cannon(a,r); else return a+=40; } duello() { int three; oang=verso-53; count=(three=16); while(three && (count>11)) if (scan(oang+15*((--three)%8),7)) --count; if (count>=14) Esercito(); } Esercito() int an; { b=0; dir=45+180*(loc_y()>500)+90*((loc_x()>500)==(loc_y()<500)); ang=dir+180*(loc_x()>500); while (1) { if (loc_x()<500) fire(drive(dir=ang,100)); else fire(drive(dir=ang+180,100)); } } Goniometro(mx,my) int mx, my; { return (ang=(360+((mx-=loc_x())<0)*180+atan(((my-loc_y())*100000)/mx))); } retrive(an) int an; { return (scan(an+350,10))+(scan(an+10,10)); }