コード例 #1
0
        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);
        }
コード例 #2
0
 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);
     }
 }
コード例 #3
0
        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;
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
            }
        }