コード例 #1
0
    def perform(self, comms):
        goal = self.world.our_goal
        robots = filter(lambda r: not r.is_missing(), self.world.their_robots)
        robots.sort(key=lambda r: math.hypot(r.x - goal.x, r.y - goal.y))
        if len(robots) == 0:
            logging.error("There is no enemy here. Gimme someone to destroy!")
            return 1
        robot = robots[0]
        cone_upper = math.atan2(goal.x - robot.x, goal.higher_post - robot.y) % (2 * pi)
        cone_lower = math.atan2(goal.x - robot.x, goal.lower_post - robot.y) % (2 * pi)
        if robot.angle < min(cone_upper, cone_lower) or robot.angle > max(cone_upper, cone_lower):
            critical_angle = (cone_upper + cone_lower) / 2
        else:
            critical_angle = robot.angle

        target_rotation = (critical_angle - self.robot.angle + pi / 2) % pi - pi / 2
        if (critical_angle - self.robot.angle + pi / 2) % pi - pi / 2 <= 0.6:
            target_rotation = 0
        dist = utils.defender_get_alignment_offset(self.robot, robot, critical_angle, target_rotation)
        logging.info("Aligning with enemy. (Rotate %f degrees, move %f right)", math.degrees(target_rotation), dist)
        if abs(dist) > MOVEMENT_THRESHOLD and abs(target_rotation) > ROTATION_THRESHOLD:
            comms.turn_then_move(target_rotation, dist)
            return utils.defender_turn_delay(target_rotation) + utils.defender_move_delay(dist)
        elif abs(dist) > MOVEMENT_THRESHOLD:
            comms.move(dist)
            return utils.defender_move_delay(dist)
        elif abs(target_rotation) > ROTATION_THRESHOLD:
            comms.turn(target_rotation)
            return utils.defender_turn_delay(target_rotation)
コード例 #2
0
 def perform(self, comms):
     target_rotation = (self.world.ball.angle - self.robot.angle + pi / 2) % pi - pi / 2
     dist = utils.defender_get_alignment_offset(self.robot, self.world.ball, self.world.ball.angle, target_rotation)
     logging.info("Aligning with ball. (Rotate %f degrees, move %f right)", math.degrees(target_rotation), dist)
     if abs(dist) > MOVEMENT_THRESHOLD:
         comms.turn_then_move(target_rotation, dist)
         return utils.defender_turn_delay(target_rotation) + utils.defender_move_delay(dist)
     else:
         comms.turn(target_rotation)
         return utils.defender_turn_delay(target_rotation)
コード例 #3
0
 def perform(self, comms):
     dist = utils.defender_get_alignment_offset(self.robot, self.world.ball, self.world.ball.angle)
     logging.info("Aligning with ball. (Move %f right)", dist)
     if abs(dist) > MOVEMENT_THRESHOLD:
         comms.move(dist)
         return utils.defender_move_delay(dist)