begin process at 2012 05 28 12:43:54
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > CALCULATEUR DE CLASSEMENT ELO

CALCULATEUR DE CLASSEMENT ELO


 Description

Cliquez pour voir la capture en taille normale
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

  • /**
  • * @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;
  • }
/**
 * @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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

Source avec Zip Source avec une capture SLIDESHOW IMAGES ET TEXTES EN PUR JAVASCRIPT par ansuzpeorth
Source avec Zip INPUT TEXT AUTOMATIQUE CREATION SUPPRESSION par lycanges
Source avec Zip Source avec une capture TABLE_SV : TABLEAU DYNAMIQUE, MONTRER/CACHER COLONNE SUR DEM... par synanceia
COLONNES ADAPTABLES EN HAUTEUR par dronoide
Source avec Zip VECTEURS ET MATRICES: OUTILS GRAPHIQUES UTILES par william voirol

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [PC] PRÉFÉRENCES : CLASSEMENT par Bul3
Source avec Zip Source avec une capture SELECTION DE VALEURS A PARTIR DE 2 LISTES À CHOIX MUPLIPLES par ryosama
Source avec Zip SYSTÈME DE NOTATION PAR ÉTOILES par Scraat

Commentaires et avis

Commentaire de Mulugruntz le 25/03/2010 05:24:31

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".

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

aide à la saisie avec un popup [ par lucsa ] bonjour, je me met au javascript et j'ai quelque soucis.je souhaite afficher un popup si l'on click dans champ de saisie (input type=text). ce popoup aide à la saisie avec un popup [ par lucsa ] bonjour, je me met au javascript et j'ai quelque soucis.je souhaite afficher un popup si l'on click dans champ de saisie (input type=text). ce popoup lecture d'un fichier sous javascript! [ par Themistocle ] bonjour &#224; tous!j'ai un (petit) souci, (et de grosses lacunes) en javascript.j'ai mis en ligne un site internet, sur le jeu d'&#233;checs, et j'ar Classement [ par Marmalade ] Bon voila,&nbsp; Je ne suis pas tr&#232;s bon en informatique mais je veut me faire un site.J'aurais besoin d'un code html pour faire un classement au Classement alphanumérique [ par tipouic ] Je suis actuellement entrain de faire un gestionnaire en "hta" et j'aimerais bien faire un trie alphanumérique suivant un champ précis. Mes données so classement derniers echanges [ par bultez ] bonjour à toutes et à tous,je ne sais pas si ça améliorerait réellement le site,   mais pouvoir classer les derniers écha changer une partie du texte d un calque automatiquement [ par bubbledesavon ] bonjour, je vous expose mon petit souci ,.je gere un petit site d'un club ,ou je met en permanence les classement a jour,mais le souci ,c'est que les Confirm et Submit [ par jumano ] Bonsoir,J'ai sur une page un fomulaire avec un champs permettat ou non de choisir un classement.Si aucun classement n'a été choisi, une fenêtre de con Créer Tableau de classement de foot [ par mariodessuti ] Bonjour,je suis nouveau sur ce site et je sais pas du tout où placer mon sujet.alors voilà :j'aimerais créer un classement de foot pour mon site.comme Classement d'une liste de DIV [ par m0rdreck ] Bonjour a tous, Je suis entrain de créer un site web, et j'aurais voulu dans mon administration faire le classement des nouveauté par exemple par le


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,808 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales