1998/goblin.r
001 | /****************************************************************************/ |
002 | /* */ |
003 | /* VIII Torneo di CRobots di MCmicrocomputer (1998) */ |
004 | /* */ |
005 | /* CROBOT: GOBLIN.R */ |
006 | /* */ |
007 | /* AUTORE: Daniele Nuzzo */ |
008 | /* */ |
009 | /****************************************************************************/ |
010 |
011 | /* Nel caso si rendesse necessario limitare i combattimenti ad un solo robot |
012 | per concorrente preferisco veder combattere questo crobot (GOBLIN.R). */ |
013 |
014 | /* |
015 | SCHEDA TECNICA: |
016 |
017 | Inizialmente il crobot si reca nell'angolo pi� vicino. |
018 | Nell'angolo viene utilizzata questa strategia: |
019 |
020 | - Se il crobot si trova in un angolo in basso controlla nell'angolo |
021 | sopra se ci sono altri crobots e se non c'� nessuno si reca sopra |
022 | nel nuovo angolo; analogamente se si trova a nord e non c'� nessuno |
023 | in basso scende; |
024 |
025 | - Altrimenti rimane fermo e defilato nell'angolo finch� non viene |
026 | colpito con una certa precisione (almeno 5% di danno) o finch� |
027 | non si avvicina nessuno nell'angolo; |
028 |
029 | - Quindi cambia angolo spostandosi sempre in uno dei due angoli |
030 | adiacenti, preferendo se possibile (se non ci sono altri crobots) |
031 | muoversi lungo le pareti verticali dell'arena di combattimento. |
032 |
033 | Durante tutto il match il crobots controlla continuamente se � rimasto |
034 | un solo avversario ed in tal caso lo attacca; la routine di attacco � |
035 | basata sullo spostamento lungo le due grandi diagonali, utilizzando un |
036 | piccolo accorgimento: il crobot non va mai incontro ad un avversario |
037 | che si trova in un angolo; infatti dopo aver percorso met� diagonale |
038 | (il crobots si trova pi� o meno nel centro dell'arena) si controlla che |
039 | l'angolo in cui si sta per andare sia libero, in caso contrario si cambia |
040 | la diagonale di attacco. |
041 |
042 | Vengono utilizzate 2 routine di fuoco a seconda che il crobots sia fermo |
043 | o in movimento; tali routine sono pi� o meno le stesse utilizzate in |
044 | Diabolik.r e nei suoi predecessori. Quindi niente di nuovo per le routine |
045 | di fuoco! |
046 |
047 |
048 | */ |
049 |
050 | int rng,orng,deg,odeg,dir,t,q,dam; |
051 |
052 | main() |
053 | { |
054 | /* Vai nell'angolo pi� vicino: */ |
055 |
056 | if (loc_x()<500) sx(); else dx(); |
057 | if (loc_y()<500) dw(); else up(); |
058 |
059 | while (1) |
060 | { |
061 | if (UpDown()) |
062 | { |
063 | Angle(); |
064 | if (UpDown()) Move(); |
065 | } |
066 | } |
067 | |
068 | } |
069 |
070 | up() { dir=90; while (loc_y()<900) { drive(90,100); Fire(); } drive(270,0); } |
071 | dw() { dir=270; while (loc_y()>100) { drive(270,100); Fire(); } drive(90,0); } |
072 | dx() { dir=0; while (loc_x()<900) { drive(0,100); Fire(); } drive(180,0); } |
073 | sx() { dir=180; while (loc_x()>100) { drive(180,100); Fire(); } drive(0,0); } |
074 |
075 | Angle() |
076 | { |
077 | dam=damage(); |
078 | while ((!orng || orng>450) && (damage()<dam+4)) |
079 | { |
080 | if (t>15) |
081 | if (Radar()) |
082 | { Stop(); while (1) { diag(); Stop(); } } /* Attacca!!! */ |
083 | dam=damage(); |
084 | Fire(1); |
085 | } |
086 | } |
087 |
088 | Move() |
089 | { |
090 | if (loc_x()<500) dx(); else sx(); |
091 | } |
092 |
093 | UpDown() |
094 | { |
095 | if (t>15) return 1; |
096 | if (loc_y()<500) { if (!scan(80,10) && !scan(100,10)) { up(); return 0; } } |
097 | else { if (!scan(260,10) && !scan(280,10)) { dw(); return 0; } } |
098 | return 1; |
099 | } |
100 |
101 | Radar() |
102 | { |
103 | deg=-10; t=0; |
104 | while ((deg+=20)!=710) if (scan(deg,10)) ++t; |
105 | if (t<3) return 1; |
106 | t=0; |
107 | return 0; |
108 | } |
109 |
110 | Stop() |
111 | { |
112 | if (loc_x()<500) if (loc_y()<500) q=0; else q=3; |
113 | else if (loc_y()<500) q=1; else q=2; |
114 | dir=45+90*q; |
115 | drive(dir,0); |
116 | } |
117 |
118 | diag() |
119 | { |
120 | while ((loc_x()<450) || (loc_x()>550)) { drive(dir,100); Fire(); } |
121 |
122 | if ((scan(dir-10,10)) || (scan(dir+10,10))) |
123 | { |
124 | if ((scan(dir-80,10)) || (scan(dir-100,10))) |
125 | { dir+=90; drive(dir); } |
126 | else |
127 | { dir-=90; drive(dir); } |
128 | } |
129 |
130 | while ((loc_x()<850) && (loc_x()>150) && |
131 | (loc_y()<850) && (loc_y()>150)) { drive(dir,100); Fire(); } |
132 | Stop(); |
133 | } |
134 |
135 | Fire(flag) |
136 | { |
137 | if (orng=scan(deg,10)) |
138 | { |
139 | if (!scan(deg-=5,5)) deg+=10; |
140 | if (orng>700) |
141 | { |
142 | if (!scan(deg-=3,3)) deg+=6; |
143 | cannon(deg,orng); ++t; deg+=40; return ; |
144 | } |
145 |
146 | if (scan(deg-5,1)) deg-=5; |
147 | if (scan(deg+5,1)) deg+=5; |
148 | if (scan(deg-3,1)) deg-=3; |
149 | if (scan(deg+3,1)) deg+=3; |
150 | if (scan(deg-1,1)) deg-=1; |
151 | if (scan(deg+1,1)) deg+=1; |
152 |
153 | if (orng=scan(odeg=deg,5)) |
154 | { |
155 | if (scan(deg-5,1)) deg-=5; |
156 | if (scan(deg+5,1)) deg+=5; |
157 | if (scan(deg-3,1)) deg-=3; |
158 | if (scan(deg+3,1)) deg+=3; |
159 | if (scan(deg-1,1)) deg-=1; |
160 | if (scan(deg+1,1)) deg+=1; |
161 |
162 | if (rng=scan(deg,10)) |
163 | { |
164 | if (flag) |
165 | { |
166 | cannon(deg+(deg-odeg)*((1200+rng)>>9), |
167 | rng*160/(160+orng-rng)); |
168 | } |
169 | else |
170 | { |
171 | cannon(deg+(deg-odeg)*((1200+rng)>>9)-( sin (deg-dir)>>14), |
172 | rng*160/(160+orng-rng-( cos (deg-dir)>>12))); |
173 | } |
174 | t=0; |
175 | } |
176 | } |
177 | } |
178 | else |
179 | { |
180 | if (scan(deg-=20,10)) return ; |
181 | if (scan(deg+=40,10)) return ; |
182 | deg+=40; return ; |
183 | } |
184 | } |