tournament_generator.py
TournamentGenerator
¶
Generates rounds and their matches.
Attributes:
| Name | Type | Description |
|---|---|---|
player |
dict[Player] |
Dict of participating players. |
__init__(self, players)
special
¶
Constructor for TournamentGenerator.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
players |
dict |
Dict of participating players. |
required |
Source code in controller/tournament_generator.py
def __init__(self, players: dict[Player]):
"""Constructor for TournamentGenerator.
Args:
players (dict[Player]): Dict of participating players.
"""
self.players = players
generate_first_round(self)
¶
Generates the first round following Swiss-system.
Returns:
| Type | Description |
|---|---|
list[Match] |
List of generated matches. |
Source code in controller/tournament_generator.py
def generate_first_round(self):
"""Generates the first round following Swiss-system.
Returns:
list[Match]: List of generated matches.
"""
matches = []
sorted_players = self.sort_by_elo()
for i in range(0, int(len(self.players) / 2)):
matches.append((sorted_players[i], sorted_players[i + int(len(self.players) / 2)]))
return matches
generate_other_round(self, matches, leaderboard)
¶
Generates one round, other than the first one, following Swiss-system.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
matches |
list |
List of past matches. |
required |
leaderboard |
dict |
Current leaderboard. |
required |
Returns:
| Type | Description |
|---|---|
list[Match] |
List of generated matches. |
Source code in controller/tournament_generator.py
def generate_other_round(self, matches: list[Match], leaderboard: dict):
"""Generates one round, other than the first one, following Swiss-system.
Args:
matches (list[Match]): List of past matches.
leaderboard (dict): Current leaderboard.
Returns:
list[Match]: List of generated matches.
"""
matches = []
sorted_players = self.sort_by_points(leaderboard=leaderboard)
while len(sorted_players) != 0:
for opponent in range(1, len(sorted_players)):
id_1 = sorted_players[0]
id_2 = sorted_players[opponent]
player_1 = DatabaseHandler().helper.get_player_object_from_id_str(player_id=id_1)
player_2 = DatabaseHandler().helper.get_player_object_from_id_str(player_id=id_2)
if not self.players_have_already_met(matches=matches, id_1=id_1, id_2=id_2):
matches.append((player_1, player_2))
del sorted_players[0]
del sorted_players[opponent - 1]
break
return matches
player_object_from_id(self, player_id)
¶
Searches through participating players for given unique id.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
player_id |
str |
Player's unique id to be searched. |
required |
Returns:
| Type | Description |
|---|---|
Player |
Corresponding Player object. |
Source code in controller/tournament_generator.py
def player_object_from_id(self, player_id: str):
"""Searches through participating players for given unique id.
Args:
player_id (str): Player's unique id to be searched.
Returns:
Player: Corresponding Player object.
"""
for player in self.players:
if player.id_num == int(player_id):
return player
players_have_already_met(self, matches, id_1, id_2)
¶
Searches through a list of matches for an already existing match between the two given players.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
matches |
list |
List of players pairing, corresponding to past matches. |
required |
id_1 |
str |
First player unique id. |
required |
id_2 |
str |
Second player unique id. |
required |
Returns:
| Type | Description |
|---|---|
bool |
Players have already met. |
Source code in controller/tournament_generator.py
def players_have_already_met(self, matches: list[tuple[Player]], id_1: str, id_2: str):
"""Searches through a list of matches for an already existing match between the two given players.
Args:
matches (list[tuple[Player]]): List of players pairing, corresponding to past matches.
id_1 (str): First player unique id.
id_2 (str): Second player unique id.
Returns:
bool: Players have already met.
"""
player_1_vs_player_2 = (int(id_1), int(id_2))
player_2_vs_player_1 = (int(id_2), int(id_1))
if player_1_vs_player_2 in matches:
return True
elif player_2_vs_player_1 in matches:
return True
else:
return False
sort_by_elo(self)
¶
Sorts players by their ELO ranking.
Returns:
| Type | Description |
|---|---|
list[Player] |
List of players ordered by ELO (ascending). |
Source code in controller/tournament_generator.py
def sort_by_elo(self):
"""Sorts players by their ELO ranking.
Returns:
list[Player]: List of players ordered by ELO (ascending).
"""
return sorted(self.players, key=lambda x: x.elo)
sort_by_points(self, leaderboard)
¶
Sort players from a leaderboard by points.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
leaderboard |
dict |
Dict of players to be sorted. |
required |
Returns:
| Type | Description |
|---|---|
list[Player] |
List of players ordered by points (descending). |
Source code in controller/tournament_generator.py
def sort_by_points(self, leaderboard: dict):
"""Sort players from a leaderboard by points.
Args:
leaderboard (dict): Dict of players to be sorted.
Returns:
list[Player]: List of players ordered by points (descending).
"""
return sorted(leaderboard, key=leaderboard.get, reverse=True)