在线 angular.js 游戏的评级系统
Ratings system for online angular.js game
我正在开发一个使用 Angular js 构建的在线游戏门户。我希望我的玩家在 win/lose 一场比赛中获得更高的评分。我该如何实施?如果可以让这个在纯 JS 中工作,那么我认为它可以适应我的应用程序。画出我想要的:
var players = [
{
id: 1,
name: "James",
rating: 100
},
{
id: 2,
name: "Matt",
rating: 200
},
{
id: 3,
name: "Tara"
rating: 300
]
UpdateRating = function(winnerId, LoserId){
//changes these players ratings
}
循环播放你的播放器。如果 ID 与给定 ID 之一匹配,则更新评级。
function updateRating(winnerId, loserId) {
for (var i = 0; i < players.length; i++) {
var p = players[i];
if (p.id == winnerId) {
p.rating++;
} else if (p.id == loserId) {
p.rating--;
}
}
}
如果您将 players
设为一个以玩家 ID 为键的对象,或者使用玩家 ID 作为数组的索引,会更简单。那么你就不需要循环了。
怎么样:
players = {James: 100, Matt: 200, Tara: 300}
function updateScores(winner, loser) {
players[winner]++;
players[loser]--;
}
updateScores("James", "Tara");
只需循环遍历 players
数组并为匹配的用户更新 属性 rating
UpdateRating = function(winnerId, LoserId){
for(var i = 0; players.length; i++){
if(players[i].id === winnerId)
players[i].rating = players[i].rating + 10;
else if(players[i].id === LoserId)
players[i].rating = players[i].rating - 10;
}
}
ELO 评级系统在这里是可能的。这样做的好处是球员积分变化会根据两名球员之间的积分差异而有所不同。
http://en.wikipedia.org/wiki/Elo_rating_system
玩家 A 在玩 B 时的(获胜)期望计算如下:
E_A = 1/ (1 + 10^((R_B - R_A)/400))。 (根据初始评级差异,这介于 0 和 1 之间)。如果 B 赢了,那么他们的评分会增加您选择的 'k factor'(您希望玩家的评分调整的速度)* 按此预期,而 A 的评分会减少相应的数量。我实际上在我的 JS 游戏网站上实现了这个。玩家可以画你的游戏吗?如果没有,这是我为您的示例改编的代码。
var kFactor = 15; (adjust this according to how quickly you want ratings to adapt, lower number --> adapts more quickly).
function EloRatingCalc(winner, loser, players) {
var winElo = winner.rating;
var loseElo = loser.rating;
var qw = Math.pow(10,(winElo/400));
var ql = Math.pow(10,(loseElo/400));
var lossExpectation = ql/(ql+qw);
winner.rating += parseInt(kFactor*lossExpectation);
loser.rating -= parseInt(kFactor*lossExpectation);
};
我正在开发一个使用 Angular js 构建的在线游戏门户。我希望我的玩家在 win/lose 一场比赛中获得更高的评分。我该如何实施?如果可以让这个在纯 JS 中工作,那么我认为它可以适应我的应用程序。画出我想要的:
var players = [
{
id: 1,
name: "James",
rating: 100
},
{
id: 2,
name: "Matt",
rating: 200
},
{
id: 3,
name: "Tara"
rating: 300
]
UpdateRating = function(winnerId, LoserId){
//changes these players ratings
}
循环播放你的播放器。如果 ID 与给定 ID 之一匹配,则更新评级。
function updateRating(winnerId, loserId) {
for (var i = 0; i < players.length; i++) {
var p = players[i];
if (p.id == winnerId) {
p.rating++;
} else if (p.id == loserId) {
p.rating--;
}
}
}
如果您将 players
设为一个以玩家 ID 为键的对象,或者使用玩家 ID 作为数组的索引,会更简单。那么你就不需要循环了。
怎么样:
players = {James: 100, Matt: 200, Tara: 300}
function updateScores(winner, loser) {
players[winner]++;
players[loser]--;
}
updateScores("James", "Tara");
只需循环遍历 players
数组并为匹配的用户更新 属性 rating
UpdateRating = function(winnerId, LoserId){
for(var i = 0; players.length; i++){
if(players[i].id === winnerId)
players[i].rating = players[i].rating + 10;
else if(players[i].id === LoserId)
players[i].rating = players[i].rating - 10;
}
}
ELO 评级系统在这里是可能的。这样做的好处是球员积分变化会根据两名球员之间的积分差异而有所不同。
http://en.wikipedia.org/wiki/Elo_rating_system
玩家 A 在玩 B 时的(获胜)期望计算如下: E_A = 1/ (1 + 10^((R_B - R_A)/400))。 (根据初始评级差异,这介于 0 和 1 之间)。如果 B 赢了,那么他们的评分会增加您选择的 'k factor'(您希望玩家的评分调整的速度)* 按此预期,而 A 的评分会减少相应的数量。我实际上在我的 JS 游戏网站上实现了这个。玩家可以画你的游戏吗?如果没有,这是我为您的示例改编的代码。
var kFactor = 15; (adjust this according to how quickly you want ratings to adapt, lower number --> adapts more quickly).
function EloRatingCalc(winner, loser, players) {
var winElo = winner.rating;
var loseElo = loser.rating;
var qw = Math.pow(10,(winElo/400));
var ql = Math.pow(10,(loseElo/400));
var lossExpectation = ql/(ql+qw);
winner.rating += parseInt(kFactor*lossExpectation);
loser.rating -= parseInt(kFactor*lossExpectation);
};