annotate gamelib/animal.py @ 108:437cbd856a03

Add occupants and abodes. Allowing moving chickens around.
author Simon Cross <hodgestar@gmail.com>
date Wed, 02 Sep 2009 18:42:00 +0000
parents d17375586866
children 48019afde338
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
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
3 import random
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
4
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
5 from pgu.vid import Sprite
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
6 from pgu.algo import getline
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
7
44
7e884084e7b1 Move animal sprites to imagecache.
Simon Cross <hodgestar@gmail.com>
parents: 38
diff changeset
8 import imagecache
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
9 import tiles
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
10 from misc import Position
98
725b292ca07b Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents: 92
diff changeset
11 import sound
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
12
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
13 class Animal(Sprite):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
14 """Base class for animals"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
15
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
16 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
17 # 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
18 Sprite.__init__(self, image_left, (-1000, -1000))
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
19 self.image_left = image_left
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
20 self.image_right = image_right
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
21 self.pos = Position(tile_pos[0], tile_pos[1])
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
22 self.equipment = []
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
23 self.abode = None
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 loop(self, tv, _sprite):
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
26 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
27 self.rect.x = ppos[0]
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
28 self.rect.y = ppos[1]
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
29
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
30 def move(self, state):
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
31 """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
32 # Default is not to move
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
33 pass
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
34
108
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
35 def set_pos(self, tile_pos):
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
36 """Move an animal to the given tile_pos."""
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
37 new_pos = Position(*tile_pos)
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
38 self._fix_face(new_pos)
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
39 self.pos = new_pos
437cbd856a03 Add occupants and abodes. Allowing moving chickens around.
Simon Cross <hodgestar@gmail.com>
parents: 104
diff changeset
40
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
41 def _fix_face(self, final_pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
42 """Set the face correctly"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
43 if final_pos.left_of(self.pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
44 self.setimage(self.image_left)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
45 elif final_pos.right_of(self.pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
46 self.setimage(self.image_right)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
47
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
48 def equip(self, item):
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
49 self.equipment.append(item)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
50
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
51 def weapons(self):
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
52 return [e for e in self.equipment if e.is_weapon]
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
53
104
d17375586866 Add .covers(tile_pos) to animals (to match similar function on buildings).
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
54 def covers(self, tile_pos):
d17375586866 Add .covers(tile_pos) to animals (to match similar function on buildings).
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
55 return tile_pos[0] == self.pos.x and tile_pos[1] == self.pos.y
d17375586866 Add .covers(tile_pos) to animals (to match similar function on buildings).
Simon Cross <hodgestar@gmail.com>
parents: 98
diff changeset
56
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
57 class Chicken(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
58 """A chicken"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
59
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
60 def __init__(self, pos):
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
61 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
62 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
63 ("right_facing",))
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
64 Animal.__init__(self, image_left, image_right, pos)
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
65
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
66 def move(self, gameboard):
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
67 """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
68 pass
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
69
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
70 def _find_killable_fox(self, weapon, gameboard):
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
71 """Choose a random fox within range of this weapon."""
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
72 killable_foxes = []
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
73 for fox in gameboard.foxes:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
74 if weapon.in_range(gameboard, self, fox):
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
75 killable_foxes.append(fox)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
76 if not killable_foxes:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
77 return None
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
78 return random.choice(killable_foxes)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
79
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
80 def attack(self, gameboard):
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
81 """An armed chicken will attack a fox within range."""
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
82 if not self.weapons():
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
83 # Not going to take on a fox bare-winged.
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
84 return
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
85 # Choose the first weapon equipped.
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
86 weapon = self.weapons()[0]
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
87 fox = self._find_killable_fox(weapon, gameboard)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
88 if not fox:
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
89 return
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
90 if weapon.hit(gameboard, self, fox):
98
725b292ca07b Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents: 92
diff changeset
91 sound.play_sound("kill-fox.ogg")
84
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
92 gameboard.kill_fox(fox)
5494af02a0e8 Chickens with rifles!
Jeremy Thurgood <firxen@gmail.com>
parents: 82
diff changeset
93
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
94 class Egg(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
95 """An egg"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
96
47
be2496df2368 Add egg image to egg sprite.
Simon Cross <hodgestar@gmail.com>
parents: 44
diff changeset
97 def __init__(self, pos):
be2496df2368 Add egg image to egg sprite.
Simon Cross <hodgestar@gmail.com>
parents: 44
diff changeset
98 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
99 Animal.__init__(self, image, image, pos)
47
be2496df2368 Add egg image to egg sprite.
Simon Cross <hodgestar@gmail.com>
parents: 44
diff changeset
100
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
101 # Eggs don't move
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
102
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
103 class Fox(Animal):
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
104 """A fox"""
25
6d6ab0c1479d Add placing some chickens and foxes
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
105
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
106 costs = {
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
107 # weighting for movement calculation
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
108 'grassland' : 2,
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
109 'woodland' : 1, # Try to keep to the woods if possible
72
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
110 'broken fence' : 2,
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
111 'fence' : 10,
72
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
112 'guardtower' : 2, # We can pass under towers
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
113 'henhouse' : 2,
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
114 }
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
115
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
116 def __init__(self, pos):
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
117 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
118 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
119 ("right_facing",))
53
f20dd3dcb118 foxes don't run backwards
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 47
diff changeset
120 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
121 self.landmarks = [self.pos]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
122 self.hunting = True
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
123 self.dig_pos = None
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
124 self.tick = 0
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
125
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
126 def _cost_tile(self, pos, gameboard):
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
127 if gameboard.in_bounds(pos):
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
128 this_tile = gameboard.tv.get(pos.to_tuple())
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
129 cost = self.costs.get(tiles.TILE_MAP[this_tile], 100)
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
130 else:
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
131 cost = 100 # Out of bounds is expensive
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
132 return cost
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
133
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
134 def _cost_path(self, path, gameboard):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
135 """Calculate the cost of a path"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
136 total = 0
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
137 for pos in path:
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
138 total += self._cost_tile(pos, gameboard)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
139 return total
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
140
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
141 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
142 """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
143 excluding start_pos"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
144 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
145 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
146 # pgu gets this case wrong on occasion.
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
147 return [final_pos]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
148 start = start_pos.to_tuple()
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
149 end = final_pos.to_tuple()
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
150 points = getline(start, end)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
151 points.remove(start) # exclude start_pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
152 if end not in points:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
153 # Rounding errors in getline cause this
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
154 points.append(end)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
155 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
156
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
157 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
158 """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
159 along the path."""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
160 # 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
161 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
162 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
163 min_path = direct_path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
164 # is there a point nearby that gives us a cheaper direct path?
71
00cf9d7f22dc Expand comment
Neil Muller <drnlmuller@gmail.com>
parents: 70
diff changeset
165 # This is delibrately not finding the optimal path, as I don't
00cf9d7f22dc Expand comment
Neil Muller <drnlmuller@gmail.com>
parents: 70
diff changeset
166 # want the foxes to be too intelligent, although the implementation
00cf9d7f22dc Expand comment
Neil Muller <drnlmuller@gmail.com>
parents: 70
diff changeset
167 # isn't well optimised yet
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
168 poss = [Position(x, y) for x in range(self.pos.x - 3, self.pos.x + 4)
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
169 for y in range(self.pos.y - 3, self.pos.y + 4)
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
170 if (x, y) != (0,0)]
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
171 for start in poss:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
172 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
173 self._gen_path(start, final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
174 cost = self._cost_path(cand_path, gameboard)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
175 if cost < min_cost:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
176 min_cost = cost
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
177 min_path = cand_path
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
178 if not min_path:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
179 return final_pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
180 return min_path[0]
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
181
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
182 def _find_path_to_woodland(self, gameboard):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
183 """Dive back to woodland through the landmarks"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
184 # 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
185 if self.pos == self.landmarks[-1]:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
186 if len(self.landmarks) > 1:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
187 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
188 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
189 # Safely back at the start
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
190 return self.pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
191 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
192
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
193 def _find_path_to_chicken(self, gameboard):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
194 """Find the path to the closest chicken"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
195 # Find the closest chicken
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
196 min_dist = 999
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
197 closest = None
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
198 for chicken in gameboard.chickens:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
199 dist = chicken.pos.dist(self.pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
200 if dist < min_dist:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
201 min_dist = dist
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
202 closest = chicken
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
203 if not closest:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
204 # No more chickens, so leave
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
205 self.hunting = False
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
206 return self.pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
207 if closest.pos == self.pos:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
208 # Caught a chicken
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
209 self._catch_chicken(closest, gameboard)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
210 return self.pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
211 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
212
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
213 def _catch_chicken(self, chicken, gameboard):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
214 """Catch a chicken"""
98
725b292ca07b Added sounds killing foxes and chickens, and nightfall
David Fraser <davidf@sjsoft.com>
parents: 92
diff changeset
215 sound.play_sound("kill-chicken.ogg")
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
216 gameboard.remove_chicken(chicken)
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
217 self.hunting = False
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
218
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
219 def _update_pos(self, gameboard, new_pos):
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
220 """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
221 final_pos = new_pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
222 moves = [Position(x, y) for x in range(self.pos.x-1, self.pos.x + 2)
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
223 for y in range(self.pos.y-1, self.pos.y + 2)
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
224 if (x,y) != (0,0)]
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
225 blocked = False
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
226 for fox in gameboard.foxes:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
227 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
228 blocked = True
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
229 if fox.pos in moves:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
230 moves.remove(fox.pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
231 if blocked:
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
232 # find the cheapest point in moves to new_pos that's not blocked
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
233 final_pos = None
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
234 min_cost = 1000
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
235 for poss in moves:
82
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
236 cost = self._cost_tile(poss, gameboard)
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
237 if cost < min_cost:
bf28f499c6b4 Tweak fox avoidance behaviour
Neil Muller <drnlmuller@gmail.com>
parents: 72
diff changeset
238 min_cost = cost
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
239 final_pos = poss
72
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
240 if gameboard.in_bounds(final_pos):
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
241 this_tile = gameboard.tv.get(final_pos.to_tuple())
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
242 else:
aa4bd93575d9 Fix some bound checking and tweak movement costs
Neil Muller <drnlmuller@gmail.com>
parents: 71
diff changeset
243 this_tile = tiles.REVERSE_TILE_MAP['woodland']
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
244 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
245 # 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
246 self.landmarks.append(final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
247 elif tiles.TILE_MAP[this_tile] == 'fence' and not self.dig_pos:
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
248 self._dig(final_pos)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
249 return self.pos
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
250 return final_pos
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
251
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
252 def _dig(self, dig_pos):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
253 """Setup dig parameters, to be overridden if needed"""
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
254 self.tick = 5
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
255 self.dig_pos = dig_pos
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
256
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
257 def _make_hole(self, gameboard):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
258 """Make a hole in the fence"""
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
259 gameboard.tv.set(self.dig_pos.to_tuple(),
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
260 tiles.REVERSE_TILE_MAP['broken fence'])
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
261 self.dig_pos = None
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
262
28
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
263 def move(self, gameboard):
ac3a74352b74 Change animal.py to four space indents.
Simon Cross <hodgestar@gmail.com>
parents: 25
diff changeset
264 """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
265 chicken"""
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
266 if self.dig_pos:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
267 if self.tick:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
268 self.tick -= 1
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
269 # We're still digging through the fence
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
270 # Check the another fox hasn't dug a hole for us
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
271 # We're too busy digging to notice if a hole appears nearby,
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
272 # 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
273 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
274 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
275 self.tick = 0
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
276 return
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
277 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
278 # We've dug through the fence, so make a hole
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
279 self._make_hole(gameboard)
70
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
280 return
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
281 if self.hunting:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
282 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
283 else:
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
284 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
285 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
286 self._fix_face(final_pos)
d92a2f973cc4 Make foxes move 'better' and break fences
Neil Muller <drnlmuller@gmail.com>
parents: 53
diff changeset
287 self.pos = final_pos
92
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
288
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
289 class NinjaFox(Fox):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
290 """Ninja foxes are hard to see"""
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
291
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
292 class DemoFox(Fox):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
293 """Demolition Foxes destroy fences easily"""
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
294
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
295 class GreedyFox(Fox):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
296 """Greedy foxes eat more chickens"""
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
297
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
298 def __init__(self, pos):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
299 Fox.__init__(self, pos)
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
300 self.chickens_eaten = 0
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
301
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
302 def _catch_chicken(self, chicken, gameboard):
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
303 gameboard.remove_chicken(chicken)
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
304 self.chickens_eaten += 1
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
305 if self.chickens_eaten > 2:
bea1b9364583 Refactor Fox so we can have different types. Add a greedy fox
Neil Muller <drnlmuller@gmail.com>
parents: 84
diff changeset
306 self.hunting = False