Mercurial > rinkhals
changeset 518:a42852e50df1
Rework prey selection. Greedy Foxes are less inclined to attack the same chicken multiple times
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Fri, 27 Nov 2009 13:34:50 +0000 |
parents | 05e0c3fd20ec |
children | f84ad10a9625 |
files | gamelib/animal.py |
diffstat | 1 files changed, 30 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/gamelib/animal.py Fri Nov 27 13:20:52 2009 +0000 +++ b/gamelib/animal.py Fri Nov 27 13:34:50 2009 +0000 @@ -576,15 +576,20 @@ return Position(self.pos.x, self.pos.y, new_z) return self._find_best_path_step() + def _calculate_dist(self, chicken): + """Calculate the distance to the chicken""" + dist = chicken.pos.dist(self.pos) + if chicken.abode: + dist += 5 # Prefer free-ranging chickens + if len(chicken.weapons()) > 0: + dist += 5 # Prefer unarmed chickens + return dist + def _select_prey(self): min_dist = 999 self.closest = None for chicken in self.gameboard.chickens: - dist = chicken.pos.dist(self.pos) - if chicken.abode: - dist += 5 # Prefer free-ranging chickens - if len(chicken.weapons()) > 0: - dist += 5 # Prefer unarmed chickens + dist = self._calculate_dist(chicken) if dist < min_dist: min_dist = dist self.closest = chicken @@ -745,15 +750,29 @@ def __init__(self, pos, gameboard): Fox.__init__(self, pos, gameboard) self.chickens_eaten = 0 + self.last_chicken = None def _catch_chicken(self, chicken): chicken.damage() + self.last_chicken = self.closest self.closest = None self.chickens_eaten += 1 if self.chickens_eaten > 2: self.hunting = False self.target = self.start_pos self._last_steps = [] + else: + self._select_prey() # select new target + + def _calculate_dist(self, chicken): + """Calculate the distance to the chicken""" + dist = super(GreedyFox, self)._calculate_dist(chicken) + if self.last_chicken and self.last_chicken is chicken: + # We hurt our teeth, only attack the same chicken if it's the + # only one nearby + dist += 15 + return dist + class Rinkhals(Fox): """The Rinkhals has eclectic tastes""" @@ -764,18 +783,12 @@ costs = Fox.costs.copy() costs['fence'] = 2 - def _select_prey(self): - """The Rinkhals eats eggs""" - min_dist = 999 - self.closest = None - for chicken in self.gameboard.chickens: - dist = chicken.pos.dist(self.pos) - if not chicken.eggs: - dist += 100 # The closest eggs have to be *far* away to be safe - if dist < min_dist: - min_dist = dist - self.closest = chicken - self.target = self.closest.pos + def _calculate_dist(self, chicken): + """The Rinkhals eats eggs, so tweak distance accordingly""" + dist = chicken.pos.dist(self.pos) + if not chicken.eggs: + dist += 100 # The closest eggs have to be *far* away to be safe + return dist def _catch_chicken(self, chicken): """The Rinkhals eats eggs, but does not harm chickens"""