在线angular.js游戏的评级系统

时间:2015-04-12 02:33:21

标签: javascript rating-system

我正在开发一个使用Angular js构建的在线游戏门户网站。我希望我的玩家在赢得/输掉比赛时的评分会提高。我该如何实现?如果if能在纯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
}

4 个答案:

答案 0 :(得分:3)

循环播放你的玩家。如果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作为数组的索引,那么会更简单。那你就不需要循环了。

答案 1 :(得分:0)

怎么样:

players = {James: 100, Matt: 200, Tara: 300}

function updateScores(winner, loser) {
  players[winner]++;
  players[loser]--;
}

updateScores("James", "Tara");

答案 2 :(得分:0)

只需在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;
       }
   }

答案 3 :(得分:0)

ELO评级系统在这里是可能的。这样做的好处是玩家的点数变化会因两个玩家之间的分差而有所不同。

http://en.wikipedia.org/wiki/Elo_rating_system

玩家B在玩B时的期望(获胜)计算如下: E_A = 1 /(1 + 10 ^((R_B-R_A)/ 400))。 (根据初始评级差异,其范围在0和1之间)。如果B获胜,那么他们的评分会增加你选择的k因子&#39; (你希望你的玩家的收视率有多快调整)*这个期望和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);
};