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 
016main()
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 
085int trova(angolo, distanza)
086int 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 
143int fuoco(angolo, distanza, n_distanza, CPU_1, CPU_2)
144int 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 
168int vai_a(x, y)
169int 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 
186int direzione(x, y)
187int 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 
217int p_distanza(x1, y1, x2, y2)
218int 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}