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);