Calculateur de classement elo

Soyez le premier à donner votre avis sur cette source.

Vue 7 206 fois - Téléchargée 339 fois

Description

Le classement Elo est très utilisé dans le monde des échecs, du jeu de go, des jeux vidéos, bref, partout où deux adversaires peuvent s'affronter.
Le but étant d'établir un classement entre les joueurs pour évaluer leur force respective et pouvoir faire jouer contre, deux entités (équipes ou joueurs), qui ne se sont jamais affrontés auparavant mais dont les forces seraient à peu près les mêmes et donc les chances de victoires similaires.
Le classement Elo permet d'arriver à ce résultat.

Source / Exemple :


/**

  • @fileOverview Calculateur de classement Elo et une fonction exemple "process" pour montrer comment l'utiliser.
  • @author Samuel GIFFARD a.k.a Mulugrutz
  • @version 1.0.42
  • /
/**
  • Le K value représente le maximum de points qu'une entité peut gagner/perdre en un match.
  • @constant
  • @type entier
  • /
var K_VALUE = 64; /**
  • La différence de classement Elo à partir de laquelle il n'est plus intéressant de jouer contre.
  • @constant
  • @type entier
  • /
var RANGE = 400; /**
  • Cette fonction sert à calculer le classement elo après un match entre
deux entités (équipe ou joueur), en connaissant le vainqueur. <br>Appelée par {@link process}. <br>Appelle {@link elo_calculator}.
  • @param {entier} elo1 Le classement Elo de la première entité
  • @param {entier} elo2 Le classement Elo de la deuxième entité
  • @param {booléen} result Si vrai, entité 1 gagne. Si faux, entité 2 gagne.
  • @returns {Tableau Associatif JS} ('new_elo1'=>xx1,'new_elo2'=>xx2,'change1'=>yy1,'change2'=>yy2) avec:
<br>new_elo1 {entier} First entity's new elo rating <br>new_elo2 {entier} Second entity's new elo rating <br>change1 {Chaîne de caractères} Le nombre de points gagnés/perdus par l'entité 1 <br>change2 {Chaîne de caractères} Le nombre de points gagnés/perdus par l'entité 2
  • /
function easy_elo(elo1,elo2,result) { return elo_calculator((result?1:0),(result?0:1),elo1,elo2); } /**
  • Cette fonction sert à calculer le classement elo après un match entre
deux entités (équipe ou joueur), en connaissant le score. <br>Appelée par {@link easy_elo} et {@link process}.
  • @param {entier} score1 Le score de la première entité
  • @param {entier} score2 Le score de la deuxième entité
  • @param {entier} elo1 Le classement Elo de la première entité
  • @param {entier} elo2 Le classement Elo de la deuxième entité
  • @returns {Tableau Associatif JS} ('new_elo1'=>xx1,'new_elo2'=>xx2,'change1'=>yy1,'change2'=>yy2) avec:
<br>new_elo1 {entier} First entity's new elo rating <br>new_elo2 {entier} Second entity's new elo rating <br>change1 {Chaîne de caractères} Le nombre de points gagnés/perdus par l'entité 1 <br>change2 {Chaîne de caractères} Le nombre de points gagnés/perdus par l'entité 2
  • /
function elo_calculator(score1,score2,e1,e2) { var elo1 = parseInt(e1); var elo2 = parseInt(e2); var e; var r = []; if(score1 != score2) // le match n'est pas une égalité, il existe un vainqueur { if(score1 > score2) // le vainqueur est l'entité 1 { e=K_VALUE-Math.round(1/(1+Math.pow(10,((elo2-elo1)/RANGE)))*K_VALUE); r['new_elo1'] = elo1 + e; r['new_elo2'] = elo2 - e; } else // le vainqueur est l'entité 2 { e=K_VALUE-Math.round(1/(1+Math.pow(10,((elo1-elo2)/RANGE)))*K_VALUE); r['new_elo1'] = elo1 - e; r['new_elo2'] = elo2 + e; } } else // le match est une égalité, il n'existe pas de vainqueur { if(elo1 == elo2) // les deux entités ont le même classement elo { r['new_elo1'] = elo1; r['new_elo2'] = elo2; } else // les deux entités n'ont pas le même classement elo { if(elo1 > elo2) // l'entité 1 a un classement elo plus élevé { e=(K_VALUE-Math.round(1/(1+Math.pow(10,((elo1-elo2)/RANGE)))*K_VALUE))-(K_VALUE-Math.round(1/(1+Math.pow(10,((elo2-elo1)/RANGE)))*K_VALUE)); r['new_elo1'] = elo1 - e; r['new_elo2'] = elo2 + e; } else // l'entité 2 a un classement elo plus élevé { e=(K_VALUE-Math.round(1/(1+Math.pow(10,((elo2-elo1)/RANGE)))*K_VALUE))-(K_VALUE-Math.round(1/(1+Math.pow(10,((elo1-elo2)/RANGE)))*K_VALUE)); r['new_elo1'] = elo1 + e; r['new_elo2'] = elo2 - e; } } } r['change1'] = ((r['new_elo1'] - elo1) > 0) ? ('+'+(r['new_elo1'] - elo1)) : ((r['new_elo1'] - elo1)+''); r['change2'] = ((r['new_elo2'] - elo2) > 0) ? ('+'+(r['new_elo2'] - elo2)) : ((r['new_elo2'] - elo2)+''); return r; } /**
  • Cette fonction est un exemple pour montrer comment utiliser le calculateur elo
<br>Appelle {@link easy_elo} et {@link elo_calculator}.
  • @param {booléen} easy Si vrai, utilise le calculateur simplifié. Si faux, utilise le calculateur complet.
  • @returns {booléen} Pour arrêter les futurs évènements, si nécessaire.
  • /
function process(easy) { // On associe des handles aux objets HTML var elo1 = document.getElementById('id_elo1'); var elo2 = document.getElementById('id_elo2'); var score1 = document.getElementById('id_score1'); var score2 = document.getElementById('id_score2'); var change1 = document.getElementById('id_change1'); var change2 = document.getElementById('id_change2'); var new_elo1 = document.getElementById('id_new_elo1'); var new_elo2 = document.getElementById('id_new_elo2'); var output = document.getElementById('id_output_text'); // On choisit quelle fonction sera exécutée plus tard (fermeture) var fnc; if(easy) { fnc = (function(){ output.innerHTML = "Le calculateur simplifié a été utilisé."; if(score1.value != score2.value) return easy_elo(elo1.value,elo2.value,(parseInt(score1.value) > parseInt(score2.value))); else return false; }); } else { fnc = (function(){ output.innerHTML = "Le calculateur complet a été utilisé."; return elo_calculator(score1.value,score2.value,elo1.value,elo2.value); }); } // On exécute la fonction sélectionnée et on stocke les résultats var r = fnc(); // Si on n'a pas utilisé le calculateur simplifié alors que le match est nul if(r !== false) { change1.innerHTML = r['change1']; change2.innerHTML = r['change2']; new_elo1.value = r['new_elo1']; new_elo2.value = r['new_elo2']; } else { output.innerHTML += "<br>Le calculateur simplifié ne marche que s'il existe un vainqueur."; change1.innerHTML = ""; change2.innerHTML = ""; new_elo1.value = ""; new_elo2.value = ""; } return false; }

Conclusion :


Cette archive zip contient 7 fichiers :
elo.fr.js Le JS français
test_elo.fr.html Le fichier exemple HTML 5 français
LISEZMOI.txt Ce fichier
elo.en.js Le JS anglais
test_elo.en.html Le fichier exemple HTML 5 anglais
README.txt Son homologue anglais
elo_calculator.png Un capture d'écran de l'exemple

Codes Sources

A voir également

Ajouter un commentaire Commentaire
Messages postés
5
Date d'inscription
vendredi 1 mai 2009
Statut
Membre
Dernière intervention
18 avril 2011

Petite précision.
Pour le range, je dis dans le commentaire qu'il s'agit de "La différence de classement Elo à partir de laquelle il n'est plus intéressant de jouer contre".
Savoir s'il est intéressant de jouer ou pas contre quelqu'un est très subjectif et les points ne sont certainement pas le facteur le plus dominant.
Alors, je vais tenter d'expliquer brièvement un peu mieux ça.

Supposons le range à 400.

Disons que j'ai 1400 points et que je joue contre quelqu'un qui a 1000 points.
Si je gagne, je vais gagner environ 9,1% du "K value" (la somme maximale que l'on peut gagner).
Si je perds, je vais perdre à peu près 91% du "K value".
Donc, pour stagner, il faudrait que je gagne 10 parties pour 1 défaite.

Les formules dans un classement de type Elo sont telles que les pourcentages vus plus haut correspondent au pourcentage de chance de gain théorique.
En partant du principe que la théorie est relativement bonne, sur un grand nombre de parties, je vais me rendre compte que contre ce joueur qui a 400 points de moins que moi, j'ai 10 fois plus de victoires que de défaites, ce qui justifie mon classement supérieur à lui de 400 points. Si j'ai légèrement plus de victoires que le "10 pour 1" alors je gagnerai petit à petit des points (jusqu'à stagner à une autre valeur). Si j'ai légèrement moins de victoires, l'inverse se produira.

Mais une chose est sûre : jouer des parties pour lesquelles j'ai plus de 90% de chance de gagner, ça remet l'intérêt des parties en question.
Et ce nombre, 91%, on le retrouvera à chaque fois que deux adversaires (ayant un classement Elo relativement stable) auront une différence de points avoisinant le "range".

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.