def __init__(self, env, precount, history):
        super(GStrategy3, self).__init__(env, precount, history)

        if self.hwp is None or self.hwp.player_id != env.me.player_id:
            self.do_get_puck = True
            puck_nearest_hockeyist = min(
                shortcuts.my_field_hockeyists(env),
                key=lambda h: assessments.ticks_to_reach_point(env, h, env.world.puck)
            )
            self.active_puck_taker = puck_nearest_hockeyist
            def_nearest_hockeyist = min(
                filter(
                    lambda h: h.id != puck_nearest_hockeyist.id,
                    shortcuts.my_field_hockeyists(env)
                ),
                key=lambda h: assessments.ticks_to_reach_point(env, h, self.precount.defence_point)
            )
            self.defenceman = def_nearest_hockeyist
            other_hockeyist = filter(
                lambda h: h.id not in (def_nearest_hockeyist.id, puck_nearest_hockeyist.id),
                shortcuts.my_field_hockeyists(env)
            )[0]
            self.second_puck_taker = other_hockeyist
        else:
            self.strike_point = self.count_strike_point(env)
            if self.pass_condition(env, self.strike_point):
                self.do_pass = True
                self.pass_maker = self.hwp
                self.pass_taker = self.count_pass_taker(env)
                other = filter(
                    lambda h: h.id not in (self.pass_maker.id, self.pass_taker.id),
                    shortcuts.my_field_hockeyists(env)
                )[0]
                def_nearest_hockeyist = min(
                    filter(
                        lambda h: h.id != self.hwp.id,
                        shortcuts.my_field_hockeyists(env)
                    ),
                    key=lambda h: assessments.ticks_to_reach_point(env, h, self.precount.defence_point)
                )
                if other.id == def_nearest_hockeyist.id:
                    self.defenceman = other
                else:
                    self.attack_supporter = other
            else:
                self.do_goal = True
                self.attacker = self.hwp
                self.defenceman = min(
                    filter(
                        lambda h: h.id != self.attacker.id,
                        shortcuts.my_field_hockeyists(env)
                    ),
                    key=lambda h: assessments.ticks_to_reach_point(env, h, self.precount.defence_point)
                )
                other = filter(
                    lambda h: h.id not in (self.attacker.id, self.defenceman.id),
                    shortcuts.my_field_hockeyists(env)
                )[0]
                self.attack_supporter = other
    def __init__(self, env, precount, history):
        super(GStrategy2, self).__init__(env, precount, history)

        my_nearest_hockeyist = min(
            shortcuts.my_field_hockeyists(env),
            key=lambda h: assessments.ticks_to_reach_point(env, h, env.world.puck)
        )
        my_other_hockeyist = filter(
            lambda h: h.id != my_nearest_hockeyist.id,
            shortcuts.my_field_hockeyists(env)
        )[0]
        if self.hwp is None or self.hwp.player_id != env.me.player_id:
            self.do_get_puck = True
            self.defenceman = my_other_hockeyist
            self.active_puck_taker = my_nearest_hockeyist
        else:
            self.strike_point = self.count_strike_point(env)
            if self.pass_condition(env, self.strike_point):
                self.do_pass = True
                self.pass_maker = self.hwp
                self.pass_taker = filter(
                    lambda h: h.id != self.hwp.id,
                    shortcuts.my_field_hockeyists(env)
                )[0]
            else:
                self.do_goal = True
                self.attacker = self.hwp
                self.defenceman = filter(
                    lambda h: h.id != self.hwp.id,
                    shortcuts.my_field_hockeyists(env)
                )[0]
    def attack_with_puck(self, env):
        if any(geometry.point_in_convex_polygon(env.me, p) for p in self.attack_polygons):
            strike_point = env.me

        else:
            strike_point = algorithm.best_point_for_polynoms(
                self.attack_polygons,
                f=lambda p: -assessments.ticks_to_reach_point(env, env.me, p))
        # strike_point = geometry.convex_polygons_nearest_point(
        #     self.attack_polygons, env.me)

        if env.me.get_distance_to_unit(strike_point) >= 60:
            # print strike_point
            experiments.fast_move_to_point(env, strike_point)
            return

        goal_point = experiments.get_goal_point(env)
        basic_actions.turn_to_unit(env, goal_point)

        if basic_actions.turned_to_unit(env, goal_point, eps=geometry.degree_to_rad(1.0)):
            # if self.opponent_protect_goal(env, goal_point):
            #     env.move.action = ActionType.SWING
            # else:
            #     env.move.action = ActionType.STRIKE
            env.move.action = ActionType.SWING
 def f(point):
     nfc = shortcuts.net_front_center(env, shortcuts.opponent_player(env))
     angles = [
         min(geometry.degree_to_rad(110), geometry.ray_ray_angle(oh, env.me, point))
         for oh in shortcuts.opponent_field_hockeyists(env)
         if geometry.distance(oh, nfc) > 300
     ]
     ticks_to_reach_point = assessments.ticks_to_reach_point(env, env.me, point)
     if not angles:
         return -ticks_to_reach_point
     return geometry.rad_to_degree(min(angles)) - ticks_to_reach_point / 100
    def move(self, me, world, game, move):

        env = environment.Environment(me, world, game, move)

        if world.tick == 0:
            op = shortcuts.opponent_player(env)
            mp = shortcuts.my_player(env)
            self.attack_polygons = experiments.count_optimistic_attack_polygons(env, op)
            self.target_polygons = [
                experiments.count_target_up_attack_polygon(env, op),
                experiments.count_target_down_attack_polygon(env, op),
            ]
            self.defence_point = experiments.count_defence_point(env)
            self.weak_polygons = experiments.count_cautious_attack_polygons(env, mp)
            self.dead_polygons = experiments.count_dead_polygons(env, op)

            self.last_puck_owner_player_id = None

        self.save_last_puck_owner(env)
        self.save_start_game_tick(env)

        if env.me.state == HockeyistState.SWINGING:
            if self.swing_condition(env):
                env.move.action = ActionType.SWING

            if self.strike_condition(env):
                env.move.action = ActionType.STRIKE

            return

        hockeyist_with_puck = shortcuts.hockeyist_with_puck(env)
        my_nearest_hockeyist = min(
            shortcuts.my_field_hockeyists(env), key=lambda h: assessments.ticks_to_reach_point(env, h, env.world.puck)
        )
        if hockeyist_with_puck is None or hockeyist_with_puck.player_id != env.me.player_id:
            if my_nearest_hockeyist.id == me.id:
                self.do_get_puck_actions(env)
            else:
                self.do_protect_goal_actions(env)
        elif hockeyist_with_puck.player_id == env.me.player_id:
            if hockeyist_with_puck.id == env.me.id:
                self.attack_with_puck(env)
            else:
                self.do_protect_goal_actions(env)