public void Calculate1vs1() { // Arrange var winningTeam = new ScoreTeam() { Players = { new ScorePlayer("42", 1500, 200.0, 0.06) } }; var losingTeam = new ScoreTeam() { Players = { new ScorePlayer("23", 1400, 81.0, 0.06) } }; // Act 1 var updatedTeams = new Glicko2().Calculate(winningTeam, losingTeam); this.AssertEqualEpsilon(1562.1819, updatedTeams.First().Players.First().Rating); this.AssertEqualEpsilon(176.4211, updatedTeams.First().Players.First().Rd); this.AssertEqualEpsilon(1385.90212, updatedTeams.Last().Players.Last().Rating); this.AssertEqualEpsilon(80.1919, updatedTeams.Last().Players.Last().Rd); }
public void Score(Ladder ladder, Games.Game game) { if (game.LadderScored.HasValue && game.LadderScored.Value) { throw new DomainException(ErrorCode.GameAlreadyScored, $"Game {game.Id} already scored"); } var playerStandings = new Dictionary <string, LadderStanding>(); var winningTeam = game.Teams.First(x => x.Players.First().Outcome == Enums.PlayerOutcome.Won); var otherTeams = game.Teams.Where(t => t != winningTeam); // Score winners var winningScoreTeam = new ScoreTeam(); TransformPlayers(ladder, playerStandings, winningTeam, winningScoreTeam); // Score losers var otherScoreTeams = new List <ScoreTeam>(); foreach (var otherTeam in otherTeams) { var otherScoreTeam = new ScoreTeam(); TransformPlayers(ladder, playerStandings, otherTeam, otherScoreTeam); otherScoreTeams.Add(otherScoreTeam); } // Calculate new ratings for each player var result = new Glicko2() .Calculate(winningScoreTeam, otherScoreTeams.ToArray()) .SelectMany(x => x.Players) .ToDictionary(x => x.Id); foreach (var user in game.Teams.SelectMany(t => t.Players.Select(x => x.User))) { var data = result[user.Id]; bool hasWon = winningTeam.Players.Any(x => x.UserId == user.Id); this.UpdatePlayerRating(ladder, playerStandings[user.Id], user, data.Rating, data.Vol, data.Rd, hasWon); } game.LadderScored = true; }
public void Calculate4PlayerFFA() { var winningTeam = new ScoreTeam() { Players = { new ScorePlayer("A", 1500, 200.0, 0.06), new ScorePlayer("B", 1500, 200.0, 0.06) } }; var losingTeam = new ScoreTeam() { Players = { new ScorePlayer("A", 1500, 200.0, 0.06), new ScorePlayer("B", 1500, 200.0, 0.06) } }; var result = new Glicko2().Calculate(winningTeam, losingTeam); }