Система рейтингов для онлайн-игры angular.js

Я работаю над порталом онлайн-игр, созданным с помощью Angular JS. Я хочу, чтобы у моих игроков были рейтинги, которые увеличиваются, когда они выигрывают / проигрывают игру. Как мне это реализовать? Если бы можно было заставить это работать в чистом 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 ответа

Решение

Рейтинговая система 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" (насколько быстро вы хотите, чтобы рейтинг вашего игрока корректировался) * на это ожидание, и рейтинг 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);
};

Проходите через ваших игроков. Если идентификатор соответствует одному из указанных идентификаторов, обновите рейтинг.

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 объект, ключи которого были идентификаторами игрока, или использовали идентификатор игрока в качестве индекса в массиве. Тогда вам не понадобится петля.

Просто используйте цикл через 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;
       }
   }

Как насчет:

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

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

updateScores("James", "Tara");
Другие вопросы по тегам