2010/cancella.r

001/*
002 
003 
004 
005Torneo di C Robots 2010
006C Robots: cancella.r
007Categoria: Midi
008 
009 
010Autore: Pizzocaro Marco
011 
012 
013Scheda tecnica:
014Praticamente identico al vecchio neutron.r.
015Qualche modifica inessenziale alle routine di fuoco.
016 
017*/
018 
019 
020int range, dir, oang, ang;      /*variabili per il cannone*/
021int b, posy, posx;          /*variabili dell'attacco finale*/
022int xora, dist, aq, mod;    /*variabili dell'oscillazione*/
023int t;              /*timer*/
024int sca, nemici;            /*variabili per il conteggio dei nemici*/
025int sc;                 /*angolo della scansione*/
026int ver, hor;           /*variabili dell'angolo*/
027 
028main()
029    {
030    /*si muove nell'angolo pi� vicino*/
031    if(hor=(loc_x()>500))  while(loc_x()<920)  fuoco(0); else while(loc_x()>80)  fuoco(dir=180);
032    if(ver=(loc_y()>500))  while(loc_y()<940)  fuoco(90); else while(loc_y()>60)  fuoco(270);
033     
034     
035     
036    drive(dir,0);
037    sc=90*(ver*2+(ver!=hor))-15;
038     
039    /*controlla il numero dei nemici ed eventualmente attacca*/
040    look();
041         
042    while(1) {  /*ciclo principale del 4vs4*/
043         
044            if (loc_x(++t)>500){
045                while(speed()>49);
046                drive(dir=180,100);
047                if (!(dist=scan(170,10))) if (!(dist=scan(190,10))) dist=900+mod;
048                if ((aq=dist-800+mod)>0) xora=loc_x()-aq;
049                else xora=925;
050                sx(xora);
051                dx(925);
052            }
053            else {
054                while(speed()>49);
055                drive(dir=0,100);
056                if (!(dist=scan(10,10))) if (!(dist=scan(350,10))) dist=900+mod;
057                if ((aq=dist-800+mod)>0) xora=aq+loc_x();
058                else xora=75;
059                dx(xora);
060                sx(75);
061            }
062     
063            if(dist>899) look(); /*prende tempo per contare i nemici*/
064                     
065    }
066     
067     
068 
069 
070}/*end of main*/
071 
072 
073 
074 
075 
076 
077/*routine di fuoco del 4vs4*/
078fire(d) {
079    drive(d,100);
080    if((range=scan(oang=ang,10))&&(range<835))
081        {
082        if (scan(ang-8,5))  { if (scan(ang-=5,2)) ; else ang-=4; return(cannon(ang+(ang-oang),2*scan(ang,10)-range)); }
083        if (scan(ang+8,5))  { if (scan(ang+=5,2)) ; else ang+=4; return(cannon(ang+(ang-oang),2*scan(ang,10)-range)); }
084        if (scan(ang,10))     { if (scan(ang-=2,2)) ; else ang+=4; return(cannon(ang,3*scan(ang,10)-2*range)); }
085    }
086    else if(range=scan(ang+=20,10)) cannon(ang,2*scan(ang,10)-range);
087        else if(range=scan(ang-=40,10)) cannon(ang,2*scan(ang,10)-range);
088    else if(scan(dir,10)) ang=dir;
089    else return (ang+=80);
090}
091 
092 
093/*movimento*/
094 
095dx(limt) {while(loc_x()<limt) fire(0); drive(0,0);}
096sx(limt) {while(loc_x()>limt) fire(180);drive(180,0);}
097 
098 
099 
100/*routine di fuoco del f2f*/
101fuoco(d)
102{
103    drive(d,100);
104    if ((range=scan(oang=ang,10))) {
105        if (scan(ang-8,5))  { if (scan(ang-=5,2)) ; else ang-=4; return(cannon(ang+(ang-oang),2*scan(ang,10)-range)); }
106        if (scan(ang+8,5))  { if (scan(ang+=5,2)) ; else ang+=4; return(cannon(ang+(ang-oang),2*scan(ang,10)-range)); }
107        if (scan(ang,10))     { if (scan(ang-=3,3)) ; else ang+=6; return(cannon(ang+(ang-oang),2*scan(ang,10)-range)); }
108         
109    }
110    else {
111        if (range=scan(ang+=340,10)) return veloce();
112        if (range=scan(ang+=40,10)) return veloce();
113        if (range=scan(ang+=300,10)) return veloce();
114        if (range=scan(ang+=80,10)) return veloce();
115        if (range=scan(ang+=260,10)) return veloce();
116        if (range=scan(ang+=120,10)) return veloce();
117        ang+=80;
118    }
119}
120 
121 
122veloce(){cannon(ang,3*scan(ang,10)-2*range);}
123 
124 
125/*attacco da f2f*/
126boom()
127{
128 
129    int b=0;
130        while(1) {
131             
132            if ((posx=loc_x())>880 ) dir=180;
133            else if (posx<120 ) dir=0;
134            else if ((posy=loc_y())>880 ) dir=270;
135            else if (posy<120) dir=90;                       
136            else if (range>600) dir=ang+25+(b^=1)*235;
137            else if (range<150) dir=ang+170+(b^=1)*25;
138            else dir=ang+180*(b^=1);
139                     
140             
141            fuoco(dir);
142            fuoco(dir);
143            fuoco(dir);
144             
145            drive(dir,60);
146                        
147                }
148             
149}
150 
151 
152 
153 
154 
155look() {
156    /*conteggio dei nemici*/
157    sca=sc+140;
158    nemici=2;
159    while(sca>sc&&nemici) nemici-=(scan(sca-=20,10)>0);
160 
161 
162    if(nemici) boom();
163    else if(t>260) {
164        if(damage()<70) boom();
165        /*else t=mod=0;*/
166         
167        } else {
168        ++t;
169        if(t>245) mod=80;
170    }
171 
172 
173}