Mercurial > MadButterfly
comparison examples/tank/enemy.c @ 1103:2b8b6deb35c8
Fix bug of AI of tank
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Sun, 05 Dec 2010 14:26:19 +0800 |
parents | dbea3e42bf93 |
children | 236a47079c2b |
comparison
equal
deleted
inserted
replaced
1102:dbea3e42bf93 | 1103:2b8b6deb35c8 |
---|---|
17 try_fire(tank_t *me, tank_t *target, tank_rt_t *tank_rt) { | 17 try_fire(tank_t *me, tank_t *target, tank_rt_t *tank_rt) { |
18 int x, y; | 18 int x, y; |
19 int *tracer = NULL; | 19 int *tracer = NULL; |
20 int target_value; | 20 int target_value; |
21 int target_dir; | 21 int target_dir; |
22 tank_t **enemies; | |
23 int i; | |
22 | 24 |
23 if(me->map_x == target->map_x) { /* In a row */ | 25 if(me->map_x == target->map_x) { /* In a row */ |
24 tracer = &y; | 26 tracer = &y; |
25 target_value = target->map_y; | 27 target_value = target->map_y; |
26 if(me->map_y < target->map_y) | 28 if(me->map_y < target->map_y) |
41 return 0; /* Not in a row or column */ | 43 return 0; /* Not in a row or column */ |
42 | 44 |
43 /* Check obstacles between tanks */ | 45 /* Check obstacles between tanks */ |
44 x = me->map_x; | 46 x = me->map_x; |
45 y = me->map_y; | 47 y = me->map_y; |
48 enemies = tank_rt->tank_enemies; | |
46 if(*tracer < target_value) { | 49 if(*tracer < target_value) { |
47 while(++*tracer < target_value) { | 50 while(++*tracer < target_value) { |
48 if(map[y][x] != MUD) | 51 if(map[y][x] != MUD) |
49 break; | 52 break; |
53 for(i = 0; i < tank_rt->n_enemy; i++) { | |
54 if(enemies[i]->map_x == x && enemies[i]->map_y == y) | |
55 break; | |
56 } | |
57 if(i != tank_rt->n_enemy) | |
58 break; | |
50 } | 59 } |
51 } else { | 60 } else { |
52 while(--*tracer > target_value) { | 61 while(--*tracer > target_value) { |
53 if(map[y][x] != MUD) | 62 if(map[y][x] != MUD) |
63 break; | |
64 for(i = 0; i < tank_rt->n_enemy; i++) { | |
65 if(enemies[i]->map_x == x && enemies[i]->map_y == y) | |
66 break; | |
67 } | |
68 if(i != tank_rt->n_enemy) | |
54 break; | 69 break; |
55 } | 70 } |
56 } | 71 } |
57 | 72 |
58 if(*tracer == target_value) { /* No any obstacle between tanks */ | 73 if(*tracer == target_value) { /* No any obstacle between tanks */ |
140 break; | 155 break; |
141 } | 156 } |
142 | 157 |
143 possibles = 0; | 158 possibles = 0; |
144 for(i = 0; i < 3; i++) { | 159 for(i = 0; i < 3; i++) { |
145 chk_dir = (dir - 1 + i) % 4; | 160 chk_dir = (dir + 3 + i) % 4; |
146 if(status[chk_dir] == NOTHING) | 161 if(status[chk_dir] == NOTHING) |
147 possibles++; | 162 possibles++; |
148 } | 163 } |
149 | 164 |
150 if(possibles == 0) { /* Only can move backward */ | 165 if(possibles == 0) { /* Only can move backward */ |
163 break; | 178 break; |
164 } | 179 } |
165 return; | 180 return; |
166 } | 181 } |
167 | 182 |
168 which_dir = rand() % possibles; | 183 which_dir = (rand() % possibles) + 1; |
169 for(i = 0; i < 3; i++) { | 184 for(i = 0; i < 3; i++) { |
170 chk_dir = (dir - 1 + i) % 4; | 185 chk_dir = (dir + 3 + i) % 4; |
171 if(status[chk_dir] == NOTHING) { | 186 if(status[chk_dir] == NOTHING) { |
187 which_dir--; | |
172 if(which_dir == 0) | 188 if(which_dir == 0) |
173 break; | 189 break; |
174 which_dir--; | |
175 } | 190 } |
176 } | 191 } |
177 switch(chk_dir) { | 192 switch(chk_dir) { |
178 case 0: | 193 case 0: |
179 tank_move(me, TD_RIGHT, tank_rt); | 194 tank_move(me, TD_RIGHT, tank_rt); |