JeuWeb - Crée ton jeu par navigateur
[PHP] Algorithme de calcul du niveau d'un joueur - 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 : [PHP] Algorithme de calcul du niveau d'un joueur (/showthread.php?tid=6658)

Pages : 1 2 3


RE: [algo php] calcul du niveau d'un joueur - Xenos - 21-02-2013

Citation :ben non, l'intérêt des suites, c'est que la formule est ultra simple et ne nécessite pas de calcul récursif :

En ce cas, la suite est exprimée sous forme de fonction: n*(n+1)/2 ou x*(x+1)/2, c'est pareil...

Si tu veux du "facilement assimilable", il suffit de donner la courbe donnant le niveau en fonction de l'expérience: ca tout le monde comprendra très bien, très vite, sans besoin de traduction, et ce même si la formule est hyper-tordue.

@niahoo: oui, mais si on a besoin de calculer l'évolution de l'expérience ou niveau au cours d'un duel qui se déroule en 100 tours, simulés "instantément", là, ca prend un peu plus d etmeps, surtout si y'a 10.000 duels par jour Wink Optimiser un peu, c'est toujours bienvenue, et ca évite de devoir basculer sur des VPS à 100€/an alors qu'on n'est même pas certain de finir son jeu.

Citation :1 + 2 + 3 + 4 + ... + n = n*(n+1)/ 2

ie :
1*2/2 = 1 xp pour avoir le niveau 1
2*3/2 = 3 xp pour avoir le niveau 2 (soit 2 xp pour passer du niveau 1 au niveau 2)
3*4/2 = 6 xp pour avoir le niveau 3 (soit 3 xp pour passer du niveau 2 au niveau 3)
4*5/2 = 10 xp pour avoir le niveau 4 (soit 6 xp pour passer du niveau 3 au niveau 4)

Cela t'oblige quand même à calculer U1..Un, pour savoir dans quel niveau tu te trouves. Une fonction marche "dans l'autre sens": a partir du nombre de points d'xp, on a immédiatement le niveau (sous forme d'un réel, on n'a plus qu'à le tronquer/arrondir suivant les gouts). Dans le cas de ton exemple de suite, la suite définit les intervalles de points d'xp qu'il faut avoir, et il faut donc procéder à un traitement supplémentaire pour savoir dans quel intervalle on se situe. Ca alourdi, et suivant les jeux, cela peut vite faire la différence (je pense à eclerd par exemple, où si on doit faire un calcul lourd pour chacun des... 20 ressources et ce pour chacun des ~20.000 batiments, ca monte très vite...


RE: [algo php] calcul du niveau d'un joueur - niahoo - 21-02-2013

Je ne sais pas comment vous faites vos jeux mais je dirais que dans la plupart des cas, on gagne de l'XP à la fin d'un duel. donc même un duel à 1 000 tours je ne ferais qu'une fois le calcul ...

Bon ensuite on peut s'écarter de ce modèle bien sûr.

Mais je trouve que la récursivité ça rend le code plus simple. Il est toujours temps d'optimiser ensuite si on en a vraiment besoin


RE: [PHP] Algorithme de calcul du niveau d'un joueur - Ter Rowan - 21-02-2013

j'avais certes pas percuté sur le fait qu'on cherchait le niveau a partir de l'xp et pas le contraire

cependant dans tous les cas, je ne vois pas l'intérêt de faire des calculs (récursif ou non) à chaque fois :


une fois pour toute en tant que développeur je définis la formule de calcul
une fois pour toute je crée un tableau indexé par le niveau qui donne le nombre de points d'xp nécessaire pour passer au niveau suivant

à chaque fois qu'un joueur gagne de l'xp, je fais le test suivant :

Code :
if ( xp_bylevel [ level ] < xp )
   level ++;

