コード例 #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 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;
        }
コード例 #3
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);
        }