public static PlayersRatingList GetPlayersRating(int gameTypeId, DateTime date) { PlayersRatingList players = new PlayersRatingList(); CompetitionsList competitions = new CompetitionsList(); BuildRatingSystem(gameTypeId, players, competitions, date); #if FEDITION foreach (PlayerRating player in players.Values) { if (player.LastRatingDate != DateTime.MinValue) { player.Rating -= (RatingSystem.GetMonthCount(player.LastRatingDate, date) / 3) * 25; } } #endif return(players); }
/// <summary> /// Посторение рейтинговой системы и расчет рейтинга /// </summary> public static void BuildRatingSystem(int gameTypeId, PlayersRatingList players, CompetitionsList competitions, DateTime date) { // Загрузить список игроков с начальным рейтингом TA.DB.Manager.DatabaseManager.CurrentDb.ReadPlayerRatingList(gameTypeId, players); #if FEDITION // Загрузить результаты по порядку возрастания даты TA.DB.Manager.DatabaseManager.CurrentDb.ReadRatingCompetitionList(gameTypeId, competitions, date); // Пересчитать рейтинги для каждого турнира по мере возрастания даты foreach (CompetitionInfo comp in competitions) { if (comp.IsRating) { int avg_rating = 0; foreach (PlayersCompetitionResult result in comp.Results.Values) { PlayerRating player = players[result.PlayerId]; // 1 - Посчитать штрафы за пропуск в зависимости от даты турнира и даты из списка игроков if (player.LastRatingDate != DateTime.MinValue) { result.Penalty = (RatingSystem.GetMonthCount(player.LastRatingDate, comp.Date) / 3) * 25; } // 2 - Расчитать начальный рейтинг (Рейтинг из списка - штраф) result.RatingBegin = player.Rating - result.Penalty; avg_rating += result.RatingBegin; } foreach (PlayersCompetitionResult result in comp.Results.Values) { PlayerRating player = players[result.PlayerId]; // 4 - Расчитать дельту для кажого игрока result.Delta = Convert.ToInt32(Math.Round(10.0 * (result.Points - result.OpponentsCount * RatingSystem.Pexp(result.RatingBegin - result.AvgOppRating(comp.Results))))); // 5 - Обновить рейтинг и дату в списке игроков player.Rating = result.RatingBegin + result.Delta; player.LastRatingDate = comp.Date; } } } #endif }