如何根据比分查找 1v1 比赛中的评分?
How to find rating in a 1v1 match based on the score?
所以我正在开发一款游戏,其中将有两名玩家都有初始评级。
现在,我想根据他们的分数计算新的评分。
例如:如果 player1
得分 50
(无单位)并且 player2
得分 30
,那么 player1
评分应该增加更多其中 player1
得分 40
,player2
得分 30
并以很大优势获胜。
Elo 评分系统只考虑输赢,不考虑赢利。
如有任何帮助,我们将不胜感激。
设score1
为player1
的分数,score2
为player2
的分数。因此评级的变化将是 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 matches
和 E(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)和分数差异。
所以我正在开发一款游戏,其中将有两名玩家都有初始评级。
现在,我想根据他们的分数计算新的评分。
例如:如果 player1
得分 50
(无单位)并且 player2
得分 30
,那么 player1
评分应该增加更多其中 player1
得分 40
,player2
得分 30
并以很大优势获胜。
Elo 评分系统只考虑输赢,不考虑赢利。
如有任何帮助,我们将不胜感激。
设score1
为player1
的分数,score2
为player2
的分数。因此评级的变化将是 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 matches
和 E(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)和分数差异。