1999/flash6.r

01/*
02            ###      Flash       ###
03            ###   versione 6.0   ###
04            ###  15 - 11 - 1999  ###
05 
06Autore: Lorenzo Ancarani
07 
08    Flash6 si sposta percorrendo in senso antiorario il perimetro
09    del campo di battaglia, alla massima velocita'.
10    L'algoritmo di fuoco e' ispirato da Tox
11    per cui la documentazione relativa e' reperibile nella scheda
12    tecnica di tale crobot. Alcune modifiche alla funzione di fuoco
13    originali sono state apportate per velocizzare ed alleggerire il
14    codice e nel contempo migliorare leggermente la precisione.
15*/
16 
17int ang, dir;
18 
19main()
20{
21    ang=11;
22    drive(dir=180,100);
23    while (loc_x() > 150) fuoco();
24    drive(dir=270,0);
25    while (speed() > 49) ;
26    drive(dir,100);
27    while (1)
28    {
29        while (loc_y() > 150)  {
30            fuoco();
31        }
32        stop(0);
33        while (loc_x() < 850) {
34            fuoco();
35        }
36        stop(90);
37        while (loc_y() < 850) {
38            fuoco();
39        }
40        stop(180);
41        while(loc_x() > 150)   {
42            fuoco();
43        }
44        stop(270);
45    }
46}
47 
48int   oang,range,orange,aa,rr;
49 
50trova()
51{
52    if(scan(ang-5,1)) ang-=5;
53    if(scan(ang+5,1)) ang+=5;
54    if(scan(ang-3,1)) ang-=3;
55    if(scan(ang+3,1)) ang+=3;
56    if(scan(ang-1,1)) ang-=1;
57    if(scan(ang+1,1)) ang+=1;
58}
59 
60ricerca() {
61    if(scan(ang-=10,10));
62    else if(scan(ang+=20,10));
63    else ang+=40;
64}
65 
66fuoco() /* fuoco() - routine di gestione del cannone */       
67{
68    if(scan(ang,10))
69    {
70        trova();
71        if (orange=scan(oang=ang,5))
72        {
73            trova();
74            if (range=scan(ang,10))
75            {
76                aa=(ang+(ang-oang)*((1150+range)>>9)-(sin(ang-dir)>>14));
77                rr=(range*183/(183+orange-range-(cos(ang-dir)>>12)));
78                cannon(aa,rr);
79                if (range>700) ang+=30;
80            }
81        }
82        else ricerca();
83    }
84    else ricerca();
85}
86 
87stop(deg) { /* Fermati ed imposta la direzione successiva */
88    drive(dir=deg,0);
89    while (speed() > 49) if (range=scan(dir,10) > 50)
90        cannon(dir,9*range/10);
91    drive(dir,100); /* Riparti */
92}