/* HAL9000 ver.4.0 del 08/03/97 Autore: Maurizio Camangi Strategia: Si sposta poi nell'angolo a sud-ovest del campo di battaglia. Il percorso che puo' compiere e' di forma triangolare (i cateti sono a ovest e a sud). Sceglie l'angolo successivo dove spostarsi se non e' occupato da un altro robot. La funzione di fuoco in movimento e' piuttosto complessa e si basa sulla correzione dell'angolo e della gittata in base allo spostamento proprio e dell'avversario, ispirata dal crobot TOX. Dopo un numero prefissato di cicli HAL9000 attacca un crobot utilizzando una routine tratta dal crobots LEADER. */ int ang, /* Angolo di scanning */ dir, /* Direzione del cammino */ count, /* Contatore */ curx,cury, /* Variabili temporanee salvaposizione */ maxcount, /* Massimo numero di oscillazioni */ maxdamage; /* Massimo danni consetiti per attaccare */ main() { ang=0; count=0; maxcount=50; maxdamage=80; drive(dir=270,100); while (loc_y() > 200) fire(); stop(); drive(dir=180,100); while(loc_x() > 200) { fire(); } stop(); while(1) { drive(dir=(90*(!scan(90,10))),100); while ((loc_y() < 800) && (loc_x() < 800)) fire(); stop(); while (((curx > 500) && (cury < 500)) || ((cury > 500) && (curx < 500))) { if ((curx > 500) && (cury < 500)) /* (1000,0) */ { drive(dir=135 + (45*(!scan(180,10))),100); while((loc_x() > 200) && (loc_y() < 800)) fire(); } else { drive(dir=315 - (45*(!scan(270,10))),100); /* (0,1000) */ while((loc_y() > 200) && (loc_x() < 800)) fire(); } stop(); } } } /* Le routines d'attacco, le piu' importanti */ int oang,range,orange,aa,rr,diff; scan_() { if(scan(ang-5,1)) ang-=5; if(scan(ang+5,1)) ang+=5; if(scan(ang-3,1)) ang-=3; if(scan(ang+3,1)) ang+=3; if(scan(ang-1,1)) ang-=1; if(scan(ang+1,1)) ang+=1; } fire() /* fire() - routine di sparo in movimento */ { if(range=scan(ang,5)) { cannon(ang,range); scan_(); if (range=scan(ang,5)) { orange=range; oang=ang; scan_(); if (range=scan(ang,10)) { aa=(ang+(ang-oang)*((1200+range)>>9)-(sin(ang-dir)>>14)); rr=(range*160/(160+orange-range-(cos(ang-dir)>>12))); while(!cannon(aa,rr)); if (range>700) ang+=30; } else if(scan(ang-=10,10)); else if(scan(ang+=20,10)); else ang+=40; } else if(scan(ang-=10,10)); else if(scan(ang+=20,10)); else ang+=40; } else if(scan(ang-=10,10)); else if(scan(ang+=20,10)); else ang+=40; } attack() { if (speed()) drive(dir,0); while (speed()) ; drive(180*(loc_x()>500),100); ang=336; diff=50; while(1) { ang+=328; while(!(range=scan(ang+=16,8))); cannon(ang,range); if(range>200) drive(dir=ang,100); while (range) /* && range<700 */ { if (range>200) { oang=ang; orange=range; ang+=4-(scan(ang-4,4) != 0)*8; ang+=2-(scan(ang-2,2) != 0)*4; ang+=1-(scan(ang-1,1) != 0)*2; if (range=scan(ang,10)) cannon(ang+(ang-oang)*range/200,range+(range-orange+diff)*range/275); if (speed()<51 || ((ang-dir)*(ang-dir)>400)) { drive(dir=ang,100); diff=25; } else diff=50; } else { ang+=20; while(range<300) { ang+=320; while(!(range=scan(ang+=20,10))); cannon(ang,range); if(speed()<50 || range>200) drive(dir=ang,100); } } } } } /* Utilities per raccogliere il codice */ stop() /* Fermati! */ { if ((++count >= maxcount) && (damage() < maxdamage)) attack(); drive(dir,0); while(speed() > 49) ; curx = loc_x(); cury = loc_y(); }