/* CROBOT: Archer.r AUTORE: Guido Masotti (04.07.1968) SCHEDA TECNICA Il Robot si puo' comportare in due diversi modi a seconda dell' ammontare dei danni subiti: fintanto che essi sono inferiori al 72%, il robot cerca di stare fermo il piu' possibile in un angolo del campo di gioco. Quando viene colpito si sposta lungo un lato del campo e se durante tale spostamento subisce ulteriori danni conti- nua a muoversi, eventualmente cambiando lato se tale dan- neggiamento e' troppo consistente (il lato su cui si e' spostato "scottava"...). Se i danni subiti superano il 72%, Archer comincia ad oscillare lungo il lato su cui si trova cercando di rende- re difficile la sua individuazione. Per colpire gli avversari Archer utilizza due routine (una quando e' fermo e una quando si muove lungo un lato) cercando di fare delle correzioni sull'angolo e sul range di tiro. Purtroppo non ho avuto tempo per fare delle routine piu' efficienti e quindi il programma non dovrebbe essere molto competitivo, ma l'importante era partecipare. Nel caso non fosse possibile far competere entrambi i miei robot, vorrei far giocare Archer.r */ int r1,dir; int ang,d,corner,newdam=0,range,lato,lat90,olddam,dang,ang1,rangef,angf; main() { /* Archer si dirige nell'angolo in basso a destra */ ang=170; drive(270,100); while (loc_y()>=60); while (speed()>49) drive(270,0); lat90=0; lato=0; corner=0; race(); d=damage(); ang=94; while (d<72) { if (scan(ang,5)) { if ((newdam=aim_at())!=d) /* Spara da fermo */ { olddam=d; race(); if (d>olddam+8) /* Se viene colpito si muove */ { test(); if ((d-newdam)>4) race(); } ang=4+90*corner+lat90; } } else { ang+=10; if ((newdam=damage())!=d) { olddam=d; race(); if (d>olddam+8) /* Se viene colpito si muove */ { test(); if ((d-newdam)>4) race(); } ang=4+90*corner+lat90; } } if (ang>90*(corner+1)+lat90+4) ang=4+90*corner+lat90; } while (1) /* Si muove in continuazione */ { race(); } } /* End of main */ /* * Routne di movimento su un lato. */ race() { dir=lat90+180*corner; if (corner==0) { ang=4+lat90; drive(dir,100); if (lato==0) { while (loc_x()<900) gunfire(); } else if (lato==1) { while (loc_y()<900) gunfire(); } else if (lato==2) { while (loc_x()>100) gunfire(); } else { while (loc_y()>100) gunfire(); } drive(0,0); while (speed()>49); corner=1; } else { ang=176+lat90; drive(dir,100); if (lato==0) { while (loc_x()>100) gunfire(); } else if (lato==1) { while (loc_y()>100) gunfire(); } else if (lato==2) { while (loc_x()<900) gunfire(); } else { while (loc_y()<900) gunfire(); } drive(180,0); while (speed()>49); corner=0; } d=damage(); } /* * Routine di sparo da fermo */ int aim_at() { if ( ((newdam=damage())==d) ) { if (getpos()) { ang1=ang; r1=range; } if ((newdam=damage())!=d) return newdam; } else return newdam; if (r1<700) { if (getpos()) { angf=ang+(ang-ang1)*18/10; cannon(angf,range+(range-r1)*18/10); ang=angf; } else ang+=8; newdam=damage(); } else ang+=8; return newdam; } /* * Routine di definizione della posizione dell'avversario */ getpos() { if ( scan(ang+3,2) ) if ( scan(ang+4,1) ) { if ( scan(ang+3,0) ) ang+=3; else ang+=4; } else if ( scan(ang+2,0) ) ang+=2; else ang+=1; else if ( scan(ang-4,2) ) if ( scan(ang-2,1) ) ang-=2; else ang-=3; else if ( scan(ang-1,0) ) ang-=1; else ang-=0; if (range=scan(ang,5)) return 1; else return 0; } /* * Routine di sparo in movimento */ gunfire() { if (scan(ang,5)) { if (getpos()) { ang1=ang; r1=range; if (getpos()) { dang=ang-ang1; rangef=range+(range-r1)*range/300; angf=ang+dang*range/180; cannon(angf,rangef); if (rangef<700) ang=angf; else ang+=8-corner*16; } } } else { ang+=10-corner*20; if (ang180+lat90) ang=4+lat90; } if (speed()<50) drive(dir,100); } /* * Routine di definizione del lato su cui muoversi */ test() { if (corner) { lato=(lato+1)%4; corner=0; } else { lato=(lato+3)%4; corner=1; } lat90=90*lato; } /* End of Archer.r */