summaryrefslogtreecommitdiff
path: root/src/match_up/controller.py
diff options
context:
space:
mode:
authorKaran Jayachandra <mail@karanjayachandra.com>2024-11-12 18:15:29 +0100
committerKaran Jayachandra <mail@karanjayachandra.com>2024-11-12 18:15:29 +0100
commit7c0820d3d19927e695faa18cb3f5494ee39e0c77 (patch)
tree16f0c045a928a390558e81610ab8ca68e32249d8 /src/match_up/controller.py
parent7feeb30875c19a9f305e02f802e3634469349655 (diff)
Database handling added
Diffstat (limited to 'src/match_up/controller.py')
-rw-r--r--src/match_up/controller.py83
1 files changed, 42 insertions, 41 deletions
diff --git a/src/match_up/controller.py b/src/match_up/controller.py
index a21fced..3b4a6f9 100644
--- a/src/match_up/controller.py
+++ b/src/match_up/controller.py
@@ -5,6 +5,8 @@ from match_up.utilities import sample_list, Timer
from match_up.model import (
Team,
Game,
+ Player,
+ DisplayPlayer,
PlayerList,
CourtList,
MAX_LEVEL,
@@ -13,37 +15,51 @@ from match_up.model import (
def _create_placeholders(courts: dict, name: str) -> list[Game]:
- dummy_team = Team(player1=name, player2=name)
+ dummy_player = Player(first=name)
+ dummy_team = Team(
+ player1=DisplayPlayer(dummy_player), player2=DisplayPlayer(dummy_player)
+ )
games = [Game(court, dummy_team, dummy_team) for court in courts]
return games
-def _normalize_skill(players: dict, new_max: int) -> int:
- player_levels = []
- for _, player in players.items():
- skill_level = player.skill
- new_level = round((new_max - 1) * (skill_level / MAX_LEVEL)) + 1
- player_levels.append(new_level)
- return player_levels
+def _normalize_skill(level: int, new_max: int) -> int:
+ new_level = round((new_max - 1) * (level / MAX_LEVEL)) + 1
+ return new_level
-def _create_groups_of_four_players(players: dict, new_max: int) -> list[dict]:
- player_levels = _normalize_skill(players, new_max)
- identifiers = sample_list([*players], player_levels)
- clumps = []
+def _select_players(players: list[Player], count: int) -> dict:
+ identifiers = [player.id for player in players]
+ play_count = [player.count for player in players]
+ ids = sample_list(identifiers, play_count, count)
+ selected_players = [player for player in players if player.id in ids]
+ return selected_players
+
+
+def _create_groups_of_four_players(
+ players: list[Player], new_max: int
+) -> list[list[Player]]:
+ identifiers = [player.id for player in players]
+ player_levels = [_normalize_skill(player.level, new_max) for player in players]
+ identifiers = sample_list(identifiers, player_levels)
+ court_players = []
for i in range(0, len(players), PLAYER_PER_COURT):
- clumps.append(identifiers[i : i + PLAYER_PER_COURT])
- combinations = [{id: players[id] for id in clump} for clump in clumps]
- return combinations
+ court_ids = identifiers[i : i + PLAYER_PER_COURT]
+ selected_players = [player for player in players if player.id in court_ids]
+ court_players.append(selected_players)
+ return court_players
-def _create_games(courts: dict, players: list[dict], levels: int):
- grouped_players = _create_groups_of_four_players(players, levels)
+def _create_games(courts: dict, players: list[Player], levels: int):
+ court_players = _create_groups_of_four_players(players, levels)
games = []
- for court, players in zip(courts, grouped_players):
- ids = [*players]
- team1 = Team(player1=players[ids[0]].name, player2=players[ids[3]].name)
- team2 = Team(player1=players[ids[1]].name, player2=players[ids[2]].name)
+ for court, players in zip(courts, court_players):
+ team1 = Team(
+ player1=DisplayPlayer(players[0]), player2=DisplayPlayer(players[3])
+ )
+ team2 = Team(
+ player1=DisplayPlayer(players[1]), player2=DisplayPlayer(players[2])
+ )
games.append(Game(court, team1, team2))
return games
@@ -57,8 +73,7 @@ class RoundGenerator:
def __post_init__(self) -> None:
self.timer = Timer()
- self.history = {key: 0 for key, _ in self.players.get_players().items()}
- self.games = self._generate_proposal(MAX_LEVEL)[0]
+ self.games = _create_placeholders(self.courts.get_courts(), "---")
def _separate_courts(self, courts: dict) -> Tuple[dict, dict]:
possible_games = min(len(courts), self.players.get_possible_game_count())
@@ -67,20 +82,6 @@ class RoundGenerator:
unused_courts = dict(courts_as_list[possible_games:])
return used_courts, unused_courts
- def _select_players(self, count: int) -> dict:
- active_players = self.players.get_potential_players()
- identifiers = [*active_players]
- play_count = [
- (
- self.history[player_id]
- if player_id < self.players.guest_id_start
- else self.round
- )
- for player_id in active_players
- ]
- ids = sample_list(identifiers, play_count, count)
- return {player_id: active_players[player_id] for player_id in ids}
-
def _create_inactive_games(self) -> list[Game]:
active_courts, reserved_courts = self.courts.separate_courts()
reserved_games = _create_placeholders(reserved_courts, "RESERVED")
@@ -93,7 +94,8 @@ class RoundGenerator:
active_courts, _ = self.courts.separate_courts()
used_courts, _ = self._separate_courts(active_courts)
required_player_count = len(used_courts) * PLAYER_PER_COURT
- selected_players = self._select_players(required_player_count)
+ active_players = self.players.get_players()
+ selected_players = _select_players(active_players, required_player_count)
games = _create_games(used_courts, selected_players, total_levels)
return games, selected_players
@@ -117,9 +119,8 @@ class RoundGenerator:
if self.games == proposed_games or len(proposed_games) == 0:
return self.games
self.games = proposed_games
- for player_id in proposed_players:
- if player_id < self.players.guest_id_start:
- self.history[player_id] = self.history[player_id] + 1
+ identifiers = [player.id for player in proposed_players]
+ self.players.increment_game_count(identifiers)
self.proposal = tuple()
self.round += 1
self.timer.start()