/********************** * * * We Gotta Do It.r * * * ********************** Midi Robot per il torneo 2004 Michelangelo Messina */ int rng, deg; /* Distanza e Gradi */ int orng; /* Distanza precedente */ int dir; /* La mia direzione */ int ne; /* Numero avversari */ int danni; int i,b; int x,y; int t; int att; int sc; int up; int dx; int fp; /* Questo midi robot deriva dal macro 4ever.r del torneo 2k1 e dai midi todos.r del 2k2 e spaceman.r del 2k3. Le differenze sono poche, soprattutto nella routine di sparo leggermente migliorata (nel f2f), anche perch‚ fare peggio era difficile. All'inizio dell'incontro il robot si reca nell'angolo piu' vicino e controlla se si tratta di un f2f. Durante il match oscilla nell'angolo con una routine leggermente modificata rispetto a quella di dav46.r. Se e' colpito cerca un eventuale angolo libero dove spostarsi. Se i due angoli adiacenti sono occupati, e ci sono solo 2 avversari (worst case), essendo in pieno controllo dei nemici, decide di attaccare come un folle (tanto in quella situazione non sarebbe sopravvissuto a lungo). L'attacco e' quello classico di boom.r con piccoli ritocchi e senza toxica. That's all folks */ main() { attacco(vai (x=80+840*(loc_x()>500),y=80+840*(loc_y(fp=2)>500))); while (danni=damage()+10) { while (damage()=y) spara(drive (dir,100)); else while (loc_y()<=y) spara(drive (dir,100)); spara(drive (dir-=180,100)); if(up) while (loc_y()y) spara(drive (dir,100)); ferma(); if (orng); else attacco(ne=0); } if(ne==2) { /*si muove */ if(up) freey(260,80); else freey(80,920); } } } freey(j,k) { if(occupato(j)) { if (dx) freex(170,80); else freex(350,920); } else vai(y=k); } freex(j,k) { if(occupato(j)) seek(att=101); else vai(x=k); } ferma() { spara(drive(dir,0)); } attacco() { i=sc+140; while (i>sc) { if (scan (i-=20, 10)) ++ne; } if (ne<2) seek(att=101); else if(t>1400) { if(ne<3) {if(damage()<60) seek(att=80);} else if(damage()<40) seek(att=60); else if(damage()>59) t=0; } else t+=2; } vai () { spara(drive (dir=deg(x,y),100)); while (dist(x,y)>12000) spara(drive (dir,100)); while (dist(x,y)>1600) drive (dir,100); ferma(dx=(x>500)); if (up=(y>500)) { if(dx){sc=165;return dir=45;} else {sc=255;return dir=135;} } else { if(dx) {sc=75;return dir=315;} else {sc=345;return dir=225;} } } /* Angolo per andare in una certa direzione */ deg(xx,yy) { return (180+((xx-=(loc_x()))>0)*180+atan(((yy-loc_y())*100000)/(xx+(xx==0)))); } /* Calcola la distanza rispetto ad un punto dato */ dist(xx,yy) { return (((xx-=loc_x())*xx+(yy-=loc_y())*yy)); } /* rende vero se il dato angolo e' occupato */ occupato (gradi) { return ((scan(gradi,10) ||scan(gradi+20,10))); } spara() /* routine di sparo*/ { ++t; if ((orng=scan(deg, 10)) ) { if (scan(deg-9,4)) { if (scan(deg-=13,4)) { if(scan(deg-3,fp)) deg-=fp; else ++deg; } else if (scan(deg-fp,fp)) deg-=fp; } else if(scan(deg+9,fp)) { if (scan(deg+=13,fp)) deg+=fp; else --deg; } else if(scan(deg+4,fp)) deg+=fp; else --deg; } else if ((orng=scan(deg-=20,10))) { if (scan(deg-9,10)) { if (scan(deg-=13,fp)) deg-=fp; else ++deg; } else if(scan(deg+9,10)) deg+=6; } else if ((orng=scan(deg+=40,10))) { if (scan(deg+9,10)) deg+=9; } else if (!(orng=scan(deg+=20,10))) { if ((orng=scan(deg+=21,10))) { if (orng>900) { if(!att) deg+=41; return orng=0; } } else { if (!(scan(deg+=21,10))) deg+=40; return; } } if (rng=scan(deg,10)){ cannon (deg, rng*165/(165+orng-rng) ); if(rng>720) if(!att) if(rng>orng || rng>900) { deg+=41; return orng=0; } } } seek() { if(scan(sc+105,10)) dir=deg=sc+105; else dir=deg=sc+15; fp=5; while(damage(spara(drive(dir,100)))890 ) dir=180; else if (i<110 ) dir=360; else if ((i=loc_y())>890 ) dir=270; else if (i<110) dir=90; else { if(orng>280) dir=deg+70+(b^=1)*210;/*65*/ else dir=deg+100+(b^=1)*155;/*65*/ } } } fp=2; vai(att=0); }