from typing import Protocol from game import Game from player import Player class GameEloChangeStrategy(Protocol): def proccess_game( self, game: Game, current_elo: dict[Player, int] ) -> dict[Player, float]: ... class SimpleEloChangeStrategy(GameEloChangeStrategy): D = 400 K = 32 def proccess_game( self, game: Game, current_elo: dict[Player, int] ) -> dict[Player, float]: players_elo_updates = {player: 0.0 for player in game.scores} for player_1, score_1 in game.scores.items(): for player_2, score_2 in game.scores.items(): if player_1 != player_2: expected_score = 1 / ( 1 + 10 ** ((current_elo[player_2] - current_elo[player_1]) / self.D) ) result = ( 1.0 if score_1 > score_2 else 0.0 if score_1 < score_2 else 0.5 ) players_elo_updates[player_1] += self.K * (result - expected_score) return players_elo_updates