2010/cancella.r
001 | /* |
002 |
003 |
004 |
005 | Torneo di C Robots 2010 |
006 | C Robots: cancella.r |
007 | Categoria: Midi |
008 |
009 |
010 | Autore: Pizzocaro Marco |
011 |
012 |
013 | Scheda tecnica: |
014 | Praticamente identico al vecchio neutron.r. |
015 | Qualche modifica inessenziale alle routine di fuoco. |
016 |
017 | */ |
018 |
019 |
020 | int range, dir, oang, ang; /*variabili per il cannone*/ |
021 | int b, posy, posx; /*variabili dell'attacco finale*/ |
022 | int xora, dist, aq, mod; /*variabili dell'oscillazione*/ |
023 | int t; /*timer*/ |
024 | int sca, nemici; /*variabili per il conteggio dei nemici*/ |
025 | int sc; /*angolo della scansione*/ |
026 | int ver, hor; /*variabili dell'angolo*/ |
027 |
028 | main() |
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*/ |
078 | fire(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 |
095 | dx(limt) { while (loc_x()<limt) fire(0); drive(0,0);} |
096 | sx(limt) { while (loc_x()>limt) fire(180);drive(180,0);} |
097 |
098 |
099 |
100 | /*routine di fuoco del f2f*/ |
101 | fuoco(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 |
122 | veloce(){cannon(ang,3*scan(ang,10)-2*range);} |
123 |
124 |
125 | /*attacco da f2f*/ |
126 | boom() |
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 |
155 | look() { |
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 | } |