Exemple #1
0
 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
Exemple #2
0
 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)
Exemple #3
0
 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)
Exemple #4
0
 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