1995/biro.r
001 | /* Biro v5.1 30/09/1995 opera di Maurilio Longo (codice) & Teresa Cardellino */ |
002 | /* (supporto tecnico e morale) */ |
003 | /* */ |
004 | /* Teresa Cardellino: */ |
005 | /* Maurilio Longo: */ |
006 | |
007 | /* Si tratta di un sostanziale miglioramento rispetto al C-robot dell'anno */ |
008 | /* scorso. E' stata rifatta la logica di ricerca e puntamento del nemico -ora */ |
009 | /* piu' efficace- ed e' stata spostata la zona d'azione del robot. */ |
010 | /* La parte riguardante il calcolo della gittata non e' stata modificata in */ |
011 | /* quanto funzionante. Per il resto il robot si basa sulle normali routines di*/ |
012 | /* spostamento. */ |
013 |
014 |
015 |
016 | main() |
017 | { |
018 | int angolo, distanza, verso; /*, dir_x, dir_y;*/ |
019 |
020 | verso = 1; /* inzia a cercare il nemico in senso anti-orario */ |
021 | angolo = 0; /* a partire da 0 */ |
022 | |
023 | /* posizionati */ |
024 | vai_a(850, 800); |
025 | while ((p_distanza(loc_x(), loc_y(), 850, 800) > 50) && speed()) |
026 | if (!(distanza = scan(angolo, 10)) || (distanza > 750)) |
027 | angolo += 20; |
028 | else |
029 | fuoco(angolo, distanza, scan(angolo, 10), 17, 3); |
030 | /* ultimi due parametri = cicli cpu tra le due scan() e tra scan() e fuoco() */ |
031 |
032 | while (1) { |
033 |
034 | /* il crobot va su e giu' nell'angolo superiore dx */ |
035 | |
036 | /*dir_x = 550; |
037 | dir_y = 870;*/ |
038 | |
039 | vai_a(550, 870); |
040 | while ((loc_y() < 870) && speed()) |
041 | if (!(distanza = scan(angolo, 10)) || (distanza > 750)) |
042 | angolo += 19 * verso; |
043 | else { |
044 | angolo = trova(angolo, distanza); |
045 | while ((distanza = scan(angolo, 10)) && (loc_y() < 870)) |
046 | angolo = trova(angolo, distanza); |
047 | if (scan(angolo + 10, 10)) { |
048 | verso = 1; |
049 | angolo += 8; |
050 | } |
051 | else { |
052 | verso = -1; |
053 | angolo -= 8; |
054 | } |
055 | } |
056 |
057 | |
058 | /*dir_x = 850; |
059 | dir_y = 730;*/ |
060 | |
061 | vai_a(850, 730); |
062 | while ((loc_y() > 730) && speed()) |
063 | if (!(distanza = scan(angolo, 10)) || (distanza > 750)) |
064 | angolo += 19 * verso; |
065 | else { |
066 | angolo = trova(angolo, distanza); |
067 | while ((distanza = scan(angolo, 10)) && (loc_y() > 730)) |
068 | angolo = trova(angolo, distanza); |
069 | if (scan(angolo + 10, 10)) { |
070 | verso = 1; |
071 | angolo += 8; |
072 | } |
073 | else { |
074 | verso = -1; |
075 | angolo -= 8; |
076 | } |
077 | } |
078 | } |
079 | } |
080 |
081 |
082 | /* cerca di localizzare il nemico con una serie di scan() successive */ |
083 | /* se lo trova spara con una correzione fissa di 1 grado ogni 150m */ |
084 |
085 | int trova(angolo, distanza) |
086 | int angolo, distanza; |
087 | { |
088 | int n_distanza; |
089 |
090 | if (scan(angolo + 5, 5)) |
091 | if (n_distanza = scan(angolo + 3, 2)) |
092 | if (scan(angolo + 1, 1)) { |
093 | fuoco(angolo += (2 + n_distanza / 150), distanza, n_distanza, 30, 24); |
094 | return (angolo); |
095 | } |
096 | else { |
097 | fuoco(angolo += (4 + n_distanza / 150), distanza, n_distanza, 30, 24); |
098 | return (angolo); |
099 | } |
100 | else |
101 | if (n_distanza = scan(angolo + 8, 2)) |
102 | if (scan(angolo + 6, 1)) { |
103 | fuoco(angolo += (7 + n_distanza / 150), distanza, n_distanza, 40, 24); |
104 | return (angolo); |
105 | } |
106 | else { |
107 | fuoco(angolo += (9 + n_distanza / 150), distanza, n_distanza, 40, 24); |
108 | return (angolo); |
109 | } |
110 | else |
111 | return (angolo + 5); |
112 | else |
113 | if (scan(angolo - 5, 5)) |
114 | if (n_distanza = scan(angolo - 3, 2)) |
115 | if (scan(angolo - 1, 1)) { |
116 | fuoco(angolo -= (2 + n_distanza / 150), distanza, n_distanza, 38, 24); |
117 | return (angolo); |
118 | } |
119 | else { |
120 | fuoco(angolo -= (4 + n_distanza / 150), distanza, n_distanza, 38, 24); |
121 | return (angolo); |
122 | } |
123 | else |
124 | if (n_distanza = scan(angolo - 8, 2)) |
125 | if (scan(angolo - 6, 1)) { |
126 | fuoco(angolo -= (7 + n_distanza / 150), distanza, n_distanza, 48, 24); |
127 | return (angolo); |
128 | } |
129 | else { |
130 | fuoco(angolo -= (9 + n_distanza / 150), distanza, n_distanza, 48, 24); |
131 | return (angolo); |
132 | } |
133 | else |
134 | return (angolo - 5); |
135 | else |
136 | return (angolo); /* chi sa dov'e' ? */ |
137 | } |
138 |
139 |
140 | /* si occupa di sparare e di calcolare le correzioni di tiro necessarie */ |
141 | /* CPU_1 = cicli tra le due scan(); CPU_2 = cicli tra 2nda scan() e fuoco()*/ |
142 |
143 | int fuoco(angolo, distanza, n_distanza, CPU_1, CPU_2) |
144 | int angolo, distanza, n_distanza, CPU_1, CPU_2; |
145 | { |
146 | int velocita, spostamento, posizione, fatt_correzione, gittata; |
147 |
148 | velocita = (((n_distanza - distanza) * 1000000) / CPU_1); |
149 | |
150 | spostamento = velocita * (CPU_2 + 51); |
151 | /* 51 sono i cicli di cpu dall'inizio della fuoco() alla cannon() */ |
152 |
153 | posizione = n_distanza + (spostamento / 1000000); |
154 | fatt_correzione = ((velocita * posizione / 50) / 1000000); |
155 | gittata = posizione + fatt_correzione; |
156 |
157 | if (gittata > 40) |
158 | cannon(angolo, gittata); |
159 | else |
160 | cannon(angolo, 50); |
161 | /* lo sparo un po' oltre il minimo, forse riesco ad infiggere dei danni al nemico */ |
162 | return ; |
163 | } |
164 |
165 |
166 | /* effettua la conversione di rotta */ |
167 |
168 | int vai_a(x, y) |
169 | int x, y; |
170 | { |
171 | int heading; |
172 |
173 | heading = direzione(x, y); |
174 | drive(heading, 40); |
175 |
176 | while (speed() > 50) |
177 | ; |
178 |
179 | drive(heading, 100); |
180 | return ; |
181 | } |
182 |
183 |
184 | /* ritorna la direzione per un punto. */ |
185 |
186 | int direzione(x, y) |
187 | int x, y; |
188 | { |
189 | int locx, locy, r; |
190 |
191 | locx = loc_x(); |
192 | locy = loc_y(); |
193 |
194 | if (locx == x) |
195 | if (y > locy) |
196 | return (90); |
197 | else |
198 | return (270); |
199 | else { |
200 | r = atan (100000 * (locy - y) / (locx - x)); |
201 | if (y < locy) |
202 | if (x > locx) |
203 | return (360 + r); |
204 | else |
205 | return (180 + r); |
206 | else |
207 | if (x > locx) |
208 | return (r); |
209 | else |
210 | return (180 + r); |
211 | } |
212 | } |
213 |
214 |
215 | /* ritorna la distanza tra due punti */ |
216 |
217 | int p_distanza(x1, y1, x2, y2) |
218 | int x1, y1, x2, y2; |
219 | { |
220 | int x, y; |
221 |
222 | x = x1 - x2; |
223 | y = y1 - y2; |
224 | return ( sqrt ((x*x) + (y*y))); |
225 | } |