def perform_agent_action(self, agent: Agent, action: str): # Perform the specified action if possible, wait otherwise if action == 'UP' and self.tile_is_free(agent.x, agent.y - 1): agent.y -= 1 agent.add_event(e.MOVED_UP) elif action == 'DOWN' and self.tile_is_free(agent.x, agent.y + 1): agent.y += 1 agent.add_event(e.MOVED_DOWN) elif action == 'LEFT' and self.tile_is_free(agent.x - 1, agent.y): agent.x -= 1 agent.add_event(e.MOVED_LEFT) elif action == 'RIGHT' and self.tile_is_free(agent.x + 1, agent.y): agent.x += 1 agent.add_event(e.MOVED_RIGHT) elif action == 'BOMB' and agent.bombs_left: self.logger.info( f'Agent <{agent.name}> drops bomb at {(agent.x, agent.y)}') self.bombs.append( Bomb((agent.x, agent.y), agent, s.BOMB_TIMER, s.BOMB_POWER, agent.color, custom_sprite=agent.bomb_sprite)) agent.bombs_left = False agent.add_event(e.BOMB_DROPPED) elif action == 'WAIT': agent.add_event(e.WAITED) else: agent.add_event(e.INVALID_ACTION)