From 99f7e18c12945e9fbe22524a84a85e5733898dd2 Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Sun, 19 Feb 2023 12:47:44 +0100 Subject: refactor: Split files --- ladder.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 ladder.py (limited to 'ladder.py') diff --git a/ladder.py b/ladder.py new file mode 100644 index 0000000..b05714c --- /dev/null +++ b/ladder.py @@ -0,0 +1,55 @@ +from __future__ import annotations +from dataclasses import dataclass +from datetime import datetime +from game import Game + +from player import Player +from strategy import GameEloChangeStrategy + + +@dataclass(frozen=True) +class PlayerStatus: + player: Player + elo: int + total_games: int + + @staticmethod + def create(player: Player) -> PlayerStatus: + return PlayerStatus(player=player, elo=1000, total_games=0) + + def update_elo(self, elo_update: int) -> PlayerStatus: + return PlayerStatus( + player=self.player, + elo=self.elo + elo_update, + total_games=self.total_games + 1, + ) + + +class Ladder: + strategy: GameEloChangeStrategy + players: dict[Player, PlayerStatus] = { + player: PlayerStatus.create(player) for player in Player + } + + def current_elo(self) -> dict[Player, int]: + return { + player: player_status.elo for player, player_status in self.players.items() + } + + def proccess_game(self, game: Game) -> dict[Player, float]: + players_elo_updates = self.strategy.proccess_game(game, self.current_elo()) + + for player, elo_update in players_elo_updates.items(): + self.players[player] = self.players[player].update_elo(int(elo_update)) + + return players_elo_updates + + def print_current(self): + print(f"Ladder ({datetime.now().strftime('%d/%m/%Y %H:%M')}):") + print("=" * 30) + for rank, player in enumerate( + sorted(self.players.values(), key=lambda player: player.elo, reverse=True) + ): + print( + f"{rank+1}.\t{player.player.value:<20}: {player.elo:>4d} points, {player.total_games:>3d} games" + ) -- cgit v1.3