Система рейтингов для онлайн-игры 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");