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