def _generate_cover_to_coveree_mapping(self): # We want to assign a coveree(enemy) to every cover(ally) # We also want to know for each cover(ally), the other covers that share the same target(enemy) closest_enemies_to_ball = closest_players_to_point(self.game_state.ball_position, our_team=False) if len(closest_enemies_to_ball) > 0: closest_enemy_to_ball = closest_enemies_to_ball[0].player closest_enemies_to_our_goal = closest_players_to_point(self.game_state.field.our_goal, our_team=False) enemy_not_with_ball = [enemy.player for enemy in closest_enemies_to_our_goal if enemy.player is not closest_enemy_to_ball] else: enemy_not_with_ball = [] # If we don't have enough player we cover the ball if len(enemy_not_with_ball) == 0: cover_to_coveree = dict(zip(self.robots_in_cover_formation, cycle([self.game_state.ball]))) cover_to_formation = {cover: self.robots_in_cover_formation for cover in self.robots_in_cover_formation} # If we don't have enough enemy to cover, we group the player in formation elif len(self.robots_in_cover_formation) > len(enemy_not_with_ball): cover_to_coveree = dict(zip(self.robots_in_cover_formation, cycle(enemy_not_with_ball))) cover_to_formation = {} for cover, coveree in cover_to_coveree.items(): formation = [teamate for teamate, teamate_coveree in cover_to_coveree.items() if teamate_coveree == coveree] cover_to_formation[cover] = formation else: cover_to_coveree = dict(zip(self.robots_in_cover_formation, enemy_not_with_ball)) cover_to_formation = {cover: [cover] for cover in self.robots_in_cover_formation} return cover_to_coveree, cover_to_formation
def filter(self, observation=None, dt=0.05): last_ball_pose = self.game_state.field.ball.position if not dt: dt = self.default_dt self.transition_model(dt) if observation is not None: self.update(observation) else: players_my_team = closest_players_to_point(last_ball_pose) players_their_team = closest_players_to_point( last_ball_pose, False) if players_my_team[0].player_distance < players_their_team[ 0].player_distance: closest_player = players_my_team[0].player closest_player_distance_to_ball = players_my_team[ 0].player_distance else: closest_player = players_their_team[0].player closest_player_distance_to_ball = players_their_team[ 0].player_distance if closest_player_distance_to_ball < 150: #self.x[2] = closest_player.velocity.position[0] #self.x[3] = closest_player.velocity.position[1] player_to_ball = (last_ball_pose - closest_player.position ).normalized() * (BALL_RADIUS + ROBOT_RADIUS) self.x[0] = closest_player.position[0] + player_to_ball.x self.x[1] = closest_player.position[1] + player_to_ball.y self.x[2] = 0 self.x[3] = 0 self.predict() output_state = self.x #print("pos", self.x[0], self.x[1]) #print("speed", self.x[2], self.x[3]) return output_state
def _no_enemy_around_ball(self): closest = closest_players_to_point(self.game_state.ball_position, our_team=False) if len(closest) == 0: return True DANGEROUS_ENEMY_MIN_DISTANCE = 500 return closest[0].distance > DANGEROUS_ENEMY_MIN_DISTANCE
def is_closest_not_goalkeeper(self, player): closest_players = closest_players_to_point( self.game_state.ball_position, our_team=True) if player == closest_players[0].player: return True return closest_players[0].player == self.game_state.get_player_by_role(Role.GOALKEEPER) \ and player == closest_players[1].player
def _generate_cover_to_coveree_mapping(self): # We want to assign a coveree(enemy) to every cover(ally) # We also want to know for each cover(ally), the other covers that share the same target(enemy) closest_enemies_to_ball = closest_players_to_point( self.game_state.ball_position, our_team=False) if len(closest_enemies_to_ball) > 0: closest_enemy_to_ball = closest_enemies_to_ball[0].player closest_enemies_to_our_goal = closest_players_to_point( self.game_state.field.our_goal, our_team=False) enemy_not_with_ball = [ enemy.player for enemy in closest_enemies_to_our_goal if enemy.player is not closest_enemy_to_ball ] else: enemy_not_with_ball = [] # If we don't have enough player we cover the ball if len(enemy_not_with_ball) == 0: cover_to_coveree = dict( zip(self.robots_in_cover_formation, cycle([self.game_state.ball]))) cover_to_formation = { cover: self.robots_in_cover_formation for cover in self.robots_in_cover_formation } # If we don't have enough enemy to cover, we group the player in formation elif len(self.robots_in_cover_formation) > len(enemy_not_with_ball): cover_to_coveree = dict( zip(self.robots_in_cover_formation, cycle(enemy_not_with_ball))) cover_to_formation = {} for cover, coveree in cover_to_coveree.items(): formation = [ teamate for teamate, teamate_coveree in cover_to_coveree.items() if teamate_coveree == coveree ] cover_to_formation[cover] = formation else: cover_to_coveree = dict( zip(self.robots_in_cover_formation, enemy_not_with_ball)) cover_to_formation = { cover: [cover] for cover in self.robots_in_cover_formation } return cover_to_coveree, cover_to_formation
def is_closest_not_goalkeeper(self, player): if self.game_state.ball.is_mobile(): self.has_ball_move = True role = GameState().get_role_by_player_id(player.id) if not self.has_ball_move: return role == self.closest_role closest_players = closest_players_to_point(GameState().ball_position, our_team=True) if player == closest_players[0].player: return True return closest_players[0].player == self.game_state.get_player_by_role(Role.GOALKEEPER) \ and player == closest_players[1].player
def is_second_closest(self, player): if player == closest_players_to_point(GameState().get_ball_position(), True)[1].player: return True return False
def is_closest_not_goalkeeper(self, player): closest_players = closest_players_to_point(self.game_state.ball_position, our_team=True) if player == closest_players[0].player: return True return closest_players[0].player == self.game_state.get_player_by_role(Role.GOALKEEPER) \ and player == closest_players[1].player
def is_closest(robots, player): if player == closest_players_to_point(GameState().get_ball_position(), True, robots)[0].player: return True return False