calc_scores.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from game_info import GameInfo
  2. from games import Game
  3. K = 20
  4. Guaranteed_score = round(K / 2.5)
  5. def get_elo_change(rating1: int, rating2: int, win: bool):
  6. ea = 1 / (1 + 10 ** ((rating2 - rating1) / 400))
  7. return K * (int(win) - ea)
  8. def calc_scores(game: Game):
  9. WIN = True
  10. LOSE = False
  11. # Для каждой команды рассчитываем средний рейтинг
  12. # Затем её выигрыш или проигрыш по отношению ко всем другим и суммируем результат
  13. # Каждому участнику команды добавляем очки результата
  14. # Рассчитаем изменения рейтингов для всех игроков
  15. avgs = []
  16. for i in range(len(game.teams)):
  17. our_rating = game.teams[i].get_average_rating()
  18. sum = 0
  19. for j in range(len(game.teams)):
  20. if i > j:
  21. # мы проигрываем этой команде
  22. their_rating = game.teams[j].get_average_rating()
  23. sum += get_elo_change(our_rating, their_rating, LOSE)
  24. if i < j:
  25. # мы выигрываем у этой команды
  26. their_rating = game.teams[j].get_average_rating()
  27. sum += get_elo_change(our_rating, their_rating, WIN)
  28. avg = sum / len(game.teams)
  29. avgs.append(avg)
  30. # Применим изменения
  31. for i in range(len(avgs)):
  32. for meta in game.teams[i].get_players():
  33. player = meta.player
  34. leader = meta.leader
  35. # Подсчёт статистики
  36. player.games_count += 1
  37. if i == 0:
  38. # Выигрыш партии
  39. if len(game.teams[0].get_players()) == 1:
  40. player.personal_wins += 1
  41. else:
  42. player.team_wins += 1
  43. change = round(avgs[i] + Guaranteed_score) # Изменение рейтинга
  44. if player.highest_score_take[0] < change:
  45. player.highest_score_take = [change, game.index]
  46. if player.highest_score_loss[0] > change:
  47. player.highest_score_loss = [change, game.index]
  48. # Изменить рейтинг
  49. player.rating += change
  50. player.rating = round(player.rating)
  51. # Статистика пикового значения очков
  52. player.peak_score = max(player.rating, player.peak_score)
  53. # история изменений
  54. player.changes_history.append({'game_id': game.index,
  55. 'rating_change': change})
  56. # для лидера и нации добавляем запись об игре
  57. game_info = GameInfo(game.index, player.index, leader.index, leader.nation.index, i == 0, change, i + 1)
  58. player.games_info.append(game_info)
  59. leader.games_info.append(game_info)
  60. leader.nation.games_info.append(game_info)