示例#1
0
文件: Program.cs 项目: jonasah/elo
        static void Main(string[] args)
        {
            // delete all ratings and stats
            Console.WriteLine("Delete all ratings");
            PlayerHandler.DeleteAllPlayerSeasons();
            RatingHandler.DeleteAllRatings();

            // get all games in chronological order
            Console.WriteLine("Get games");
            var games = GameHandler.GetGamesAfter(int.MinValue, SortOrder.Ascending);

            // calculate new ratings
            Console.WriteLine($"Calculate new ratings for {games.Count} games");
            var completed = 0;

            foreach (var game in games)
            {
                Ratings.CalculateNewRatings(game);

                ++completed;
                Console.Write($"\rProgress: {completed}/{games.Count} ({completed / (double)games.Count:P1})");
            }

            Console.WriteLine();
        }
示例#2
0
        public IEnumerable <Head2HeadRecord> GetHead2HeadRecords(
            [FromRoute(Name = "player")] string playerName,
            [FromRoute(Name = "season")] string seasonName)
        {
            var player = PlayerHandler.GetPlayerByName(playerName);
            var season = SeasonHandler.GetSeason(seasonName);

            if (player == null || season == null)
            {
                return(new Head2HeadRecord[0]);
            }

            var games = GameHandler
                        .GetGamesByPlayer(playerName, SortOrder.Descending)
                        .FindAll(g => season.IsActive(g.Created));

            var ratings = RatingHandler.GetRatingsByPlayerAndSeason(player, season)
                          .Where(pr => pr.GameId != null)
                          .ToDictionary(pr => pr.GameId);

            return(games
                   .SelectMany(g => g.Scores.Where(gs => gs.Player.Name != playerName))
                   .GroupBy(gs => gs.Player) // group by opponent
                   .Select(g => new Head2HeadRecord
            {
                Opponent = g.Key.Name,
                Wins = g.Count(gs => gs.Loss),                                          // player's wins are losses for opponent
                Losses = g.Count(gs => gs.Win),                                         // player's losses are wins for opponent
                RatingChange = Math.Round(g.Sum(gs => ratings[gs.GameId].RatingChange)) // summing player's rating changes
            })
                   .OrderBy(h2h => h2h.Opponent));
        }
示例#3
0
        public bool DeleteGame(int id)
        {
            try
            {
                // get the game
                var game = GameHandler.GetGame(id);

                if (game == null)
                {
                    throw new ArgumentException("No such game");
                }

                // delete the game (incl game scores and player ratings)
                GameHandler.DeleteGame(game);

                // delete ratings from later games
                RatingHandler.DeleteRatingsAfter(game.PlayerRatings[0].Id, deleteDefaultRatings: false);

                // reset current ratings in PlayerSeasons
                var lastPlayerRatings    = RatingHandler.GetLatestRatingsPerPlayerSeason();
                var updatedPlayerSeasons = lastPlayerRatings
                                           .Where(pr => !pr.PlayerSeason.Season.HasEnded(game.Created)) // current and future seasons
                                           .Select(pr =>
                {
                    var playerSeason           = pr.PlayerSeason;
                    playerSeason.Season        = null;
                    playerSeason.Rating        = pr.Rating;
                    playerSeason.RatingChange  = pr.RatingChange;
                    playerSeason.Wins          = pr.Wins;
                    playerSeason.Losses        = pr.Losses;
                    playerSeason.CurrentStreak = pr.CurrentStreak;
                    return(playerSeason);
                })
                                           .ToList();

                PlayerHandler.UpdatePlayerSeasons(updatedPlayerSeasons.Where(ps => ps.GamesPlayed > 0));
                PlayerHandler.DeletePlayerSeasons(updatedPlayerSeasons.Where(ps => ps.GamesPlayed == 0));

                // get all games after the deleted game
                var games = GameHandler.GetGamesAfter(game.Id, SortOrder.Ascending);

                // recalculate ratings
                games.ForEach(g => Ratings.CalculateNewRatings(g));

                // delete players with no games
                var players = PlayerHandler.GetAllPlayers()
                              .Where(p => p.Seasons.Count == 0);
                PlayerHandler.DeletePlayers(players);

                return(true);
            }
            catch (Exception /*ex*/)
            {
                return(false);
            }
        }
示例#4
0
        private static PlayerSeason GetOrCreatePlayerSeason(Player player, Season season)
        {
            var playerSeason = player.Seasons.Find(ps => ps.SeasonId == season.Id);

            if (playerSeason == null)
            {
                playerSeason = PlayerHandler.AddPlayerSeason(new PlayerSeason
                {
                    PlayerId = player.Id,
                    SeasonId = season.Id
                });

                // add default rating
                RatingHandler.AddRating(playerSeason.CreatePlayerRating());
            }

            return(playerSeason);
        }
示例#5
0
        public static void CalculateNewRatings(Game game)
        {
            // fetch players from database
            var winningPlayer = PlayerHandler.GetPlayerById(game.WinningGameScore.PlayerId);
            var losingPlayer  = PlayerHandler.GetPlayerById(game.LosingGameScore.PlayerId);

            // fetch active seasons
            var activeSeasons = SeasonHandler.GetActiveSeasons(game.Created);

            foreach (var season in activeSeasons)
            {
                var winningPlayerSeason = GetOrCreatePlayerSeason(winningPlayer, season);
                var losingPlayerSeason  = GetOrCreatePlayerSeason(losingPlayer, season);

                // convert to Elo.Lib.Players and calculate new ratings
                var winner = winningPlayerSeason.ToEloLibPlayer();
                var loser  = losingPlayerSeason.ToEloLibPlayer();
                winner.WinsAgainst(loser);

                // update current ratings
                winningPlayerSeason.RatingChange = winner.Rating - winningPlayerSeason.Rating;
                winningPlayerSeason.Rating       = winner.Rating;
                ++winningPlayerSeason.Wins;
                winningPlayerSeason.CurrentStreak = Math.Max(winningPlayerSeason.CurrentStreak + 1, 1);

                losingPlayerSeason.RatingChange = loser.Rating - losingPlayerSeason.Rating;
                losingPlayerSeason.Rating       = loser.Rating;
                ++losingPlayerSeason.Losses;
                losingPlayerSeason.CurrentStreak = Math.Min(losingPlayerSeason.CurrentStreak - 1, -1);

                // add new ratings
                var winningPlayerRating = winningPlayerSeason.CreatePlayerRating(game.Id);
                var losingPlayerRating  = losingPlayerSeason.CreatePlayerRating(game.Id);

                // update database
                PlayerHandler.UpdatePlayerSeasons(winningPlayerSeason, losingPlayerSeason);
                RatingHandler.AddRatings(winningPlayerRating, losingPlayerRating);
            }
        }
 public void Beforetest()
 {
     _ratingHandler = new RatingHandler();
 }
示例#7
0
 public ReviewController(VideoAssignHandler assignHandler, RatingHandler ratingHandler, CategoryHandler categoryHandler)
 {
     this.assignHandler   = assignHandler;
     this.ratingHandler   = ratingHandler;
     this.categoryHandler = categoryHandler;
 }