static double eloWeight = 500;
static double defaultKfactor = 20;
static double defaultKfactorForAbsoluteNewPlayer = 30;
static double defaultKfactorForProPlayer = 10;
static double defaultKfactorEloRequiredForProPlayer = 2000;
static double defaultKfactorNrMatches = 30;
static double negative1 = -1;
public static void Main()
Console.WriteLine("Elo calculation");
MatchPlayed(1870, 1500, 4, 6, 30, 30);
public static void MatchPlayed(double eloPlayer1, double eloPlayer2, double scorePlayer1, double scorePlayer2, double matchesPlayedPlayer1, double matchesPlayedPlayer2)
Console.WriteLine("EloPlayer1: " + eloPlayer1);
Console.WriteLine("EloPlayer2: " + eloPlayer2);
Console.WriteLine("Match result: " + scorePlayer1 + " - " + scorePlayer2);
CalculateElo(eloPlayer1, eloPlayer2, scorePlayer1, scorePlayer2, matchesPlayedPlayer1, matchesPlayedPlayer2);
public static void CalculateElo(double eloPlayer1, double eloPlayer2, double scorePlayer1, double scorePlayer2, double matchesPlayedPlayer1, double matchesPlayedPlayer2)
double winningScore = scorePlayer1 > scorePlayer2 ? scorePlayer1 : scorePlayer2;
double losingScore = scorePlayer1 < scorePlayer2 ? scorePlayer1 : scorePlayer2;
double winningScoreResult = winningScore / (winningScore + losingScore);
double scoreResultPlayer1 = scorePlayer1 == winningScore ? winningScoreResult : (1-winningScoreResult);
double scoreResultPlayer2 = scorePlayer2 == winningScore ? winningScoreResult : (1-winningScoreResult);
Console.WriteLine("Result player1: " + scoreResultPlayer1);
Console.WriteLine("Result player2: " + scoreResultPlayer2);
double expectedScorePlayer1 = 1 / (1 + (Math.Pow(10, (eloPlayer2 - eloPlayer1) / eloWeight)));
double expectedScorePlayer2 = 1 / (1 + (Math.Pow(10, (eloPlayer1 - eloPlayer2) / eloWeight)));
Console.WriteLine("Expected result player1: " + expectedScorePlayer1);
Console.WriteLine("Expected result player2: " + expectedScorePlayer2);
double performanceScorePlayer1 = GetPlayerMatchPerformanceScore(scoreResultPlayer1, expectedScorePlayer1);
double performanceScorePlayer2 = GetPlayerMatchPerformanceScore(scoreResultPlayer2, expectedScorePlayer2);
Console.WriteLine("PerformanceScore player1: " + performanceScorePlayer1);
Console.WriteLine("PerformanceScore player2: " + performanceScorePlayer2);
double kFactorPlayer1 = GetKfactor(eloPlayer1, expectedScorePlayer1, scoreResultPlayer1, expectedScorePlayer2, matchesPlayedPlayer1);
double kFactorPlayer2 = GetKfactor(eloPlayer2, expectedScorePlayer2, scoreResultPlayer2, expectedScorePlayer1, matchesPlayedPlayer2);
Console.WriteLine("kfactor player1: " + kFactorPlayer1);
Console.WriteLine("kfactor player2: " + kFactorPlayer2);
double eloGainPlayer1 = kFactorPlayer1 * performanceScorePlayer1;
double eloGainPlayer2 = kFactorPlayer2 * performanceScorePlayer2;
Console.WriteLine("Elo gain player1: " + eloGainPlayer1);
Console.WriteLine("Elo gain player2: " + eloGainPlayer2);
public static double GetPlayerMatchPerformanceScore(double scoreResultPlayer, double expectedScorePlayer)
double performanceScore = 0;
double maxPerformanceScore = 1.5;
if (scoreResultPlayer == expectedScorePlayer)
double PerformanceDifference = (scoreResultPlayer - expectedScorePlayer);
Console.WriteLine("PerformanceDifference: " + PerformanceDifferance);
if (scoreResultPlayer >= expectedScorePlayer)
performanceScore = 1 / expectedScorePlayer * performanceScore;
performanceScore = 1 / expectedScorePlayer * (performanceScore * negative1);
Console.WriteLine("PerformanceScore: " + performanceScore);
if (performanceScore > 0 && performanceScore > maxPerformanceScore)
performanceScore = maxPerformanceScore;
else if(performanceScore < 0 && performanceScore < -maxPerformanceScore)
performanceScore = -maxPerformanceScore;
public static double GetKfactor(double playerElo, double playerExpectedScore, double playerScoreResult, double opponentExpectedScore, double matchesPlayed)
kfactor = defaultKfactorForAbsoluteNewPlayer;
else if (matchesPlayed < defaultKfactorNrMatches)
double defaultKfactorDifference = defaultKfactorForAbsoluteNewPlayer - defaultKfactor;
kfactor = defaultKfactorForAbsoluteNewPlayer - (defaultKfactorDifference * (1 / defaultKfactorNrMatches * matchesPlayed));
else if (matchesPlayed >= defaultKfactorNrMatches && playerElo >= defaultKfactorEloRequiredForProPlayer)
kfactor = defaultKfactorForProPlayer;
kfactor = defaultKfactor;