annotate gamelib/animal.py @ 70:d92a2f973cc4

Make foxes move 'better' and break fences
author Neil Muller <drnlmuller@gmail.com>
date Mon, 31 Aug 2009 22:14:41 +0000
parents f20dd3dcb118
children 00cf9d7f22dc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
1 """Class for the various animals in the game"""
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
2
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
3 from pgu.vid import Sprite
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
4 from pgu.algo import getline
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
5
44
7e884084e7b1 Move animal sprites to imagecache.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
6 import imagecache
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
7 import tiles
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
8 from misc import Position
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
9
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
10 class Animal(Sprite):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
11 """Base class for animals"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
12
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
13 def __init__(self, image_left, image_right, tile_pos):
38
03121c89d5fd Make the secret foxes really secret
Neil Muller <drnlmuller@gmail.com>
parents: 32
diff changeset
14 # Create the animal somewhere far off screen
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
15 Sprite.__init__(self, image_left, (-1000, -1000))
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
16 self.image_left = image_left
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
17 self.image_right = image_right
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
18 self.pos = Position(tile_pos[0], tile_pos[1])
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
19
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
20 def loop(self, tv, _sprite):
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
21 ppos = tv.tile_to_view(self.pos.to_tuple())
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
22 self.rect.x = ppos[0]
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
23 self.rect.y = ppos[1]
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
24
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
25 def move(self, state):
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
26 """Given the game state, return a new position for the object"""
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
27 # Default is not to move
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
28 pass
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
29
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
30 def _fix_face(self, final_pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
31 """Set the face correctly"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
32 if final_pos.left_of(self.pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
33 self.setimage(self.image_left)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
34 elif final_pos.right_of(self.pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
35 self.setimage(self.image_right)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
36
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
37 class Chicken(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
38 """A chicken"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
39
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
40 def __init__(self, pos):
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
41 image_left = imagecache.load_image('sprites/chkn.png')
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
42 image_right = imagecache.load_image('sprites/chkn.png',
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
43 ("right_facing",))
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
44 Animal.__init__(self, image_left, image_right, pos)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
45
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
46 def move(self, gameboard):
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
47 """A free chicken will move away from other free chickens"""
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
48 pass
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
49
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
50 class Egg(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
51 """An egg"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
52
47
be2496df2368 Add egg image to egg sprite.
Simon Cross <hodgestar@gmail.com>
parents: 44
diff changeset
53 def __init__(self, pos):
be2496df2368 Add egg image to egg sprite.
Simon Cross <hodgestar@gmail.com>
parents: 44
diff changeset
54 image = imagecache.load_image('sprites/egg.png')
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
55 Animal.__init__(self, image, image, pos)
47
be2496df2368 Add egg image to egg sprite.
Simon Cross <hodgestar@gmail.com>
parents: 44
diff changeset
56
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
57 # Eggs don't move
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
58
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
59 class Fox(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
60 """A fox"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
61
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
62 costs = {
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
63 # weighting for movement calculation
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
64 'grassland' : 2,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
65 'woodland' : 1, # Try to keep to the woods if possible
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
66 'broken fence' : 1,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
67 'fence' : 10,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
68 'guardtower' : 1, # We can pass under towers
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
69 'henhouse' : 1,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
70 }
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
71
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
72 def __init__(self, pos):
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
73 image_left = imagecache.load_image('sprites/fox.png')
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
74 image_right = imagecache.load_image('sprites/fox.png',
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
75 ("right_facing",))
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
76 Animal.__init__(self, image_left, image_right, pos)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
77 self.landmarks = [self.pos]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
78 self.hunting = True
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
79 self.dig_pos = None
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
80 self.tick = 0
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
81
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
82 def _cost_path(self, path, gameboard):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
83 """Calculate the cost of a path"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
84 total = 0
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
85 for pos in path:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
86 if gameboard.in_bounds(pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
87 this_tile = gameboard.tv.get(pos.to_tuple())
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
88 cost = self.costs.get(tiles.TILE_MAP[this_tile], 100)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
89 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
90 cost = 100 # Out of bounds is expensive
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
91 total += cost
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
92 return total
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
93
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
94 def _gen_path(self, start_pos, final_pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
95 """Construct a direct path from start_pos to final_pos,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
96 excluding start_pos"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
97 if abs(start_pos.x - final_pos.x) < 2 and \
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
98 abs(start_pos.y - final_pos.y) < 2:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
99 # pgu gets this case wrong on occasion.
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
100 return [final_pos]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
101 start = start_pos.to_tuple()
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
102 end = final_pos.to_tuple()
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
103 points = getline(start, end)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
104 points.remove(start) # exclude start_pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
105 if end not in points:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
106 # Rounding errors in getline cause this
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
107 points.append(end)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
108 return [Position(x[0], x[1]) for x in points]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
109
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
110 def _find_best_path_step(self, final_pos, gameboard):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
111 """Find the cheapest path to final_pos, and return the next step
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
112 along the path."""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
113 # We calculate the cost of the direct path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
114 direct_path = self._gen_path(self.pos, final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
115 min_cost = self._cost_path(direct_path, gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
116 min_path = direct_path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
117 # is there a point nearby that gives us a cheaper direct path?
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
118 poss = [Position(x, y) for x in range(self.pos.x - 2, self.pos.x + 3)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
119 for y in range(self.pos.y - 2, self.pos.y + 3)]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
120 for start in poss:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
121 if start == self.pos:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
122 continue # don't repeat work we don't need to
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
123 cand_path = self._gen_path(self.pos, start) + \
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
124 self._gen_path(start, final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
125 cost = self._cost_path(cand_path, gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
126 if cost < min_cost:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
127 min_cost = cost
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
128 min_path = cand_path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
129 if not min_path:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
130 return final_pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
131 return min_path[0]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
132
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
133 def _find_path_to_woodland(self, gameboard):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
134 """Dive back to woodland through the landmarks"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
135 # find the closest point to our current location in walked path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
136 if self.pos == self.landmarks[-1]:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
137 if len(self.landmarks) > 1:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
138 self.landmarks.pop() # Moving to the next landmark
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
139 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
140 # Safely back at the start
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
141 return self.pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
142 return self._find_best_path_step(self.landmarks[-1], gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
143
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
144 def _find_path_to_chicken(self, gameboard):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
145 """Find the path to the closest chicken"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
146 # Find the closest chicken
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
147 min_dist = 999
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
148 closest = None
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
149 for chicken in gameboard.chickens:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
150 dist = chicken.pos.dist(self.pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
151 if dist < min_dist:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
152 min_dist = dist
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
153 closest = chicken
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
154 if not closest:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
155 # No more chickens, so leave
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
156 self.hunting = False
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
157 return self.pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
158 if closest.pos == self.pos:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
159 # Caught a chicken
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
160 gameboard.remove_chicken(closest)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
161 self.hunting = False
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
162 return self.pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
163 return self._find_best_path_step(closest.pos, gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
164
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
165 def _update_pos(self, gameboard, new_pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
166 """Update the position, making sure we don't step on other foxes"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
167 final_pos = new_pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
168 moves = [Position(x, y) for x in range(self.pos.x-1, self.pos.x + 2)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
169 for y in range(self.pos.y-1, self.pos.y + 2)]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
170 blocked = False
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
171 for fox in gameboard.foxes:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
172 if fox is not self and fox.pos == new_pos:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
173 blocked = True
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
174 if fox.pos in moves:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
175 moves.remove(fox.pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
176 if blocked:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
177 # find the closest point in moves to new_pos that's not a fence
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
178 final_pos = None
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
179 dist = 10
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
180 for poss in moves:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
181 this_tile = gameboard.tv.get(poss.to_tuple())
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
182 new_dist = poss.dist(new_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
183 if new_dist < dist:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
184 dist = new_dist
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
185 final_pos = poss
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
186 this_tile = gameboard.tv.get(final_pos.to_tuple())
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
187 if tiles.TILE_MAP[this_tile] == 'broken fence' and self.hunting:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
188 # We'll head back towards the holes we make/find
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
189 self.landmarks.append(final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
190 elif tiles.TILE_MAP[this_tile] == 'fence' and not self.dig_pos:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
191 self.tick = 5
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
192 self.dig_pos = final_pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
193 return self.pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
194 return final_pos
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
195
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
196 def move(self, gameboard):
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
197 """Foxes will aim to move towards the closest henhouse or free
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
198 chicken"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
199 if self.dig_pos:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
200 if self.tick:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
201 # We're digging through the fence
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
202 self.tick -= 1
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
203 # Check the another fox hasn't dug a hole for us
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
204 # We're top busy digging to notice if a hole appears nearby,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
205 # but we'll notice if the fence we're digging vanishes
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
206 this_tile = gameboard.tv.get(self.dig_pos.to_tuple())
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
207 if tiles.TILE_MAP[this_tile] == 'broken fence':
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
208 self.tick = 0
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
209 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
210 # We've dug through the fence, so make a hole
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
211 gameboard.tv.set(self.dig_pos.to_tuple(),
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
212 tiles.REVERSE_TILE_MAP['broken fence'])
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
213 self.dig_pos = None
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
214 return
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
215 if self.hunting:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
216 desired_pos = self._find_path_to_chicken(gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
217 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
218 desired_pos = self._find_path_to_woodland(gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
219 final_pos = self._update_pos(gameboard, desired_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
220 self._fix_face(final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
221 self.pos = final_pos
29
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 28
diff changeset
222
2e88c680672c Minimal fox raid logic
Neil Muller <drnlmuller@gmail.com>
parents: 28
diff changeset
223