et baste
pratiquement pas de calcul, un peu de mémoire occupée (on parle d'un tableau de 100 entiers)


RE: [PHP] Algorithme de calcul du niveau d'un joueur - Xenos - 21-02-2013

C'est un choix. On peut effectivement enregistrer les résultats et les traiter ensuite, ou choisir une formule de calcul. J'aime mieux les formules, car elles évitent de faire appel à la BDD :p Après, on peut stocker les résultats dans un PHP ou dans des constantes mais alors, on ne pourra plus changer la formule de calcule (et je préfère garder la possibilité de la changer, car on si on veut sortir plusieurs "serveurs" ou "instances de jeu" d'un même jeu, il faut pouvoir faire facilement les changements).

Suivant le gameplay, l'XP pourrait aussi se gagner à chaque tour de duel.
Ce que je n'aime pas dans la récursivité, c'est qu'elle alourdis le code du point de vue du développeur. Enfin, c'est peut-être moi qui pense ainsi, mais je trouve que la récursivité ajoute des lignes de code et obscurcis assez souvent le dit code.

Mais inutile de débattre: chacun choisit suivant ses envies (comme MAC/Windows/linux ou comme la baguette vs la miche de pain)


RE: [PHP] Algorithme de calcul du niveau d'un joueur - niahoo - 21-02-2013

Qui a parlé de faire appel à la BDD ? tu fais une formule, tu calcules ton tableau et tu le gardes en mémoire, tu fais des lookup très rapides comme ça.

Si tu ajoutes des lignes de code en utilisant la récursivité à mon humble avis il y a un problème Smile

Ensuite faut un langage qui la supporte. PHP n'aimera pas trop peut-être


RE: [PHP] Algorithme de calcul du niveau d'un joueur - Xenos - 21-02-2013

Une fonction tient en une ligne, une récursivité requiert souvent quelques lignes :p Plus le test du tableau.
Si tu calcules tout le tableau pour le mettre ensuite en mémoire, soit ca occupe de la RAM (et tout langage n'a peut-être pas de mémoire persistante), soit ca requiert de faire le calcul du tableau intégral à chaque page, ce qui est plus lourd que la fonction.

Enfin, je ne crache pas sur ceux qui choisissent des tableaux, là encore, chacun prend ce qui lui plait Wink
Ce que j'aime aussi avec les fonctions, c'est qu'on peut les étudier en conception. Il est aisé d'étudier X/(X+1) pour des dérivations, des statistiques (moyennes sur une population par exemple... tiens tiens... ca rejoins un autre topic :p) ou une imbrication de fonction (par exemple, créer une fonction générale pour la consommation/production d'une unité en fonction du temps). Avec des intervalles, des suites et des éléments discrets, on tombe dans le ressort des maths discrètes et souvent, c'est très compliqué à manipuler (en tous cas, c'est très lourd car il faut souvent faire des séparations de cas).

D'où mon penchant pour les fonctions, qui se manipulent très bien sur le papier.


RE: [PHP] Algorithme de calcul du niveau d'un joueur - niahoo - 21-02-2013

(21-02-2013, 06:29 PM)Ter Rowan a écrit : une fois pour toute en tant que développeur je définis la formule de calcul
une fois pour toute je crée un tableau indexé par le niveau qui donne le nombre de points d'xp nécessaire pour passer au niveau suivant

à chaque fois qu'un joueur gagne de l'xp, je fais le test suivant :

Code :
if ( xp_bylevel [ level ] < xp )
   level ++;

et baste
pratiquement pas de calcul, un peu de mémoire occupée (on parle d'un tableau de 100 entiers)


On n'a pas dit non plus qu'une formule mathématique c'était pas top. au contraire, c'est très bien. Personnellement je préfère une formule récursive car le code est limpide, (voir ci-dessous l'exemple de fibonacci) mais une seule formule fonctionne aussi bien. Ce qu'on disait pour les perf c'est qu'une fois la fonction définie il n'est pas forcément utile de la recalculer à chaque fois, notamment parce que la montée en level ne sera pas forcément le résultat d'une seule formule. Je ne connais pas de langage utilisé sur ce forum qui ne permette pas de stocker en RAM des infos. Mais de toute façon on chipote pour quelques millièmes de secondes.

Code :
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

Maintenant, moi je suis pas fort en maths pour créer des formules, j'ai testé dans un grapheur ta formule exponentielle mais j'ai pas pu trouver une valeur de 'k' qui soit satisfaisante.

Est-ce que tu pourrais me faire une formule qui parte du niveau 1 à 0 XP et qui arrive au niveau 12 avec 1 000 000 XP et avec une forme sympa Smile ?


RE: [PHP] Algorithme de calcul du niveau d'un joueur - Xenos - 22-02-2013

N = 1+k*xp/(xp+1)
avec k = 11*(1000000+1)/1000000 soit environ k=11 (en ce cas, on a N=11.999989000011 pour xp=1.000.000)
(attention aux parenthèses)

En linéaire:
N = 1+11*xp/1.000.000
Attention: elle est non bornée


En exponentielle:
N = 1+11*(1 - exp(-xp/k))
avec k quelconque, car on n'atteindra jamais N=12, on ne pourra que s'en rapprocher (cette fonction tend vers N=12 pour x tendant vers l'infini). Quelques valeurs de N pour x=12:
- k=10.000 : 12 (due aux arrondis de calculatrice)
- k=100.000 : 11.9995
- k=1.000.000 : 7.95

Courbes correspondantes en PJ.


RE: [PHP] Algorithme de calcul du niveau d'un joueur - niahoo - 22-02-2013

Ok merci Smile

Mais par contre c'est problématique que la courbe soit bornée, parce que en gros le joueur ne peut pas atteindre le niveau 12. (bon sauf avec la linéaire mais c'est pas interessant)

oui ou bien on la borne à 13 et pis basta ... l'idée c'est qu'une fois le niveau max atteint on ne gagne plus d'XP


RE: [PHP] Algorithme de calcul du niveau d'un joueur - Xenos - 22-02-2013

Effectivement, tu peux procéder ainsi.
Une autre solution consiste à utiliser la règle de 3: choisir k, évaluer N(XP=1.000.000), et ramener la fonction pour que N(XP=1.000.000)=12, ce qui donne:


N = 1+(Nxp-1)*(1-exp(-x/k))/(1-exp(-XP/k))

Avec:
N le niveau du personnage
Nxp le niveau que l'on souhaite quand on a XP points d'expérience
XP le nombre de points d'expérience pour atteindre le niveau Nxp
k une constante arbitraire; plus elle est faible, plus les niveaux montent vite au début, plus elle est grande, plus on a besoin de points d'xp pour atteindre le niveau maximum (qui N'EST PAS Nxp)

Courbes et feuille maple en PJ.

* L'une des courbes présente le diagramme "Niveau en fonction de nombre de points d'XP", on remarque que toutes les courbes passent bien par N=12 pour XP=1000000
* L'autre présente la valeur du niveau maximum (asymptotique, c'est à dire 'atteint' pour une expérience infinie)
* Le dernier doc est la feuille Maple utilisée pour les calculs