Skip to content

Instantly share code, notes, and snippets.

@linkgod
Created July 2, 2015 13:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save linkgod/135f20df3a86363d9a65 to your computer and use it in GitHub Desktop.
Save linkgod/135f20df3a86363d9a65 to your computer and use it in GitHub Desktop.
桌上足球Rank排名算法
var playersMap = {
"舒克": 1200,
"迟伤": 1200,
"沙陀": 1200,
"皓勋": 1200,
"圣耀": 1200,
"懂象": 1200,
"青也": 1200,
"呼荣": 1200
};
var gamelogs = [
{
victors: ['舒克', '迟伤'],
losers: ['青也', '呼荣']
},
{
victors: ['舒克', '迟伤'],
losers: ['懂象', '圣耀']
},
{
victors: ['舒克', '迟伤'],
losers: ['沙陀', '皓勋']
},
{
victors: ['舒克', '迟伤'],
losers: ['青也', '呼荣']
},
{
victors: ['舒克', '迟伤'],
losers: ['懂象', '圣耀']
},
{
victors: ['舒克', '迟伤'],
losers: ['沙陀', '皓勋']
},
{
victors: ['懂象', '圣耀'],
losers: ['青也', '呼荣']
},
{
victors: ['沙陀', '皓勋'],
losers: ['懂象', '圣耀']
},
{
victors: ['青也', '皓勋'],
losers: ['舒克', '迟伤']
},
];
function main(){
gamelogs.forEach(function(game){
rank(game.victors, game.losers)
});
}
function average(array){
if(!array || array.length === 0){
return null;
}
var sum = 0;
array.forEach(function(num){
sum += num;
});
return sum/array.length;
}
function getRanks(players){
if(!players || players.length === 0){
return null;
}
var ranks = [];
players.forEach(function(name){
ranks.push(playersMap[name]);
});
return ranks;
}
function setRanks(players, ranks){
if(!players || players.length === 0 || !ranks || ranks.length === 0){
return null;
}
ranks.forEach(function(rank, i){
playersMap[players[i]] = rank;
})
}
function rank(victors, losers){
var victorsRanks = getRanks(victors);
var victorsAverage = average(victorsRanks);
var losersRanks = getRanks(losers);
var losersAverage = average(losersRanks);
var result = rankCore(victorsAverage, losersAverage);
victorsRanks = victorsRanks.map(function(rank){
return rank + result.victorChange;
});
losersRanks = losersRanks.map(function(rank){
return rank + result.loserChange;
});
// 设置分数
setRanks(victors, victorsRanks)
setRanks(losers, losersRanks)
}
function rankCore(victor, loser){
var Evictor = 1 / ( 1 + Math.pow(10, (loser - victor)/400) );
var Eloser = 1 / ( 1 + Math.pow(10, (victor - loser)/400) );
var result = {};
result.victor = victor + 16 * ( 1 - Evictor );
result.victorChange = result.victor - victor;
result.loser = loser + 16 * ( 0 - Eloser );
result.loserChange = result.loser - loser;
return result;
}
main();
console.log(playersMap);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment