/
ronin.py
61 lines (55 loc) · 1.93 KB
/
ronin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import rg
from abstract_robot import can_move, AbstractRobot
class Robot(AbstractRobot):
"""
This Robot picks off the nearest target
"""
def act(self, game):
# Move out of spawning zone
if 'spawn' in rg.loc_types(self.location):
loc = self.get_open_adjacent(game)
if loc:
return ['move', loc]
else:
# All adjacent are occupied, or still in the spawning zone.
loc = self.get_open_adjacent(game, spawnok=True)
if loc:
return ['move', loc]
# Find an enemy
loc, d = self.get_closest_enemy(game)
if d < 0:
# The are no enemies
return ['guard']
elif d <= 1:
# Enemy within range
if self.is_worth_dying(game):
return ['suicide']
return ['attack', loc]
else:
# Enemy out of range
closer = rg.toward(self.location, loc)
if can_move(closer, game):
return ['move', closer]
loc = self.get_open_adjacent(game)
if loc:
return ['move', loc]
return ['guard']
def get_closest_enemy(self, game):
"""
Returns location of and distance to nearest enemy.
If no enemies, returns (0, 0), -1
"""
closest_loc, closest_d, = (0, 0), -1
for loc, bot in game['robots'].iteritems():
if bot.player_id != self.player_id:
d = rg.dist(loc, self.location)
if closest_d < 0:
closest_d = d
closest_loc = loc
elif d < closest_d:
closest_d = d
closest_loc = loc
return closest_loc, closest_d
def is_worth_dying(self, game):
adj_enemies = self.get_adjacent_bots(game)
return super(Robot, self).is_worth_dying(adj_enemies)