1999/aeris.r
001 | /****************************************************************************** |
002 |
003 | CROBOT: AERIS - 28/11/1999 |
004 |
005 | AUTORE: Marco Giovannini |
006 |
007 | ******************************************************************************* |
008 |
009 | E' dura la vita per una matricola: con un solo mese di tempo a disposizione |
010 | e' difficile imparare ad usare CRobots e creare un robot competitivo. Quindi |
011 | e' molto, ma molto meglio copiare quelli gia' fatti e vedere cosa succede. |
012 | AERIS e' un robot standard, ma se volete proprio vedere come funziona eccovi |
013 | la sua scheda tecnica: |
014 |
015 | SCHEDA TECNICA: |
016 | Come tutti, AERIS cerca di sopravvivere alle prime concitate fasi della |
017 | battaglia nascondendosi nell'angolo piu' vicino. Qui compie un movimento |
018 | triangolare sparando a tutto cio' che vede nel raggio del cannone con |
019 | due routines di fuoco: una e' quella classica di tox.r, l'altra invece |
020 | e' quella classica dei bambini (!) che viene richiamata durante la fase |
021 | di rallentamento del robot. |
022 | Chiaramente non si puo' continuare cosi' per sempre: il loop viene |
023 | interrotto se viene superata una soglia critica di danni (nel qual caso |
024 | si cambia quadrante) oppure non si colpisce nessuno per 16 volte |
025 | consecutive. |
026 | In quest'ultimo caso, se e' rimasto un solo altro robot in campo, viene |
027 | attivata la routine di attacco finale kamikaze() attinta a piene mani da |
028 | goblin.r, in cui si corre sulle diagonali sparando a vista. Questa |
029 | routine viene richiamata anche nel caso in cui passati circa 150000 |
030 | cicli virtuali di clock non c'e' ancora stato un vincitore. |
031 |
032 | La cosa bella di questo robot e' che, viste le efficienze degli altri |
033 | partecipanti al torneo, non avra' speranza di passare almeno il primo |
034 | girone: visto che si comporta come goblin.r, gli farete un mazzo tanto... |
035 | Che dire allora? Uno ci prova!! |
036 | */ |
037 |
038 | int xx, yy; /* variabili temporanee */ |
039 |
040 | int time ; /* contatore per i cicli virtuali di clock */ |
041 | int quad; /* quadrante in cui si trova il robot */ |
042 | int max_dam; /* massimo danno sopportabile prima di andare via */ |
043 | int counter; /* da quanto tempo e' che non si vede nessuno? */ |
044 |
045 | int t_alfa; /* variabile temporanea */ |
046 | int m_alfa; /* angolo di movimento */ |
047 | int x_alfa, y_alfa, h_alfa; /* orrizzontale, verticale, obliquo */ |
048 |
049 | int c_alfa, c_rng; /* angolo del cannone e raggio */ |
050 | int o_alfa, o_rng; /* old angolo del cannone e old raggio */ |
051 |
052 |
053 | main() |
054 | { |
055 | /* rileva in quale quadrante si trova: 0 se in basso a sinistra, 1 in |
056 | basso a destra, 2 in alto a destra, 3 in alto a sinistra */ |
057 | quad = (xx = (loc_x() > 500)) + (yy = (loc_y() > 500)) + ((!xx && yy) * 2); |
058 |
059 | wait(); |
060 |
061 | kamikaze(); |
062 | } |
063 |
064 |
065 | init_loop() |
066 | { |
067 | /* spostati nell'angolo del quadrante corrente */ |
068 | if (quad == 0 || quad == 3) { x_alfa = 0; while (loc_x() > 100) go(180); } |
069 | else { x_alfa = 180; while (loc_x() < 900) go(0); } |
070 | stop(); |
071 | if (quad >= 2) { y_alfa = 90; while (loc_y() < 900) go(90); } |
072 | else { y_alfa = 270; while (loc_y() > 100) go(270); } |
073 | stop(); |
074 |
075 | h_alfa = 495 - 90*quad; |
076 | max_dam = damage() + 20; |
077 | } |
078 |
079 |
080 | wait() |
081 | { |
082 | init_loop(); |
083 | while (counter < 16) { |
084 | while (damage() < max_dam && counter < 16) { |
085 | /* movimento in orrizzontale */ |
086 | while (loc_x() < 150 || loc_x() > 850) go(x_alfa); stop(); |
087 | /* in obliquo */ |
088 | while (loc_x() > 100 && loc_x() < 900) go(h_alfa); stop(); |
089 | /* in verticale */ |
090 | while (loc_y() > 100 && loc_y() < 900) go(y_alfa); stop(); |
091 |
092 | if (++ time > 80) /* se ti sei stufato di aspettare... */ |
093 | if (damage() < 80) kamikaze(); else time = 0; |
094 | } |
095 |
096 | if (counter >= 16) { /* se non hai trovato nessuno */ |
097 | int t; /* controlla che non siate solo in due */ |
098 | c_alfa = -10; |
099 | while (c_alfa < 710) if (scan(c_alfa += 20, 10)) ++t; |
100 | if (t > 2) counter = 0; /* senno' continua ad aspettare */ |
101 | } else { /* altrimenti cambia quadrante */ |
102 | t_alfa = quad*90; /* controlla che non ci sia gia' qualcuno */ |
103 | if (scan(t_alfa + 350, 10) || scan(t_alfa + 10, 10)) { |
104 | if (!(scan(t_alfa + 80, 10) || scan(t_alfa + 100, 10))) |
105 | { quad = (quad + 3) % 4; init_loop(); } /* quello prima */ |
106 | } else { quad = (quad + 1) % 4; init_loop(); } /* quello dopo */ |
107 | } |
108 | } |
109 | } |
110 |
111 |
112 | kamikaze() |
113 | { |
114 | m_alfa = 45 + quad*90; /* direzione della diagonale */ |
115 | while (1) { |
116 | while (loc_x() < 450 || loc_x() > 550) go(m_alfa); stop(); /* centro */ |
117 | drive(m_alfa += 180, 100); |
118 |
119 | if (scan(m_alfa + 350, 10) || scan(m_alfa + 10, 10)) { |
120 | if (scan(m_alfa + 80, 10) || scan(m_alfa + 100, 10)) m_alfa += 270; |
121 | else m_alfa += 90; |
122 | stop(); |
123 | } |
124 |
125 | while (loc_x() < 850 && loc_x() > 150 && |
126 | loc_y() < 850 && loc_y() > 150) go(m_alfa); stop(); |
127 | m_alfa += 180; |
128 | } |
129 | } |
130 |
131 |
132 | go(dir) |
133 | { |
134 | drive(m_alfa = dir, 100); |
135 | if (o_rng = scan(c_alfa, 10)) { |
136 | if (o_rng > 700) { c_alfa += 40; ++counter; return ; } /* e' lontano */ |
137 |
138 | if (scan(c_alfa + 355, 1)) c_alfa += 355; |
139 | if (scan(c_alfa + 5, 1)) c_alfa += 5; |
140 | if (scan(c_alfa + 357, 1)) c_alfa += 357; |
141 | if (scan(c_alfa + 3, 1)) c_alfa += 3; |
142 | if (scan(c_alfa + 359, 1)) c_alfa += 359; |
143 | if (scan(c_alfa + 1, 1)) c_alfa += 1; |
144 |
145 | if (o_rng = scan(o_alfa = c_alfa, 10)) { |
146 | if (scan(c_alfa + 355, 1)) c_alfa += 355; |
147 | if (scan(c_alfa + 5, 1)) c_alfa += 5; |
148 | if (scan(c_alfa + 357, 1)) c_alfa += 357; |
149 | if (scan(c_alfa + 3, 1)) c_alfa += 3; |
150 | if (scan(c_alfa + 359, 1)) c_alfa += 359; |
151 | if (scan(c_alfa + 1, 1)) c_alfa += 1; |
152 |
153 | if (c_rng = scan(c_alfa, 10)) { |
154 | cannon( c_alfa+(c_alfa-o_alfa)*((1200+c_rng)>>9)-( sin (c_alfa-m_alfa)>>14), |
155 | (c_rng*160)/(160+o_rng-c_rng-( cos (c_alfa-m_alfa)>>12)) ); |
156 | counter = 0; |
157 | return ; |
158 | } |
159 | } |
160 | } |
161 | hunt(); /* non c'e' nessuno? cerca li' intorno */ |
162 | } |
163 |
164 |
165 | stop() |
166 | { |
167 | drive(m_alfa, 0); |
168 | while (speed() > 40) { |
169 | if (c_rng = scan(c_alfa, 10)) { |
170 | if (c_rng > 700) { c_alfa += 40; ++counter; } |
171 | else { |
172 | if (o_rng = scan(c_alfa += 5, 5)) cannon(c_alfa, o_rng); |
173 | else cannon(c_alfa += 350, c_rng); |
174 | counter = 0; |
175 | } |
176 | } else hunt(); |
177 | } |
178 | } |
179 |
180 |
181 | hunt() |
182 | { |
183 | if (scan(c_alfa += 340, 10)) return ; /* guarda a destra */ |
184 | if (scan(c_alfa += 40, 10)) return ; /* guarda a sinistra */ |
185 | c_alfa += 40; |
186 | } |