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 Add(ScoreTeam team) { if (teams == null) { teams = new List <ScoreTeam>(); } teams.Add(team); teams = teams.OrderByDescending(i => i.score).ToList(); if (teams.Count > GameManager.Instance.MaxLeaderBoardTeams) { teams = teams.GetRange(0, GameManager.Instance.MaxLeaderBoardTeams); } }
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); }
private void TransformPlayers(Ladder ladder, Dictionary <string, LadderStanding> playerStandings, Games.Team team, ScoreTeam scoreTeam) { foreach (var player in team.Players) { var scorePlayer = new ScorePlayer(player.UserId); // TODO: This makes individual queries, optimize //var standing = this.unitOfWork.Ladders.GetUserStanding(ladder.Id, player.UserId); var standing = this.unitOfWork.GetGenericRepository <LadderStanding>() .Query() .FirstOrDefault(x => x.LadderId == ladder.Id && x.UserId == player.UserId); if (standing != null) { Log.Info().Message("Found ladder standing for {0} {1}", ladder.Id, player.UserId).Write(); // Player has already competed in this ladder scorePlayer.Rating = standing.Rating; scorePlayer.Vol = standing.Vol; scorePlayer.Rd = standing.Rd; } playerStandings.Add(player.UserId, standing); scoreTeam.Players.Add(scorePlayer); } }