/* ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ±±±±Û±±±Û±±±ÛÛÛÛÛ±±±±±±±±±±Û±±±Û±±±ÛÛÛ±±±±ÛÛÛÛ±±° ±±±±ÛÛ±ÛÛ±±±Û±±±±±±±±±±±±±ÛÛ±±ÛÛ±±Û±±±Û±±Û±±±±±±° ±±±±Û±Û±Û±±±ÛÛÛÛÛ±±±ÛÛÛÛ±±±Û±±±Û±±Û±Û±Û±±Û±±±±±±° ±±±±Û±±±Û±±±Û±±±±±±±±±±±±±±Û±±±Û±±Û±±±Û±±Û±±±±±±° ±±±±Û±±±Û±±±ÛÛÛÛÛ±±±±±±±±±±Û±±±Û±±±ÛÛÛ±±±±ÛÛÛÛ±±° ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±° ±±±±±±±±±±±±±±±±±± DISTRUTTORE ±±±±±±±±±±±±±±±±±° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°° ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ÚÄÄÄÄÄÄÄÄ´ REALIZZATO DA ÃÄÄÄÄÄÄÄÄ¿ º R O B O T º± ³ Tarenzi Savino (02/12/1973) ³ º SERIE : MESSERSCHMITT º± ³ ³ º VERSIONE : C º± ³ ³ º DEL : 24.09.97 º± ³ ³ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ± ³ ³ ±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ... S T R A T E G I A ... ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ³ ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ³ ³ º M O V I M E N T O º ³ ³ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ³ ³ Si posizione nell'angolo pi— vicino dove resta fermo ³ ³ finchŠ non subisce pi— di 15% di danni oppure non passa ³ ³ molto tempo, quindi si muove verso un'altro angolo ³ ³ effettuando le seguenti operazioni: ³ ³ a) Quando abbandona un angolo perchŠ ha subito parecchi ³ ³ danni controlla che nell'angolo successivo (in senso ³ ³ orario) non ci sia nessuno altrimenti si rifugia ³ ³ nell' angolo successivo in senso antiorario senza ³ ³ ulteriori controlli. ³ ³ Quando si trova in un angolo utilizza un movimento a ³ ³ pendolo inclinato di 45ø; Per raggiungere l'angolo ³ ³ successivo si muove con una traiettoria retta. ³ ³ ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ ³ ³ ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ³ ³ º B A L I S T I C A º ³ ³ ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ³ ³ Utilizza la seguente tecnica di fuoco: ³ ³ effettua una prima scansione con risoluzione di +/-1ø ³ ³ e spara con le seguenti correzioni di tiro: ³ ³ -Angolo di tiro = Angolo+(Angolo-Old_Angolo) ³ ³ -Distanza = Range+(Range-Old_Range)*Range/600 ³ ³ Se perde l'obbiettivo lo cerca tra +40ø/-40ø. ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ *****************************************************************************/ long x,orange,ox,dir,range,posdx,possx,pos,tempo,alfa,px,py,angolo,d,tx,ty, dopo,n_rob,out_p,MAXTIME,MAXRANGE,MINTIME,MAXDAMAGE,RANGEBASE; main(){ /********************* VARIABILI DI SISTEMA ************************/ tempo=0; /* Tempo trascorso in un angolo */ possx=120; /* Posizione per angolo Sud-Ovest e Nord-Est */ posdx=880; /* Posizione per angolo Nord-Ovest e Sud-Est */ pos=120; /* Posizione corrente */ alfa=45; /* Angolo sfasamento per movimento a pendolo */ d=damage(); /* Contatore dei danni */ n_rob=4; /* Numero di Robots */ /******************* PARAMETRI DI CONFIGURAZIONE *******************/ MAXTIME=500; /* Tempo massimo dopo il quale cambia angolo */ RANGEBASE=850; /* Range base */ MAXDAMAGE=15; /* Livello massimo di danni per cambio angolo */ /*******************************************************************/ /* ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º INIZIO ROBOT º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ */ if (loc_x()>500){ if (loc_y()>500) angolo=3; else angolo=4;} else{if (loc_y()>500) angolo=2; else angolo=1;} if (angolo==1 || angolo==4) pos=possx; else pos=posdx; vai(angolo); /* Si posiziona nell'angolo iniziale */ while(1) { _controlla(); /* Controlla situazione danni/tempo */ pendolo(); /* Movimento a pendolo */ /*-------------------------- Ricerca un robot --------------------- Effettua delle scansioni finchŠ non individua un Robot che sia entro la distanza definita da MAXRANGE. -----------------------------------------------------------------*/ while(!(range=scan(x+=20,10)) && range0 && range720 && n_rob>1); } } } /* ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º FINE ROBOT º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ */ /****************************************************************************/ /* FUNZIONI DI UTILITA' GENERALE */ /****************************************************************************/ /*------------------ Muovi verso una direzione -----------------------*/ vai(angolo) { if (angolo==1) {tx=120;ty=120;} else if (angolo==2) {tx=120;ty=880;} else if (angolo==3) {tx=880;ty=880;} else if (angolo==4) {tx=880;ty=120;} while (speed()>49) {drive (0,0); spara();} px=loc_x()-tx; py=(loc_y()-ty)*100000; if (tx>loc_x()) dir=360+atan(py/px); else dir=180+atan(py/px); x=dir; while((px=tx-loc_x())*px+(py=ty-loc_y())*py>8100) {drive(dir,100);spara();} drive(dir,0); /* definisco la distanza massima in base al numero di robot */ if (n_rob>1){ if (_radar()<2) MAXRANGE=RANGEBASE+200; else MAXRANGE=RANGEBASE;} else MAXRANGE=RANGEBASE+200; } /*----- sparo rapido usato durante lo spostamento tra angoli ---------*/ spara(){ if (_scanner()){ cannon(x,range);} vicino(); } _controlla() { /** Se passa molto tempo o se sono colpito per pi— di 15% cambio angolo **/ if (((++tempo>MAXTIME) || (d+MAXDAMAGEMAXTIME/2) MAXRANGE=RANGEBASE+200; } /*---- Controlla che nell'angolo successivo non ci sia nessuno ------*/ angolo_ok() { dopo=(180-(angolo*90))%360; if (scan(dopo-10,10)>200 || scan(dopo+10,10)>200) {angolo--;if (angolo==0) angolo=4;} else {angolo++;if (angolo==5) angolo=1;} } /*------- Controlla se Š rimasto un solo robot -----------*/ _radar() { int ang_scan; n_rob=0;ang_scan=-19; while (((ang_scan+=20)<360)&&(n_rob<2)) n_rob+=(scan(ang_scan,10)!=0); if (n_rob==0) n_rob++; return(n_rob); } /* Controlla vicino se perde una scansione e spara */ vicino() /*- Rispetto ad x -*/ { /* Ang. Risoluzione */ if (range=scan(x-=40,10)) cannon(x,range); /* -40 -50 -30 */ else if (range=scan(x+=80,10)) cannon(x,range); /* +40 50 30 */ else if (range=scan(x-=65,10)) cannon(x,range); /* -25 -35 -15 */ else if (range=scan(x+=50,10)) cannon(x,range); /* +25 35 15 */ else if (range=scan(x-=35,10)) cannon(x,range); /* -15 -25 - 5 */ else if (range=scan(x+=30,10)) cannon(x,range); /* +15 25 5 */ else if (range=scan(x-=15,10)) cannon(x,range); /* 0 -10 10 */ else x+=40; /*------------------*/ } /*----- Individua con una miglior precisione l'obbiettivo ---*/ /* e ne restituisce la distanza */ _scanner() { orange=range;ox=x; /* Memorizzo la situazione precedente */ x+=5-(scan(x-5,5) != 0)*10; /* Affino la mira */ x+=3-(scan(x-3,3) != 0)*6; x+=1-(scan(x-1,1) != 0)*2; range=scan(x,10); /* Memorizzo la nuova distanza */ return(range); /* e la restituisco */ } pendolo() /****** movimento a pendolo inclinato di 45ø **/ { if (angolo==1 || angolo==3) drive(dir=180*(loc_x()pos)+alfa,100); } fire2() /****** fuoco mentre mi muovo a pendolo ****/ { if (_scanner()){ if (_scanner()) cannon(x+(x-ox),range+(range-orange)*range/600); else vicino();} else vicino(); }