/****************************************************************************/ /* */ /* Torneo di CRobots Y2K (Io Programmo) (1999) */ /* */ /* CROBOT: STEALTH.R */ /* */ /* AUTORE: Daniele Nuzzo */ /* */ /****************************************************************************/ /* SCHEDA DESCRITTIVA: Inizialmente Stealth si reca nell'angolo piu' vicino e controlla se sta combattendo un incontro f2f, in tal caso attacca subito. Negli angoli viene usata la seguente strategia: 1) Se gli avversari sono fuori dalla portata di fuoco e se non si subiscono danni, si rimane fermi nell'angolo; 2) Se non c'e' nessuno nell'angolo adiacente in verticale, allora si raggiunge tale angolo; 3) Se non c'e' nessuno nell'angolo adiacente in orizzontale, allora si raggiunge tale angolo; 4) Si oscilla verticalmente fino a circa 280 dall'angolo; se entrambi gli angoli sulla verticale sono occupati, allora ci si sposta in orizzontale sul lato opposto; ci si reca nell'angolo libero sulla verticale preferendo quello piu' lontano. Dopo circa 170000 cicli si controllano gli avversari rimasti ogni 10000 cicli se ci sono 3 avversari oppure ogni 2000 cicli se sono rimasti 2 avversari, attaccando se e' rimasto un solo avversario ed i danni sono inferiori all'80%; se i danni sono minori del 50% si fa' un'oscillazione in verticale ed un in orizzontale per smuovere le situazioni di stallo. La routine di fuoco e' la stessa utilizzata dal CRobot Coppi.r del Torneo del 1998, con una piccola modifica per quanto riguarda il puntamento. La routine di attacco e' molto semplice: ci si sposta a destra e a sinistra a meta' altezza dell'arena finche' non si subisce in un passaggio un danno superiore al 20%, quindi le oscillazioni diventano piu' corte fino alla fine. */ int rng,orng,deg,odeg,dir,dam,avv,timer,aa,rr; main() { if (loc_x()<500) sx(100); else dx(900); if (loc_y()<500) dw(100); else up(900); Radar(); timer=170000; while(1) Angolo(); } up(d) { dir=90; while (loc_y()d) { drive(270,100); Fire(); } drive(90,0); } dx(d) { dir=0; while (loc_x()d) { drive(180,100); Fire(); } drive(0,0); } Angolo() { dam=damage(); while ((!orng || orng>740) && (damage()>9)-(sin(deg-dir)>>14)); rr=(rng*160/(160+orng-rng-(cos(deg-dir)>>12))); } else { aa=(deg+(deg-odeg)*((1200+rng)>>9)); rr=(rng*165/(165+orng-rng)); } while(!cannon(aa,rr)); } else scan_low(); } else scan_low(); }