2007/electron.r

001/*
002 
003 
004E L E C T R O N
005 
006 
007 
008Torneo di C Robots 2007
009C Robots: electron.r
010Categoria: Micro
011VB: 499 (24%)
012 
013Autore: Pizzocaro Marco
014 
015Scheda tecnica:
016electron.r e' derivato da neutron.r, ma preso violentemente a martellate
017per farlo rientrare nelle 500 istruzioni.
018 
019Prima di tutto e' presente una sola routine di fuoco, sviluppata a
020partire da quelle dei fratelli maggiori neutron.r e proton.r (a loro volta
021derivate da !alien.r), con alcuni parametri che cambiano se si
022tratta di un f2f o di un 4vs4.
023 
024Nel 4vs4 oscilla solo orizzontalmete. Il calcolo della lunghezza di oscillazione
025e' notevolemente semplificato rispetto a neutron.r. Il tentativo e' sempre
026quello di accanirsi esclusivamente cotro il nemico sulla stessa orizzontale.
027 
028Il controllo del numero di nemici avviene su 180 gradi (abbondanti)
029anziche' solo sul quadrante opportuno, per risparmiare codice. La
030conseguente perdita di tempo e' leggermente compensata dal fatto
031che, ad inizio incontro, electron.r inizia a controllare i nemici
032non appena raggiunge la parete nord (o sud) dell'arena e non quando
033raggiunge l'angolo.
034 
035Il f2f non � molto diverso da quello di neutron.r, a parte ulteriori riduzioni
036di codice, con un movimento del tipo di boom.r.
037 
038*/
039 
040 
041int range, dir, oang, ang;      /*variabili per il cannone*/
042int b, posy, posx;          /*variabili dell'attacco finale*/
043int aq;             /*variabile dell'oscillazione*/
044int t;              /*timer*/
045int sca, n;             /*angolo del conteggio degli avversari*/
046int sc;                 /*angolo della scansione*/
047int ver, hor;           /*variabili dell'angolo*/
048int m, limite;          /*regolazione dello sparo*/
049 
050main()
051    {
052    /*si muove verticalmente verso la parete pi� vicina e inizializza alcune variabili*/
053    if((loc_y(hor=(loc_x(limite=835)>500))>500))  while(loc_y(sc=180)<940)  fire(90);
054    else while(loc_y()>60)  fire(270);
055     
056     
057    /*controlla se e' un f2f*/
058    look(dir=180*hor);
059     
060     
061    while((++t)<160) {  /*oscilla nell'angolo durante il 4vs4*/
062             
063            if (hor){
064                sx(925-(aq=range-800)*(aq>0));
065                dx(925);
066            }
067            else {
068                dx(75+(aq=range-800)*(aq>0));
069                sx(75);
070            }
071             
072            if(range>899) look(); /*prende tempo per contare i nemici*/
073             
074    }
075     
076    limite=2000;
077     
078    while(m=1) {    /*attacco del f2f*/
079         
080                if ((posx=loc_x())>880) dir=180;
081                else if (posx<120 ) dir=0;
082                else if ((posy=loc_y())>880) dir=270;
083                else if (posy<120) dir=90;                     
084        else if (range>600) dir=ang+25;
085        else if (range<150) dir=ang+195;
086        else dir=ang+180*(b^=1);
087                 
088        fire(dir);
089        fire(dir+0); /*una (in)utile temporizzazione*/
090        fire(dir);
091         
092         
093        /*drive(dir,60);*/
094                        
095    }
096     
097 
098 
099}/*end of main*/
100 
101 
102 
103 
104/*routine di fuoco*/
105fire(d)
106{
107    drive(d,100);
108    if ((range=scan(oang=ang,10))&&(range<limite)) {
109        if (scan(ang-8,5))  { if (scan(ang-=5,2)) ; else ang-=4; return(cannon(ang+(ang-oang),2*scan(ang,10)-range)); }
110        if (scan(ang+8,5))  { if (scan(ang+=5,2)) ; else ang+=4; return(cannon(ang+(ang-oang),2*scan(ang,10)-range)); }
111        if (scan(ang,10))   { if (scan(ang-=2,2)) ; else ang+=4; return(cannon(ang+m*(ang-oang),2*scan(ang,10)-range)); }
112    }
113    else if(scan(ang+=20,10));
114    else if(scan(ang-=40,10));
115    else if(scan(dir,10)) ang=dir;
116    else ang+=80;
117}
118 
119/*movimento verso destra e sinistra*/
120dx(limt) {while(loc_x()<limt) fire(0); drive(0,0);}
121sx(limt) {while(loc_x()>limt) fire(180);drive(180,0);}
122 
123 
124 
125/*scansiona circa 180 per controllare il numero di nemici*/
126look() {
127    drive(dir,n=2);
128 
129    sca=sc+210;
130    while(sca>sc&&n) n-=(scan(sca-=20,10)>0);
131 
132    t+=(2000*n);
133 
134}