JeuWeb - Crée ton jeu par navigateur
Créer un classement - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Créer un classement (/showthread.php?tid=7500)



Créer un classement - xanthius - 11-11-2015

Bonsoir,
actuellement sur la réalisation d'un jeu de gestion de compagnie aérienne je me retrouve devant un petit soucis de taille. Réaliser un petit classement des compagnies en fonction de leurs bénéfices journaliers.
Le soucis vient du fait de l'attribution du rang pour le joueur, basiquement, je dois m'y prendre comment ? Vous auriez des pistes ?

Imaginons que j'ai 3 joueurs :
- le 1 er dégage un bénéfice de 100
- le 2 eme de 300
et enfin le dernier de 90

comment faire ? Ca doit être tout bête mais là sur le coup je n'ai pas d'idée Confused
Résolue ! j'ai mis un compteur ! merci Smile


RE: Créer un classement - Xenos - 11-11-2015

[edit]
En fait, j'ai l'impression d'avoir pas lu la question ("L'attribution du rang").
Ce rang n'est normalement pas nécessaire: quand le joueur demande "les joueurs du 314e au 420e" alors le rang est simplement calculé à la volée lors de l'affichage, soit via un compteur dans une boucle for (for ($rang=314; ($row=$mysqli->fetch_array()); $rang++)) soit via l'index du résultat si tous les résultats sont traités d'un coup (foreach ($pdo->fetch_all() as $i=>$row) { $rang = 314+$i; /* ... traitement de la ligne $row ...*/ }).

Après, on peut aussi le faire dans le SGBD, via ce genre de trick (je trouve cette approche plus élégante même):
Code :
SELECT (@r:=@r+1) AS rang, j.*
FROM joueurs_stats AS j, (SELECT @r:=314) AS ranking
LIMIT 106 OFFSET 314

-- Ok, "de 314 à 420", j'ai un peu abusé, d'autant que souvent
-- on cherche le classement "des 20 joueurs à partir du 500e" par exemple



Si t'as ces informations dans la BDD, alors le classement est un simple tri des lignes que cette BDD te renvoie:

Code :
SELECT * FROM joueurs_stats
ORDER BY joueurs_stats.benefices ASC LIMIT 10 OFFSET 500 -- Du 500e au 510e

Si ce sont des valeurs calculées à la volée, je te conseillerai de les stocker en BDD:

Code :
SELECT * FROM joueurs
INNER JOIN joueurs_benefices ON joueurs_benefices.id_joueur=joueurs.id
ORDER BY SUM(joueurs_benefices.valeur) ASC LIMIT 10 OFFSET 500 -- Du 500e au 510e

Ce genre de requête pouvant être très lourd, le mieux est alors d'avoir une table stockant les bénéfices réalisés par chaque joueur pour la journée (par exemple) et de piocher le classement dans cette table.

Après, à l'affichage, il faut simplement proposer une numérotation de page (ou assimilée) et afficher ces résultats du N au N+k eme

Dans tous les cas, c'est au SGBD de faire le travail de tri et d'ordonnancement: évite de le faire dans le langage client (genre dans PHP) pour des raisons de lourdeur et de lenteur (cela obligerait PHP à lire inutilement toute la BDD par exemple).


RE: Créer un classement - xanthius - 11-11-2015

Bonsoir,
au tout début je procédé de la sorte (dernière requête) mais l'utilisant à la fois pour afficher le classement et sur le profil du joueur je trouvais cela lourd. Du coup j'ai opté pour l'autre solution.
Je procède au calcul du classement du joueur une fois par jour et son classement je l'enregistre dans la bdd. Du coup quand les joueurs veulent voir le classement je ne fais qu'une simple selection et non de grosse requête avec jointure.
Le seul soucis c'est que je ne savais pas comment assigner un rang au joueur car j'utilisais un tri mais c'est bon j'ai réussi avec le compteur Smile !


RE: Créer un classement - Ruetasilitu - 29-11-2015

En début d'année il y avait un site pour faire celà, mais il n'était pas très cool.
Malheureusement je ne le trouve plus, alors est il la encore parmis nous ? Je ne pourrais le dire,mais une chause est sure c'est qu'il y en avait un !

Bonne journée