class World(object): """ contains flock, perimeter and obstacles. doesn't have ros stuff other serialization to messages. """ def __init__(self, perimeter_points, num_boids=30): self.perimeter = Perimeter(perimeter_points) self.minx, self.miny, self.maxx, self.maxy = self.perimeter.get_bounds() self.num_boids = num_boids self.flock = Flock(num_boids, self.perimeter) self.static_obstacles = [] self.dynamic_obstacles = [] self.goals = [] self.agents = [] self.set_static_obstacles() def update(self): for agent in self.agents: agent.update() self.flock.update(self.static_obstacles + self.dynamic_obstacles, self.goals, self.agents) def set_dynamic_obstacles(self, polygon_perimeters): self.dynamic_obstacles = [Obstacle(p) for p in polygon_perimeters] def set_static_obstacles(self): corners = [[self.minx, self.miny], [self.minx, self.maxy], [self.maxx, self.maxy], [self.maxx, self.miny]] self.static_obstacles = [obstacle_from_point(c) for c in corners] world_barrier_points = [[-65, 190], [55, 190], [55, 210], [-65, 230]] world_barrier = Obstacle(world_barrier_points) self.static_obstacles.append(world_barrier) def set_goals(self, xys): self.goals = [Goal(*xy) for xy in xys]
'''Simple script for running the program''' from flock import Flock # Parameters time_steps = 200 number_of_birds = 150 is_predator_present = True # Initialize flock myFlock = Flock(number_of_birds, predator=is_predator_present) # Run simulation for m in range(0, time_steps): myFlock.update() myFlock.drawPlot(m)
class Level(abc.ABC): entrance_gate_position = None exit_gate_position = None new_events = [] landing_zone_top = 820 maximum_plant_level = landing_zone_top minimum_plant_level = 600 exit_gate_open = True name = None extra_help_lines = [] def __init__(self, game): self.game = game self.canvas = game.canvas self.background = pygame.image.load( os.path.join('images', self.name.lower(), 'background.png')) self.console_image = pygame.image.load( os.path.join('images', self.name.lower(), 'console.png')) self.attractors = [] self.flock = None self.flock = Flock(self) self.has_visited = False self._level_complete = False if self.exit_gate_position: self.attractors.append( Attractor(self.exit_gate_position, 500, Settings.gate_radius * 2)) # 'Attractors': AttractorsRule(self, 1, [Attractor((300, 300), 50)]), self.flowers = [] self.init_level() @abc.abstractmethod def init_level(self): pass @abc.abstractmethod def level_complete_check(self): pass def on_first_entry(self): pass def leader_enters(self): if not self.has_visited: self.game.event_handler.activate(self.new_events) self.game.help_lines += self.extra_help_lines self.on_first_entry() self.game.state = GameState.READ_INTRO # def first_visitor(self): # """First time any boid visits this level""" # # def visit(self): # if not self.has_visited: # self.first_visitor() # self.has_visited = True @property def level_complete(self): if logger.getEffectiveLevel() <= logging.DEBUG: return True # Once passed, a level stays done, even if the test starts failing again if self._level_complete: return True if self.level_complete_check(): self._level_complete = True return self._level_complete @property def contains_leader(self): return self.flock.leader is not None def update(self, duration): self.flock.update(duration) [flower.update(duration) for flower in self.flowers] def draw(self): self.canvas.blit(self.background, (0, 0)) # [ # item.draw(self.canvas) # for item in self.flowers # ] [flower.draw() for flower in self.flowers] self.flock.draw() if self.entrance_gate_position: pygame.draw.circle(self.canvas, pygame.Color('green'), self.entrance_gate_position, Settings.gate_radius, 2) if self.exit_gate_position: if not self.exit_gate_open: colour = pygame.Color('red') elif not self.level_complete: colour = pygame.Color('blue') else: colour = pygame.Color('green') pygame.draw.circle(self.canvas, colour, self.exit_gate_position, Settings.gate_radius, 2) self.canvas.blit(self.console_image, (0, 0))