Exemplo n.º 1
0
class CreatureManager(Observable):
    def __init__(self, nrof_creatures, world):
        super().__init__()
        self.nrof_creatures = nrof_creatures
        self.world = world
        self.creatures = QuadTree(600, 600)

    def create_creatures(self, nrof_creatures):
        """create nrof_creatures creatures"""
        for i in range(nrof_creatures):
            self.create_creature()

    def create_creature(self,
                        position=None,
                        creature_information=CreatureInformation(0, None)):
        """create a creature with default parameters"""
        if (position is None):
            position = (int(random.uniform(0,
                                           400)), int(random.uniform(0, 400)))
        information = creature_information
        dna = DNA(100, 100, 1, 5)
        #print(f"x:{position[0]} y:{position[1]}")
        creature = Creature(position, dna, information, self.world)
        self.register(creature, position)
        return creature

    def register(self, creature, position):
        self.creatures.insert(creature, position[0], position[1])
        creature.reproduce.register(self.create_offspring)
        creature.death.register(self.handle_death)
        self.notify()

    def unregister(self, creature):
        creature.reproduce.unregister(self.create_offspring)
        creature.death.unregister(self.handle_death)
        self.creatures.remove(creature)

    def handle_death(self, creature):
        """handle the death of a creature by unregistering it"""
        try:
            self.unregister(creature)
            self.notify()
        except ValueError as e:
            print("Tried removing unregistered creature from creature_manager")

    def get_creatures(self):
        """get all currently registered creatures"""
        return self.creatures.all()

    def update_creatures(self, delta_time):
        if (len(self.get_creatures()) < self.nrof_creatures):
            self.create_creatures(1)
        for creature in self.get_creatures():
            self.get_close_creatures(creature)
            creature.update(delta_time)

    def get_close_creatures(self, creature):
        creature.close_creatures = len(
            self.creatures.get_neighbors(creature.position[0],
                                         creature.position[1],
                                         creature.dna.sense_distance))

    def get_creature_highest_generation(self):
        return sorted(self.get_creatures(),
                      key=lambda creature: creature.information.generation)[-1]

    def create_offspring(self, creature):
        creature_information = CreatureInformation(
            creature.information.generation + 1, creature)
        new_position = (creature.position[0] + 5, creature.position[1] + 5)
        offspring = self.create_creature(
            position=creature.position,
            creature_information=creature_information)
        offspring.brain = Brain.from_existing_brain(creature.brain)
        offspring.brain.mutate()