File "elo.php"

Full Path: /home/analogde/www/download/CHESS_2022/elo.php
File size: 3.97 KB
MIME-type: text/x-php
Charset: 8 bit

<?php

	// on fixe une cote au dpart, tous les joueurs ont la mme
	
	//  cote_nouvelle = cote_ancienne + K.(resultat - estimation) 

	// resultat = 1  -> J1 gagne
	// resultat = 0  -> J1 perd
	// resultat = 0.5  -> match nul
	
	// K permet de rgler la vitesse d'augmentation ou de diminution du rang du joueur
	// si le rang < 1000 , on progresse vite
	// si  le range [1000, 2000], on progresse normalement
	// la progression devient faible si > 2000
	
	
	//
	//
	//
	//  estimation = 1 /  1 + 10 exp ( ( elo advsersaire - elo joueur) / 400  ) 
 
	define('elo_1', 2000);
	define('elo_2', 2000);
	// Score du match P1 VS P2
	// 1 : P1 gagne
	// 0 : P1 perd
	// 0.5 : match nul
	define('SCORE',0);
 
/****************************************************************************/ 
// Calcul de la probabilit de gagner du joueur J1
function estimation($elo_1, $elo_2)
{
	$exp = ($elo_2 - $elo_1) / 400;
	return (1/ (1 + pow(10,$exp)));
}
/****************************************************************************/ 
// Calcul de la nouvelle cote du joueur J1
function calcul_elo_J1($elo_1, $elo_2, $score)
{
	$k = facteur_k($elo_1);
	$estimation = estimation($elo_1, $elo_2);
	$nouveau_rang = $elo_1 + $k * ($score - $estimation);
 
	// si la cote devient trop petite < 300, on la clamp  cette valeur 
	if ($nouveau_rang < 300)
	{
		$nouveau_rang = 300;
	}
 
	return array($nouveau_rang, $estimation);
}
/****************************************************************************/ 
// valeur de K en fonction de la cote du joueur
function facteur_k($elo)
{
	if($elo < 1000)
	{
		$k = 80;
	}
 
	if($elo >= 1000 AND $elo < 2000)
	{
		$k = 50;
	}
 
	if ($elo >= 2000 AND $elo <= 2400)
	{
		$k = 30;
	}
 
	if ($elo > 2400)
	{
		$k = 20;
	}
 
	return $k;
}
/****************************************************************************/ 
 /*
// Calcul des nouvelles cotes de P1 et P2
// score = 1 si P1 gagne
// score = 0 si P1 perd
// score = 0.5 s'il y a match nul
*/
 
function nouveau_rangs($elo_1, $elo_2, $score)
{
	// Score pour P2 VS P1
	$score_2 = 1 - $score;
 
	$calcul_J1 = calcul_elo_J1($elo_1, $elo_2, $score);
	$estimation_J1 = $calcul_J1[1];
	$elo_J1 = round($calcul_J1[0]);
 
	$calcul_J2 = calcul_elo_J1($elo_2, $elo_1, $score_2);
	$estimation_J2 = $calcul_J2[1];
	$elo_J2 = round($calcul_J2[0]);
 
	return array($elo_J1, $elo_J2, $estimation_J1, $estimation_J2);
}
/****************************************************************************/ 
function afficher_difference($nb)
{
	if ($nb >= 0)
	{
		$nb = '+'.$nb;
	}
 
	return $nb;
}
/****************************************************************************/ 
function convertir_pourcentage($nb)
{
	return round($nb * 100, 2).' %';
}
/****************************************************************************/ 
function resultat_partie($score)
{
		if($score == 1)
		{
			return 'J1 gagne';
		}
 
		if($score == 0)
		{
			return 'J2 gagne';
		}
 
		if ($score == 0.5)
		{
			return 'Match nul';
		}
}
 /****************************************************************************/ 
// Traitement des rsultats

// score = 1 si P1 gagne
// score = 0 si P1 perd
// score = 0.5 s'il y a match nul

	

	$retour = nouveau_rangs(elo_1, elo_2, SCORE);
	$elo_J1 = $retour[0];
	$elo_J2 = $retour[1];
	$estimation_J1 = $retour[2];
	$estimation_J2 = $retour[3];
 
	$difference_J1 = afficher_difference($elo_J1 - elo_1);
	$difference_J2 = afficher_difference($elo_J2 - elo_2);
  
/****************************************************************************/ 
/****************************************************************************/ 
/****************************************************************************/ 

echo '
		<h3>cote initiale</h3>
		
		<br/>
		<hr />
		<br />
		<h3>Rsultat de la partie - '.resultat_partie(SCORE).'</h3>

		J1 : '.$elo_J1.' (variation : '.$difference_J1.'). Probabilit de gagner : '.convertir_pourcentage($estimation_J1).'.<br>
		J2 : '.$elo_J2.' (variation : '.$difference_J2.'). Probabilit de gagner : '.convertir_pourcentage($estimation_J2).'.';
		
?>