/****************** * * * A R M I N .r * * * ****************** rompo una tradizione, usando un nome "umano" al mio robot. Ma un campione come lui, che vinceva il titolo mondiale mentre ci lavoravo, meritava la dedica. Michelangelo Messina Robot senza nessuna pretesa, se non di tentare di rimanere in vetta al KingOfTheHill come erede di Suddenly.r */ int deg,odeg, /*angolo di sparo*/ dam, /*percentuale di danni attuale*/ t, /*conta cicli di attesa per l'attacco*/ rng, /*distanza*/ dir,dir0; /*direzione*/ int orng,x,y; int i,b; int sc,sk; int dx,up; int ne; int fp; main() { /* All'inizio dell'incontro il robot si reca nell'angolo piu' vicino e controlla se si tratta di un f2f. Fino a quando non e' colpito, oscilla lungo i due lati principali dell'angolo in modo rettilineo, avvicinandosi il piu' possibile ai bordi e senza fermarsi mai. Se e' colpito cerca un eventuale lato 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. In particolare cambia per robot molto vicini, diventando lineare nel tentativo di girare intorno all'avversario formando un quadrato. ne=-1 : 1 nemico ne=0 : 2 nemici ne=1 : 3 nemici That's all folks */ attacco(dove(vai(dx=(loc_x(up=(loc_y(fp=3)>500))>500)))); while (dam=damage()+10) { while ( (damage() < dam) ) { /*fino quando non e' colpito o limite di tempo*/ if (dx) xmin(xyf(dir0=deg=dir=180)); else xmag(xyf(dir0=deg=dir=360)); if(orng>740) {if (ne&&t<1200); else attacco();} if (up) ymin(xyf(dir0=deg=dir=270)); else ymag(xyf(dir0=deg=dir=90)); attacco(); } if(ne);else { if(up) { if(occupato(260)) fuggi(); else step(1); } else { if(occupato(80)) fuggi(); else step(1); } } } } fuggi() { if(dx) { if(occupato(170)) seek(101); else step(0); } else { if(occupato(350)) seek(101); else step(0); } } dove() { if(up) { if(dx) sc=165; else sc=255; } else { if(dx) sc=75; else sc=345; } } step(w) { if(w) { /*verticale*/ if(up) while(loc_y()>600) spara(drive(dir=270,100)); else while(loc_y()<400) spara(drive(dir=90,100)); dir0=sc=300-180*(dx); } else { /*orizzontale */ if(dx) { while(loc_x()>600) spara(drive(dir=180,100)); } else { while(loc_x()<400) spara(drive(dir=360,100)); } dir0=sc=30+180*(up); } spara(drive(dir,0)); while(1) { spara(drive(dir+=180,100)); spara(drive(dir,100)); attacco(drive(dir,0)); } } int occupato(i) /* restituisce 1 se ci sono nemici nella direzione i */ int i; { return(((scan(i,10))||(scan(i+20,10)))); } /* spostamento */ xmag() { while(loc_x()>86) spara(drive(dir,100)); while(loc_x()>50) drive(dir,100);stop(); } xmin() { while(loc_x()<914) spara(drive(dir,100));while(loc_x()<950) drive(dir,100);stop(); } ymag() { while(loc_y()>86) spara(drive(dir,100)); while(loc_y()>50) drive(dir,100);stop(); } ymin() { while(loc_y()<914) spara(drive(dir,100)); while(loc_y()<950) drive(dir,100);stop(); } xyf() { sk=1;spara(drive(dir,100)); if(t>1200&&dam<69) fuoco(drive(dir,100));spara(drive(dir,100));stop(sk=0);dir+=180;} vai() { if(dx) xmin(dir=360); else xmag(dir=180); if(up) ymin(dir=90); else ymag(dir=270); } stop() { spara(drive(dir,0)); } attacco() { /* conta il nr dei nemici */ if((ne=4-( (!scan(sc+100,10))+ (!scan(sc+80,10))+ (!scan(sc+60,10))+ (!scan(sc+40,10))+ (!scan(sc+20,10))+ (!scan(sc,10))))<0) boom(fp=t=sk=5); else if (t<1580) t+=2; else { if(ne<1) {if (damage(t=1)<60) return seek(75);} else {if(dam<50) return seek(60); else t*=(dam<69);} } } fuoco() { t+=2; 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; else if (scan(deg+=140,10)) return; else if (scan(deg-=160,10)) return; return deg+=180; } if (scan(deg-18,10)) deg-=7; if (scan(deg+18,10)) deg+=7; if (scan(deg+13,10)) deg+=5; if (scan(deg-13,10)) deg-=5; if (scan(deg+12,10)) deg+=3; if (scan(deg-12,10)) deg-=3; if (scan(deg+10,10)) deg+=1; if (scan(deg-10,10)) deg-=1; if (orng=scan(odeg=deg,10)) { if (scan(deg+13,10)) deg+=5; if (scan(deg-13,10)) deg-=5; if (scan(deg+12,10)) deg+=3; if (scan(deg-12,10)) deg-=3; if (scan(deg+10,10)) deg+=1; if (scan(deg-10,10)) deg-=1; if (rng=scan(deg,10)) return cannon(deg+(deg-odeg)*((1200+rng)>>9)-(sin(deg-dir)>>14), rng*192/(192+orng-rng-(cos(deg-dir)>>12))); } } spara() { ++t; if ((orng=scan(deg, 10)) ) { if (scan(deg-15,10)) { 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-=fp; } 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+=12; } else if ((orng=scan(deg+=20,10))); else if(sk) { 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; } else if ((orng=scan(dir0,10))) { if (orng>850) { return deg+=40; } else deg=dir0; } else { if ((orng=scan(deg+=20,10))) return cannon(deg,orng); return deg+=40; } if (rng=scan(deg,10)){ cannon (deg, rng*145/(145+orng-rng) ); if(sk); else {if(rng>740) if(rng>orng || rng>800) { return deg+=40; } } } else if(scan(deg-20,10)) deg-=21; else if(scan(deg+=20,10)); else deg+=40; } seek(att) { if(scan(sc+105,10)) deg=sc+105; else deg=sc+15; fp=5; drive(sk=dir=deg,100); while(damage(spara(drive(dir,100)))914) dir=155+50*(y>500); else if (x<86) dir=335+50*(y<500); else if (y>914) dir=245+50*(x<500); else if (y<86) dir=65+50*(x>500); else if(orng<180) dir=deg+95+(b^=1)*155; else if(orng<400) dir=deg+50+(b^=1)*220; else dir=deg+20+(b^=1)*275; } if(orng); else { if(ne) --ne; else boom(t=1); } } fp=3; return vai(sk=0); } boom() { while(1) { if(t%2) { if(orng>650) dir=deg+25+(b^=1)*235; else if(orng>210) dir=deg+80+(b^=1)*190; else dir=(deg/90)*90; if ((x=loc_x(y=loc_y()))>860) dir=155+50*(y>500); else if (x<140) dir=335+50*(y<500); else if (y>860) dir=245+50*(x<500); else if (y<140) dir=65+50*(x>500); spara(drive(dir,100)); } else { if(orng>370) { spara(drive(dir,100)); fuoco(drive(dir,100)); } else spara(drive(dir,100)); } } }