aboutsummaryrefslogtreecommitdiff
path: root/src/ladder.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ladder.py')
-rw-r--r--src/ladder.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/ladder.py b/src/ladder.py
new file mode 100644
index 0000000..8603e9d
--- /dev/null
+++ b/src/ladder.py
@@ -0,0 +1,56 @@
+from __future__ import annotations
+
+from dataclasses import dataclass
+from datetime import datetime
+
+from src.game import Game
+from src.player import Player
+from src.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",
+ )