def get_goal_point(env, puck):
    opponent_player = env.world.get_opponent_player()
    if opponent_player.net_back > shortcuts.rink_center(env).x:
        goal_x = opponent_player.net_front + 20
    else:
        goal_x = opponent_player.net_front - 20
    if puck.y < shortcuts.rink_center(env):
        goal_y = opponent_player.net_bottom
    else:
        goal_y = opponent_player.net_top
    return geometry.Point(goal_x, goal_y)
 def can_run(self, env):
     if abs(env.world.puck.y - shortcuts.rink_center(env).y) < 130:
         return False
     for oh in shortcuts.opponent_field_hockeyists(env):
         if geometry.distance(env.me, oh) < 150:
             return False
     return True
 def save_start_game_tick(self, env):
     puck = env.world.puck
     if geometry.distance(puck, shortcuts.rink_center(env)) > 0.1:
         return
     puck_abs_speed = geometry.vector_abs(puck.speed_x, puck.speed_y)
     if puck_abs_speed > 0.1:
         return
     self.game_start_tick = env.world.tick
def _count_player_weak_points(env, player):
    is_left = 1. if player.net_back < shortcuts.rink_center(env).x else -1.
    return [
        geometry.Point(
            player.net_front + is_left * env.game.goal_net_height * 1.5,
            env.game.goal_net_top - 50
        ),
        geometry.Point(
            player.net_front + is_left * env.game.goal_net_height * 1.5,
            env.game.goal_net_top + env.game.goal_net_height + 50
        )
    ]
def count_chances(env):
    radius = env.world.puck.radius
    total = 0
    hits = 0
    hits_in_area = 0
    hits_not_in_area = 0
    miss_in_area = 0
    miss_not_in_area = 0

    # polygon = experiments.count_puck_attack_area(env, shortcuts.opponent_player(env))

    res_str = ""
    for x in range(int(env.game.rink_left + radius), int(env.game.rink_right - radius), 5):
        for y in range(int(env.game.rink_top + radius), int(env.game.rink_bottom - radius), 5):

            if y > shortcuts.rink_center(env).y:
                continue

            puck = make_puck(env, x, y)
            goalie = goalie_by_puck(env, puck)
            hit = not prediction.goalie_can_save_straight(env, puck=puck, goalie=goalie)

            # in_area = geometry.point_in_convex_polygon(
            #     geometry.Point(x, y), polygon)
            in_area = True

            total += 1
            if hit:
                hits += 1
                res_str += "point {0} {1}\n".format(x, y)
            if hit and in_area:
                hits_in_area += 1
            if hit and not in_area:
                hits_not_in_area += 1
            if not hit and in_area:
                miss_in_area += 1
            if not hit and not in_area:
                miss_not_in_area += 1

    print "total", total
    print "hits", hits
    print "hits_in_area", hits_in_area
    print "hits_not_in_area", hits_not_in_area
    print "miss_in_area", miss_in_area
    print "miss_not_in_area", miss_not_in_area
    with open("draw_area", "w") as i:
        i.write(res_str)
def find_points(env, speed_abs, shift):

    # polygon = experiments.count_puck_attack_area(env, shortcuts.opponent_player(env))
    step = 5
    res_str = ''
    points = []
    for x in range(int(env.game.rink_left), int(env.game.rink_right), step):
        for y in range(int(env.game.rink_top), int(env.game.rink_bottom), step):

            if y > shortcuts.rink_center(env).y:
                continue

            puck = make_puck(env, x, y, speed_abs, shift)
            goalie = goalie_by_puck(env, puck)
            hit = not prediction.goalie_can_save_straight(
                env, puck=puck, goalie=goalie)

            if hit:
                res_str += 'point {0} {1}\n'.format(x, y)
                points.append(geometry.Point(x, y))

            # if hit and x > 1100:
            #     import ipdb; ipdb.set_trace()
            #     pass

    if not points:
        return None

    hull = shapely.geometry.MultiPoint([
        shapely.geometry.Point(p.x, p.y)
        for p in points
    ]).convex_hull

    if hull.type != 'Polygon':
        return None

    pol = geometry.Polygon([
        geometry.Point(c[0], c[1])
        for c in list(hull.exterior.coords)
    ])
    return pol
env = make_start_env_im_left()

pols = {}
optimistic_pols = {}
speed_abs = 15.
while speed_abs <= 20.:
    fp = find_points(env, speed_abs, 20)
    if fp is not None:
        pols[speed_abs] = fp
    fpo = find_points(env, speed_abs, 2)
    if fpo is not None:
        optimistic_pols[speed_abs] = fpo
    speed_abs += 0.5

up_right_pols = pols
rc = shortcuts.rink_center(env)

up_left_pols = {}
for k, v in up_right_pols.iteritems():
    up_left_pols[k] = geometry.Polygon([
        geometry.mirror_x(p, rc.x)
        for p in v.points
    ])

down_left_pols = {}
for k, v in up_right_pols.iteritems():
    down_left_pols[k] = geometry.Polygon([
        geometry.mirror_y(geometry.mirror_x(p, rc.x), rc.y)
        for p in v.points
    ])
 def attack_without_puck(self, env, gstrategy):
     strike_point = gstrategy.strike_point
     strike_point = geometry.mirror_x(strike_point, shortcuts.rink_center(env).x)
     strike_point = geometry.mirror_y(strike_point, shortcuts.rink_center(env).y)
     experiments.fast_move_to_point_forward(env, strike_point)