如何根据比分查找 1v1 比赛中的评分?

How to find rating in a 1v1 match based on the score?

所以我正在开发一款游戏,其中将有两名玩家都有初始评级。

现在,我想根据他们的分数计算新的评分。

例如:如果 player1 得分 50(无单位)并且 player2 得分 30,那么 player1 评分应该增加更多其中 player1 得分 40player2 得分 30 并以很大优势获胜。

Elo 评分系统只考虑输赢,不考虑赢利。

如有任何帮助,我们将不胜感激。

score1player1的分数,score2player2的分数。因此评级的变化将​​是 abs(score1 - score2) / x,其中 x 是您可以更改的变量。假设您使用 JavaScript,这里是评分计算的完整代码。

评级的变化现在取决于评级的差异:

function calcRating() {
  var i = 1;
  var score1 = document.getElementById('score1').value;
  var score2 = document.getElementById('score2').value;
  var player1 = document.getElementById('player1').value;
  var player2 = document.getElementById('player2').value;
  var a = player1;
  var b = player2;
  
  if (score1 > score2) {
      if (player1 > player2) {
        player1 = a - (0 - Math.round((score1 - score2) / (i * (Math.abs(player1 - player2)))));
        player2 = b - Math.round((score1 - score2) / (i * (Math.abs(player1 - player2))));
      }
      else if (player1 < player2) {
        player1 = a - (0 - Math.round((score1 - score2) / (i / (Math.abs(player1 - player2)))));
        player2 = b - Math.round((score1 - score2) / (i / (Math.abs(player1 - player2))));
      }
      else {
        player1 = a - (0 - Math.round((score1 - score2) / i));
        player2 = b - Math.round((score1 - score2) / i);
      }
  } 
  else if (score1 < score2) {
    if (player1 > player2) {
        player1 = a - Math.round(Math.abs((score1 - score2)) / (i * (Math.abs(player1 - player2))));
        player2 = b - (0 - Math.round(Math.abs(score1 - score2) / (i * (Math.abs(player1 - player2)))));
    }              
      else if (player1 < player2) {
        player1 = a - Math.round(Math.abs(score1 - score2) / (i / (Math.abs(player1 - player2))));
        player2 = b - (0 - Math.round(Math.abs(score1 - score2) / (i / (Math.abs(player1 - player2)))));
      }
      else {
        player1 = a - Math.round(Math.abs(score1 - score2) / i);
        player2 = b - (0 - Math.round(Math.abs(score1 - score2) / i));

      }
  }
    document.getElementById('score1').value = 0;
    document.getElementById('score2').value = 0;
    document.getElementById('player1').value = player1;
    document.getElementById('player2').value = player2;
}
<button id="button" onclick='calcRating()'>Click to calculate ratings</button>

<br> Player1 score: <input type="text" id="score1" value="0"></input>

<br> Player2 score: <input type="text" id="score2" value="0"></input>

<br> Player1 rating: <input type="text" id="player1" value="0"></input>
<br> Player2 rating: <input type="text" id="player2" value="0"></input>

您可以随意修改 HTML 中的输入以手动更改评分和分数,以及 x,这是在附加之前分数差异除以的数字更改评分值。

一个简单的解决方案是:将获胜玩家的评分提高 abs(player1.score - player2.score),将失败者的评分降低相同的数值。

我建议稍微修改此方法以使其更健壮,例如:10*ln(abs(player1.score - player2.score))

编辑

定义: S(X) = score after X matchesE(X) = elo after X matches。我们有兴趣计算S(X+1).

S(X+1) = S(X) + k*(E(X+1)-E(X))*ln(abs(player1.score - player2.score)).

这里,k 是一个常量,可以通过反复试验进行调整。该模型同时考虑了评级差异(通过 elo)和分数差异。