/*---------------------------------------------------------------------------- Nome : Paranoid.r (29-09-98) Autori : Marco Pranzo Luca Pranzo ------------------------------------------------------------------------------ Paranoid Š un robot paranoico. Infatti Š fermamente convinto di essere odiato da tutti gli altri robot nella arena, Paranoid si sente solo ed impaurito. All'inizio della partita si porta al centro della arena e da qui si guarda rapidamente intorno alla ricerca dell'angolo pi— accogliente. Dopo averlo raggiunto cerca di controllare tutti gli altri robot. Se sono tutti lontani lui si rilassa rimanendo fermo e senza provocare nessuno. Se il pi— vicino si fa minaccioso, allora comincia un movimento oscillatorio sparando all'avversario. Se invece un nemico si fa troppo sotto, venendo ad occupare il suo angolo, lui si difender… rabbiosamente fino alla morte dell'avversario ( spero :-) ). Quando rimane contro un solo nemico allora cercher… di evitare la parit… solo se non eccessivamente ferito. ----------------------------------------------------------------------------*/ int dir,corner, conta1,conta2, count,dmin,daux,numero,a, dist,ang,aux,flag; main() { /* Paranoid spaurito si reca al centro della arena... */ guarda(500,500); go(500,500,20000,100); /* ... e qui cerca un angolo vuoto da occupare... */ if (guarda(999,999)) { guarda(800,800); go(800,800,5000,100); guarda(999,999); go(999,999,2000,50); corner=180; } else if (guarda(999,1)) { guarda(800,200); go(800,200,5000,100); guarda(999,1); go(999,1,2000,50); corner=90; } else if (guarda(1,999)) { guarda(200,800); go(200,800,5000,100); guarda(1,999); go(1,999,2000,50); corner=270; } else if (guarda(1,1)) { guarda(200,200); go(200,200,5000,100); guarda(1,1); go(1,1,2000,50); corner=0; } dir=corner+180; /* ... dopo averlo raggiunto... */ while(1) { /* ... osserva l'arena guardingo... */ dmin=1000; count=10; numero=0; a=corner; while (count) { count-=1; numero+=!(!(daux=scan(a,5))); if ( (daux < dmin) && (daux > 0) ) { dmin=daux; ang=a; } a+=11; } /* ... se Š rimasto un unico avversario... */ if (numero==1) { /* ... e lui non Š troppo ferito... */ if (damage() < 90) { /* ... dopo aver ben ricontrollato... */ count=10; numero=-1; a=corner; while (count) { count-=1; numero+=!(!scan(a,5)); a+=11; } conta1=!numero; count=10; numero=-1; a=corner; while (count) { count-=1; numero+=!(!scan(a,5)); a+=11; } conta2=!numero; /* ... lo attacca ... */ if ( conta1 && conta2 ) { guarda(500,500); go(500,500,20000,100); while(1) { drive(0,100); while (loc_x() < 900) if (scan(ang,10)) cannon(ang+=7*(!(scan(ang+356,7)))+353*(!(scan(ang+4,7))),scan(ang,10)); else ang+=21; stop(0); drive(180,100); while (loc_x() > 100) if (scan(ang,10)) cannon(ang+=7*(!(scan(ang+356,7)))+353*(!(scan(ang+4,7))),scan(ang,10)); else ang+=21; stop(180); } } } /* ... se invece Š troppo danneggiato rimane tranquillo nel suo angolo... */ else pendolo(10000); } /* ... se un nemico Š troppo vicino... */ else if (dmin < 200) /* ... lo attacca furiosamente... */ furia(); /* ... mentre se l'avversario pi— vicino Š a distanza di tiro... */ else if (dmin < 800) { /* ... si tiene sulla difensiva... */ dir=corner+180; pendolo(11); } } /* ... altrimenti continua a guardarsi intorno. */ } /* Routine decisionale iniziale */ guarda(xx,yy) { return(!scan (dir=180+180*(xx>loc_x())+atan(100000*(loc_y()-yy)/(loc_x()-xx)) ,10)); } go(ax, ay, ad, vel) { drive(dir,vel); while( ((ax-loc_x())*(ax-loc_x())+(ay-loc_y())*(ay-loc_y())) > ad ) { spara(); } stop(dir); } /* Routine di movimento difensivo */ pendolo(t) { while (t-=1) { drive(dir+=180,100); spara();spara(); spara();spara(); drive(dir,0); spara();spara(); if (!speed()) { drive(dir+180,100); spara(); } } } /* Routine di attacco in frenata */ stop(dir) { drive(dir,0); while (speed() > 49) if ((dist=scan(ang,10))) cannon(ang,dist); else ang+=21; } /* Routine di fuoco */ spara() { if ( (dist=scan(ang,10)) && (dist < 770) ) cannon(ang+=7*(!(scan(ang+356,7)))+353*(!(scan(ang+4,7))),scan(ang,10)); else { 0;0;0;0; aux=ang; ang+=21*(!(!scan(ang+21,10))); ang+=42*(aux==ang); } } /* Routine di attacco da fermo */ furia() { while(1) { flag=0; if ( (dist=scan(corner,10))&&(dist<300) ) {cannon(corner,dist);flag=1;} if ( (dist=scan(corner+21,10))&&(dist<300) ) {cannon(corner+21,dist);flag=1;} if ( (dist=scan(corner+42,10))&&(dist<300) ) {cannon(corner+42,dist);flag=1;} if ( (dist=scan(corner+63,10))&&(dist<300) ) {cannon(corner+63,dist);flag=1;} if ( (dist=scan(corner+84,10))&&(dist<300) ) {cannon(corner+84,dist);flag=1;} if (flag) return(0); } }