def decease_iteration(self, being): if being.current_decease_rate == 0: return False roll = np.random.rand() if roll < being.current_decease_rate**2: being.ill = True if being.ill: roll = np.random.rand() if roll < being.decease_death_rate: self.delete_being(being) self.stats["died_of_illness"][being.type_id] += 1 return True if roll > 1 - being.decease_recovery_rate: being.ill = False being.current_decease_rate /= 2 return False for i in range(-self.decease_spread_range, self.decease_spread_range + 1): for j in range(-self.decease_spread_range, self.decease_spread_range + 1): for being_index in self.beings_map[being.modify_position( (i, j), self.beings_map.shape, change_position=False)]: roll = np.random.rand() if self.beings_list[being_index].ill: if roll < being.current_decease_rate: being.ill = True return False return False
def iterate_ring(self, being, radius): """ generateur qui retourne les cellules de carrée de coté 2*raduis + 1, centré sur la position de being """ for i in range(-radius, radius + 1): current_cell_position = being.modify_position( (i, -radius), self.beings_map.shape, change_position=False) yield current_cell_position, (i, -radius) for i in range(-radius, radius + 1): current_cell_position = being.modify_position( (i, radius), self.beings_map.shape, change_position=False) yield current_cell_position, (i, radius) for i in range(-radius + 1, radius): current_cell_position = being.modify_position( (-radius, i), self.beings_map.shape, change_position=False) yield current_cell_position, (-radius, -i) for i in range(-radius + 1, radius): current_cell_position = being.modify_position( (radius, i), self.beings_map.shape, change_position=False) yield current_cell_position, (radius, -i)
def move_being(self, being, roam=True, angle=0): if roam: angle = np.random.rand() * 2 * pi if np.random.rand() < being.direction_change_probability: being.current_direction = being.move_range * np.array( (cos(angle), sin(angle))) self.remove_being_from_map(being) if roam: being.modify_position(( cos(angle) * being.move_range * being.random_movement_portion + being.current_direction[0] * (1 - being.random_movement_portion), sin(angle) * being.move_range * being.random_movement_portion + being.current_direction[1] * (1 - being.random_movement_portion)), self.beings_map.shape) else: being.modify_position(( cos(angle) * being.move_range, sin(angle) * being.move_range, ), self.beings_map.shape) self.add_being_to_map(being)
def find_and_eat(self, being): for i in range(-1, 2): for j in range(-1, 2): current_cell_position = being.modify_position( (i, j), self.beings_map.shape, change_position=False) for being_index in self.beings_map[current_cell_position]: if (not self.beings_list[being_index].is_dead and being.get_position_in_list() != self. beings_list[being_index].get_position_in_list() and self.beings_list[being_index].type_id in being.edible_species_id): self.eat(being, self.beings_list[being_index]) return True return False