PageRenderTime 41ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/Source/rencontre/elo.php

https://gitlab.com/Potatoes_IIE/projet_web
PHP | 352 lines | 250 code | 45 blank | 57 comment | 73 complexity | 12831e92a8f972a4dcc187b7748c6287 MD5 | raw file
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Arthur
  5. * Date: 06/04/2016
  6. * Time: 14:52
  7. */
  8. class rencontre extends database
  9. {
  10. private $K= /**décommenter selon la valeurs/ le poids de la compétition**/
  11. 15; /**classique**/ //il faudra surement créer une nouvelle classe pour chaque compétition
  12. //40; /**tournoi**/
  13. //60; /**ligue**/
  14. /**usage: connection à la BDD
  15. * match constructor.
  16. */
  17. function __construct()
  18. {
  19. parent::__construct();
  20. }
  21. /**
  22. * @return int
  23. */
  24. function getK()
  25. {
  26. return $this->K;
  27. }
  28. /* fonction qui nous permet d'avoir la différence de points (en valeur absolue) pour un match entre $pseudo1 et $pseudo2 */
  29. /* j'ai aussi ajouté une requete dans "lautre sens" pour que alex VS potatoes soit traité pareil que potatoes VS alex */
  30. function getDiffPoint($pseudo1, $pseudo2)
  31. {
  32. $sql1 = "SELECT pts1,pts2 FROM rencontre_attente WHERE pseudo1 ='$pseudo1' AND pseudo2='$pseudo2'";
  33. $sql2 = "SELECT pts1,pts2 FROM rencontre_attente WHERE pseudo1 ='$pseudo2' AND pseudo2='$pseudo1'";
  34. $res1 = $this->query($sql1);
  35. $res2 = $this->query($sql2);
  36. if ($row = pg_fetch_row($res1)) {
  37. if (pg_num_rows($res1) == 2) {
  38. return abs($row[0] - $row[1]);
  39. }
  40. }
  41. if ($row = pg_fetch_row($res2)) {
  42. if (pg_num_rows($res2) == 2) {
  43. return abs($row[0] - $row[1]);
  44. }
  45. }
  46. return false;
  47. }
  48. function setNbelo($pseudo, $newelo)
  49. {
  50. $sql = "UPDATE joueur SET nb_elo='$newelo' WHERE pseudo ='$pseudo'";
  51. $res = $this->query($sql);
  52. if ($row = pg_fetch_row($res)) {
  53. if (pg_num_rows($res) == 1) {
  54. return true;
  55. }
  56. }
  57. return false;
  58. }
  59. /* fonction pour obtenir les points elo de 2 joueurs */
  60. function getElo2($pseudo1, $pseudo2)
  61. {
  62. $j1 = $this->getElo($pseudo1);
  63. $j2 = $this->getElo($pseudo2);
  64. return [$j1, $j2];
  65. }
  66. function getDiffElo($pseudo1,$pseudo2){
  67. $elo = $this->getElo2($pseudo1,$pseudo2);
  68. return $elo[0]-$elo[1];
  69. }
  70. /** calcul le delta Elo d'un match
  71. * @param $delta
  72. * @param $diffElo
  73. * @return int
  74. */
  75. function calculDiffElo($delta,$diffElo){
  76. $K=$this->getK();
  77. if($delta<2){
  78. return $K*(1-(1/(1+10**(-$diffElo/400))));
  79. }
  80. elseif($delta==2){
  81. return $K*(1+(1/2))*(1-(1/(1+10**(-$diffElo/400))));
  82. }
  83. elseif($delta==3){
  84. return $K*(1+(3/4))*(1-(1/(1+10**(-$diffElo/400))));
  85. }
  86. else {
  87. return $K*(1+(3/4)+(($delta-3)/8))*(1-(1/(1+10**(-$diffElo/400))));
  88. }
  89. }
  90. /** récupère la proba de gagner de pseudo 1 contre pseudo 2
  91. * @param $pseudo1
  92. * @param $pseudo2
  93. * @return int
  94. */
  95. function getGain($pseudo1, $pseudo2){
  96. $K=$this->getK();
  97. $diffLElo = $this->getDiffElo($pseudo1,$pseudo2);
  98. return 1-($this->calculDiffElo(1,$diffLElo)/$K);
  99. }
  100. /**fonction qui a l'issue d'une rencontre, modifie les pts elo des joueurs en conséquence de l'issue du match
  101. * pseudo1=gagnant pseudo2=perdant
  102. * @param $pseudo1
  103. * @param $pseudo2
  104. * @requires : pseudo1 est le gagnant
  105. * @return bool
  106. */
  107. function setMatch($pseudo1, $pseudo2)
  108. {
  109. /* on recupere les nombre elo de chacun des joueurs */
  110. $elo1 = $this->getElo($pseudo1);
  111. $elo2 = $this->getElo($pseudo2); /* on calcule la difference de buts dans le match */
  112. $diffpts = $this->getDiffPoints($pseudo1, $pseudo2);
  113. /* on calcule le nb de pts elo a ajouter/enlever au gagnant/perdant */
  114. $diffelo = ceil($this->calculDiffElo($diffpts, $this->getDiffElo($pseudo1, $pseudo2)));
  115. /* nouvelle affectation des nb_elo */
  116. $elo1 = $elo1 + ($diffelo);
  117. $elo2 = $elo2 - ($diffelo);
  118. if ($elo1 < 0) {
  119. $elo = 0;
  120. } //on limite le score minimal à 0
  121. elseif ($elo2 < 0) {
  122. $elo2 = 0;
  123. }
  124. /* MAJ dans la BDD */
  125. $sql = "UPDATE joueur set nb_elo='$elo1' WHERE pseudo ='$pseudo1'";
  126. $sql2 = "UPDATE joueur set nb_elo='$elo2' WHERE pseudo ='$pseudo2'";
  127. $res = $this->query($sql);
  128. $res2 = $this->query($sql2);/* verification bonne execution */
  129. if ($row = pg_fetch_row($res) && $row2 = pg_fetch_row($res2)) {
  130. if (pg_num_rows($res) == 1 && pg_num_rows($res2) == 1) {
  131. return true;
  132. }
  133. }
  134. return false;
  135. }
  136. /* ici commence l'implémentation pour traiter les match par equipes */
  137. /* change le nb de pts elo d'un jour dans toute les équipe ou il est */
  138. function setPts_elo_j1($pseudo, $newelo)
  139. {
  140. $sql = "UPDATE equipe SET pts_elo_j1='$newelo' WHERE joueur1 ='$pseudo' ";
  141. $sql2 = "UPDATE equipe SET pts_elo_j='$newelo' WHERE joueur2 ='$pseudo' ";
  142. $res = $this->query($sql);
  143. $res2 = $this->query($sql2);
  144. if ($row = pg_fetch_row($res)) {
  145. if (pg_num_rows($res) == 2) {
  146. return true;
  147. }
  148. }
  149. }
  150. function setPts_elo_j2($pseudo, $newelo)
  151. {
  152. $sql = "UPDATE equipe SET pts_elo_j2='$newelo' WHERE pseudo ='$pseudo'";
  153. $res = $this->query($sql);
  154. if ($row = pg_fetch_row($res)) {
  155. if (pg_num_rows($res) == 1) {
  156. return true;
  157. }
  158. }
  159. }
  160. /* permet d'obtenir l'ID de l'quipe en fonction des joueurs qui la compose */
  161. function getIdEquipe($pseudo1, $pseudo2)
  162. {
  163. $sql1 = "SELECT id FROM equipe WHERE joueur1='$pseudo1' AND joueur2='$pseudo2'";
  164. $sql2 = "SELECT id FROM equipe WHERE joueur1='$pseudo2' AND joueur2='$pseudo1'";
  165. $res1 = $this->query($sql1);
  166. $res2 = $this->query($sql2);
  167. if ($row = pg_fetch_row($res1)) {
  168. if (pg_num_rows($res1) == 1) {
  169. return ($row[0]);
  170. }
  171. }
  172. if ($row = pg_fetch_row($res2)) {
  173. if (pg_num_rows($res2) == 1) {
  174. return ($row[0]);
  175. }
  176. }
  177. }
  178. /* fonction qui renvoie le nombre elo total d'une equipe ( alex & jordan ou jordan & alex), via l'id unique */
  179. function getEloEquipe($id)
  180. {
  181. $sql1 = "SELECT pts_elo_j1,pts_elo_j2 FROM equipe WHERE id='$id'";
  182. $res1 = $this->query($sql1);
  183. if ($row = pg_fetch_row($res1)) {
  184. if (pg_num_rows($res1) == 2) {
  185. return (0.5 * ($row[0] + $row[1]));
  186. }
  187. }
  188. return false;
  189. }
  190. /* fonction similaire mais qui utilise une jointure ! */
  191. function getEloEquipe2($pseudo1,$pseudo2)
  192. {
  193. $sql1 = "SELECT nb_elo FROM equipe JOIN joueur ON equipe.joueur1 = joueur.pseudo WHERE pseudo='$pseudo1'";
  194. $sql2 = "SELECT nb_elo FROM equipe JOIN joueur ON equipe.joueur2 = joueur.pseudo WHERE pseudo='$pseudo2'";
  195. $res1 = $this->query($sql1);
  196. $res2 = $this->query($sql2);
  197. if ($row = pg_fetch_row($res1) && $row2= pg_fetch_row($res2)) {
  198. if (pg_num_rows($res1) == 1 && pg_num_rows($res2)) {
  199. return (0.5 * ($row[0] + $row2[0]));
  200. }
  201. }
  202. return false;
  203. }
  204. /* fonction qui renvoie la difference de points dans un match : equipe 1 VS equipe 2 ou equipe 2 VS equipe 1 */
  205. function getDiffPointEquipe($id1, $id2)
  206. {
  207. $sql1 = "SELECT pts_equipe_1,pts_equipe_2 FROM rencontre_equipe WHERE id_equipe1 ='$id1' AND pseudo2='$id2'";
  208. $sql2 = "SELECT pts_equipe_1,pts_equipe_2 FROM rencontre_equipe WHERE id_equipe2 ='$id2' AND pseudo2='$id1'";
  209. $res1 = $this->query($sql1);
  210. $res2 = $this->query($sql2);
  211. if ($row = pg_fetch_row($res1)) {
  212. if (pg_num_rows($res1) == 2) {
  213. return abs($row[0] - $row[1]);
  214. }
  215. }
  216. if ($row = pg_fetch_row($res2)) {
  217. if (pg_num_rows($res2) == 2) {
  218. return abs($row[0] - $row[1]);
  219. }
  220. }
  221. return false;
  222. }
  223. /* fonction qui a l'issue d'une rencontre, modifie les pts elo des joueurs en conséquence de l'issue du match par équipe */
  224. /* pseudo1 et pseudo2 = gagnant pseudo 3 et pseudo4 = perdant */
  225. function setMatchEquipe($pseudo1, $pseudo2, $pseudo3, $pseudo4)
  226. {
  227. /* on recupere les ID des 2 équipes */
  228. $id_equipe1 = $this->getIdEquipe($pseudo1, $pseudo2);
  229. $id_equipe2 = $this->getIdEquipe($pseudo3, $pseudo4);
  230. /* on recupere le nb elo associé a chaque equipe */
  231. $eloequipe1 = $this->getEloEquipe($id_equipe1);
  232. $eloequipe2 = $this->getEloEquipe($id_equipe2);
  233. /* on recupere la différence de pts du match */
  234. $diffpts = $this->getDiffPointsEquipe($id_equipe1, $id_equipe2);
  235. /* on calcul la difference de pts elo entr les 2 equipes */
  236. $diff_pts_elo = abs($eloequipe2 - $eloequipe1);
  237. /* on calcul le nb de pots elo a ajouter/enlever au gagnant/perdant */
  238. $diffelo = $this->calculDiffElo($diffpts, $diff_pts_elo);
  239. /* on fait les nouvelles affecation des points elo */
  240. $eloequipe1 = $eloequipe1 + ($diffelo);
  241. $eloequipe2 = $eloequipe2 - ($diffelo);
  242. if ($eloequipe1 < 0) {
  243. $eloequipe1 = 0;
  244. } //on limite le score minimal à 0
  245. elseif ($eloequipe2 < 0) {
  246. $eloequipe2 = 0;
  247. }
  248. /* on recupere les nb elo de tout les joueurs pour midifier les points elo des joueurs des equipes */
  249. $elo1 = $this->getElo($pseudo1);
  250. $elo2 = $this->getElo($pseudo2);
  251. $elo3 = $this->getElo($pseudo3);
  252. $elo4 = $this->getElo($pseudo4);
  253. /* on les modifie en les pondérant */
  254. $elo1 = $elo1 + $diffelo * ($elo2 / $eloequipe1); /* + pour les gagants */
  255. $elo2 = $elo2 + $diffelo * ($elo1 / $eloequipe1);
  256. $elo3 = $elo3 - $diffelo * ($elo3 / $eloequipe2); /* - pour les perdants */
  257. $elo4 = $elo4 - $diffelo * ($elo4 / $eloequipe2);
  258. /* MAJ dans la BDD table joueur et table equipe*/
  259. $sql0="UPDATE equipe SET pts_elo_j1=$elo1 WHERE id='$id_equipe1'";
  260. $sql00="UPDATE equipe SET pts_elo_j2=$elo3 WHERE id='$id_equipe1'";
  261. $sql000="UPDATE equipe SET pts_elo_j1= $elo3 WHERE id='$id_equipe2'";
  262. $sql0000="UPDATE equipe SET pts_elo_j2=$elo4 WHERE id='$id_equipe2'";
  263. $sql11 = "UPDATE joueur set nb_elo='$elo1' WHERE pseudo ='$pseudo1'";
  264. $sql12 = "UPDATE joueur set nb_elo='$elo2' WHERE pseudo ='$pseudo2'";
  265. $sql21 = "UPDATE joueur set nb_elo='$elo3' WHERE pseudo ='$pseudo3'";
  266. $sql22 = "UPDATE joueur set nb_elo='$elo4' WHERE pseudo ='$pseudo4'";
  267. $res0 = $this->query($sql0);
  268. $res00 = $this->query($sql00);
  269. $res000 = $this->query($sql000);
  270. $res0000 = $this->query($sql0000);
  271. $res11 = $this->query($sql11);
  272. $res12 = $this->query($sql12);
  273. $res21 = $this->query($sql21);
  274. $res22 = $this->query($sql22);
  275. /* verif bonne execution des 8 requetes d'update */
  276. if ( $row0 = pg_fetch_row($res0) && $row00 = pg_fetch_row($res00) && $row000 = pg_fetch_row($res000) &&
  277. $row0000 = pg_fetch_row($res0000) && $row = pg_fetch_row($res11)
  278. && $row2 = pg_fetch_row($res12)
  279. && $row3 = pg_fetch_row($res21) && $row4 = pg_fetch_row($res22)) {
  280. if (pg_num_rows($res11) == 1 && pg_num_rows($res12) == 1 && pg_num_rows($res21) == 1 && pg_num_rows($res22) == 1 &&
  281. pg_num_rows($res0) == 1 && pg_num_rows($res00) == 1 && pg_num_rows($res000) == 1 && pg_num_rows($res0000) == 1) {
  282. return true;
  283. }
  284. }
  285. return false;
  286. }
  287. /* fonction qui fait pareil que exportStatEquipe mais qui traite les match par equipe */
  288. function exportStatEquipe($pseudo1, $pseudo2)
  289. {
  290. $id = $this->$this->getIdEquipe($pseudo1,$pseudo2);
  291. $sql="SELECT pts_elo_j1, pts_elo_j2 FROM equipe WHERE pseudo='$id'";
  292. $res=$this->query($sql);
  293. if($row= pg_fetch_row($res)){
  294. if(pg_num_rows($res) == 1){
  295. $sql2="INSERT INTO evo_elo(id,joueur,date,pts_elo) VALUES (,$pseudo1,CURRENT_DATE,$row[0])";
  296. $sql22="INSERT INTO evo_elo(id,joueur,date,pts_elo) VALUES (,$pseudo2,CURRENT_DATE,$row[1])";
  297. $res2=$this->query($sql22);
  298. if ($row2= pg_fetch_row($res2)) {
  299. if (pg_num_rows($res2) == 1) {
  300. return true;
  301. }
  302. }
  303. }
  304. }
  305. return false;
  306. }
  307. }