static double eloWeight = 400;
static double defaultKfactor = 25;
static double defaultKfactorForAbsoluteNewPlayer = 50;
static double defaultKfactorForProPlayer = 15;
static double defaultKfactorEloRequiredForProPlayer = 2000;
static double defaultKfactorNrMatches = 30;
static double defaultKfactorMinScoreResult = 0.1;
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 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 newEloPlayer1 = eloPlayer1 + (kFactorPlayer1 * ( scoreResultPlayer1 - expectedScorePlayer1 ) );
double newEloPlayer2 = eloPlayer2 + (kFactorPlayer2 * ( scoreResultPlayer2 - expectedScorePlayer2 ) );
newEloPlayer1 = newEloPlayer1 >= 0 ? newEloPlayer1 : 0;
newEloPlayer1 = newEloPlayer2 >= 0 ? newEloPlayer1 : 0;
Console.WriteLine("New elo player1: " + newEloPlayer1);
Console.WriteLine("New elo player2: " + newEloPlayer2);
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;
double kfactorBonusPercentage = (1 - (1 / playerExpectedScore * playerScoreResult));
kfactorBonusPercentage = kfactorBonusPercentage >= 0 ? kfactorBonusPercentage : kfactorBonusPercentage * negative1;
kfactorBonusPercentage = kfactorBonusPercentage > 1 ? 1 : kfactorBonusPercentage;
kfactor += 10 * kfactorBonusPercentage;