/* Nome: Gru.r (macro) Autore: Franco Cartieri Torneo 2011 Descrizione robot: Gru è semplicemente il mio robot Gantu dell'anno scorso con qualche parametro modificato, più un tentativo di cambio angolo nel caso di danni. All'inizio dell'incontro Gru si posiziona nell'angolo più vicino e controlla se è un f2f in questo caso parte subito all'attacco. Altrimenti inizia a muoversi lungo i lati dell'arena prima orizzontalmente poi verticalmente senza mai allontanarsi troppo dall'angolo. Ogni 12 cicli controlla il numero di avversari, se ne è rimasto uno solo inizia l'attacco finale. Se viene colpito cerca un angolo libero in cui spostarsi. Anche se il numero di oscillazioni supera una certa soglia parte all'attacco anche se è rimasto più di un nemico nella speranza che siano già abbastanza danneggiati. L'attacco finale consiste in una serie di oscillazioni veloci volte a mantenere il nemico ad una distanza abbastanza costante. */ int b,x,y,dir,rngscan,rng,orng,deg,odeg,asin,acos; int xs,ys,en,timer,xd,yd,xp,yp,dmax,dmin,zd,t,dam; fuoco() { if (scan(deg,10)); else { if (scan(deg+=20,10)); else { if (scan(deg-=40,10)); else { if (scan(deg+=60,10)); else { if (scan(deg-=80,10)); else { if (scan(deg+=100,10)) return; else if (scan(deg-=120,10)) return; return deg+=180; } } } } } if (scan(deg,10) > 50) { asin=(sin(deg-dir)/14384); acos=(cos(deg-dir)/3796)-230; deg-=18*(scan(deg-18,10)>0); deg+=18*(scan(deg+18,10)>0); if(scan(deg-16,10)) deg-=8; else if(scan(deg+16,10)) deg+=8; if(scan(deg-12,10)) deg-=4; else if(scan(deg+12,10)) deg+=4; if(scan(deg-11,10)) deg-=2; if(scan(deg+11,10)) deg+=2; if (orng=scan(odeg=deg,3)) { if(scan(deg-13,10)) deg-=5; else if(scan(deg+13,10)) deg+=5; if(scan(deg+12,10)) deg+=4; else if(scan(deg-12,10)) deg-=4; if(scan(deg-11,10)) deg-=2; if(scan(deg+11,10)) deg+=2; cannon(deg+(deg-odeg)*((880+(rng=scan(deg,10)))/482)-asin, rng*230/(orng-rng-acos)); } } } spara() { if ((orng=scan(deg, 10)) ) { if (scan(deg-9,5)) { if (scan(deg-=13,5)) { if(scan(deg-3,5)) deg-=5; else ++deg; } else { if (scan(deg-5,5)) deg-=5; else ++deg; } } else { if(scan(deg+9,5)) { if (scan(deg+=13,5)) deg+=5; else --deg; } else { if(scan(deg+5,5)) deg+=5; else --deg; } } } else { if ((orng=scan(deg-=20,10))) { if (scan(deg-9,10)) { if (scan(deg-=13,5)) deg-=5; else ++deg; } else { if(scan(deg+9,10)) deg+=5; else --deg; } } else { if ((orng=scan(deg+=40,10))) { if (scan(deg+9,10)) deg+=12; } else { if ((orng=scan(deg+=20,10))); else { if (orng=scan(deg-=80,10)) return cannon(deg,orng); else if (orng=scan(deg-=20,10)) return cannon(deg,orng); else if (orng=scan(deg+=120,10)) return cannon(deg,orng); else if (orng=scan(deg+=20,10)) return cannon(deg,orng); else if (orng=scan(deg-=160,10)) return cannon(deg,orng); else return deg+=260; } } } } if (rng=scan(deg,10)) { cannon (deg, rng*135/(135+orng-rng) ); if(rng>1000) return deg+=40; } else if(scan(deg-20,10)) deg-=20; else if(scan(deg+=20,10)); else deg+=40; } f2f() { while(1) { if ((x=loc_x(y=loc_y()))>850) dir=155+50*(y>500); else if (x<150) dir=335+50*(y<500); else if (y>850) dir=245+50*(x<500); else if (y<150) dir=65+50*(x>500); else { if (orng<600) dir=deg+80+(b^=1)*190; else dir=deg+50+(b^=1)*230; } spara(drive(dir,100)); if(scan(deg-10,10)) deg-=5; if(scan(deg+10,10)) deg+=5; if(orng>500) { spara(drive(dir,100)); fuoco(drive(dir,100)); } else spara(drive(dir,100)); } } main() { xp=60+(xs=loc_x(yp=60+(ys=(loc_y(en=0))>499)*880)>499)*880; drive(dir=((xd=180*xs)+180),100); while(check(xp,3-xs)) drive(dir,100); fire(drive(dir,0)); while(speed()>59); drive((dir=(yd=90+180*ys)+180),100); while(check(yp,7-ys)) drive(dir,100); fire(drive(dir,0)); while(speed()>59); dam=damage()+30; dmax=(dmin=zd=(yd-105+90*(xs^ys)))+100; while (dmin<=dmax) en+=(scan(dmin+=20,10)>0); dmin=zd; while(en>1) { if(damage() > dam) { if(damage() < 80) { if(!scan(xd,10)) { xp=60+((xs=!xs)*880); drive(dir=((xd=180*xs)+180),100); while(check(xp,3-xs)) drive(dir,100); fire(drive(dir,0)); while(speed()>59); } else { if(!scan(yd,10)) { yp=60+((ys=!ys)*880); drive((dir=(yd=90+180*ys)+180),100); while(check(yp,7-ys)) drive(dir,100); fire(drive(dir,0)); while(speed()>59); } else { yp=60+((ys=!ys)*880); xp=60+((xs=!xs)*880); drive(dir=((xd=180*xs)+180),100); while(check(xp,3-xs)) drive(dir,100); fire(drive(dir,0)); while(speed()>59); drive((dir=(yd=90+180*ys)+180),100); while(check(yp,7-ys)) drive(dir,100); fire(drive(dir,0)); while(speed()>59); } } dam=damage()+30; } else f2f(); } run(xd,xp,2-xs); run(yd,yp,6-ys); } f2f(); } fire() { if (rng=scan(odeg=deg,10)) { if (scan(deg+350,10)) deg-=1; else deg+=1; if (scan(deg+10,10)) deg+=1; else deg-=1; cannon(deg,(scan(deg,10)<<1)-rng); } else { if (rng=scan(deg+=340,10)) return cannon(deg,rng); if (rng=scan(deg+=40,10)) return cannon(deg,rng); while (!(rng=scan(deg+=20,10))) ; cannon(deg,rng); } } run(d,l,m) { if ((timer%12==2) && (rng > 400)) { en=0; while (dmin<=dmax) en+=(scan(dmin+=20,10)>0); dmin=zd; } spara(drive(d,100)); if (++timer>500+damage()) f2f(); if (scan(d,10)) { deg=d; while (scan(d,10)>840) ; } else while(check(l,m)) drive(d,100); fire(drive(d,0)); while(speed()>59) ; ++m; drive(d+=180,100); if (++timer>500+damage()) f2f(); while(check(l,m)) drive(d,100); fire(drive(d,0)); while(speed()>59) ; } check(l,m) { int c1; if (m<5) c1=loc_x(); else c1=loc_y(); if (m%2) return (c1>l); else return (c1