1999/flash6.r
01 | /* |
02 | ### Flash ### |
03 | ### versione 6.0 ### |
04 | ### 15 - 11 - 1999 ### |
05 |
06 | Autore: 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 |
17 | int ang, dir; |
18 |
19 | main() |
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 |
48 | int oang,range,orange,aa,rr; |
49 |
50 | trova() |
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 |
60 | ricerca() { |
61 | if (scan(ang-=10,10)); |
62 | else if (scan(ang+=20,10)); |
63 | else ang+=40; |
64 | } |
65 |
66 | fuoco() /* 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 |
87 | stop(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 | } |