JeuWeb - Crée ton jeu par navigateur
[Resolu] Calcul d'un bonus joueur suivant son niveau - 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 : [Resolu] Calcul d'un bonus joueur suivant son niveau (/showthread.php?tid=6599)



[Resolu] Calcul d'un bonus joueur suivant son niveau - starmindfr - 17-01-2013

bonjour

Apres quelques recherches j'ai du mal a trouver une formule de calcul à intégrer donc je passe ici voir si une bonne âme charitable dispose d'une solution Smile

J'ai donc des joueurs avec un niveau de 1 a l'infini (ne voulant pas trop bloquer les joueurs). Ils ont de l'xp et gagnent 1 nouveau tous les 100xp

Ils ont un "bonus" sur le temps des réparation en fonction de leur niveau.

Comme les niveaux ne sont pas bloqués il faut donc un système qui prennent en compte cela et ne dépasse pas un certain % final.

par exemple niveau 1 ils gagnent 5% sur le temps total de réparation en secondes, niveau 2 : 5% + 4 % niveau 3 = 5% + 4% + 3% etc ... pour approcher par exemple 70% max pour les gros niveaux...

comment concrétiser cette formule dans un script comme du php ?

---
Et pour la version plus complète de l'histoire :
Le joueur embauche un "mécano" pour réparer son robot. L’intérêt du mécano est de ne pas payer les réparation, mais en revanche il y a une durée de réparation, qui est réduite grâce au niveau du mécano. Le niveau n'est pas bloqué et continu a monter avec le temps. Afin de ne pas aller sur des durées fantaisistes il me semble donc nécessaire que la réduction de temps tende vers un bonus max de 80%, que l'on approche de plus en plus lentement au fil des niveaux.
---

j'ai bien fait l'ebauche d'un calcul mais j'ai des doutes :
D = durée en secondes des reparations exemple 60
N = niveau du mecano exemple 100

soit une formule genre : (D/70)*((N/N+1)*D) = 41.58 secondes de gain
merci d'avance :$


RE: calcul d'un bonus joueur suivant son niveau - Xenos - 17-01-2013

Salut,

Il faut voir ca en terme de maths. Tu cherches une fonction f, qui au niveau N associe un facteur k d'accélération des réparations. La fonction de calcul de la vitesse V de réparation est alors définie par V = V0 * k où V0 est la vitesse de base, et V la vitesse de réparation.
Dans l'idée, la fonction f respecte les conditions suivantes:
- f(0) = 1, de sorte que V0 soit la vitesse de réparation lorsque le joueur est de niveau 0
- f continue, pour qu'il n'y ai pas de fossé entre deux niveaux
- f croissante strictement, de sorte que le facteur k(N) > k(N+1), autrement dit, le facteur augmente quand le niveau augmente

Une condition supplémentaire envisageable est la suivante:
- f est bornée (par K)

Elle n'est pas nécessaire. En effet, si le niveau est très grand, alors k est très grand, donc la vitesse V aussi, et le temps T (T = L / V) tendra vers 0, ce qui n'est pas une abération (ca en serai une si on avait la possibilité d'un temps négatif par exemple). Mais si tu veux une vitesse maximale Vmax, il faudra borner f par K = Vmax/V0.

Partant de là, il existe des formules simples:
- f = exp(N) ou f = p^N où p est une valeur de base quelconque; attention: cette fonction "monte" de plus en plus vite
- f = 1+p*N, la plus simple, mais peut-être ennuyeuse pour les joueurs car trop "monotone"
- f = 1+log(N), sa croissance ralentie, donc plus on gagne en niveaux, moins cela impact la vitesse finale
- f = 1+N^p, suivant p, la croissance de f varie (si p>1, f croit de plus en plus vite, si p < 1, f croit de moins en moins vite)

Tu peux combiner ces fonctions (f=n²+n+1 par exemple).
C'est un choix à faire de ton coté, suivant les équilibres de ton jeu.

Pour ma part, je te conseille de déterminer, via un graphique, la progression de niveaux possible au cours du temps (aka, à l'inscription on est niveau 0, 1 mois après on peut être niveau 5, après 1 an on est niveau 40 environs, après 10 ans, on est niveau 300 etc). Connaissance la durée de vie de ton jeu, tu sauras quelle est le niveau "maximum" que les joueurs les plus agueris pourront atteindre. Tu pourras alors aisément fixer f pour que, une fois ce niveau atteind, le joueur n'ai pas des avantages trop importants.

Concernant la proposition T = (D/70)*(N/(N+1)*D), il y a une aberration:
T = D²/70*N/(N+1)
Si N=0, on a T = 0... Si ta fonction est f = N/(N+1), alors f(0) = 0 et f est croissante, donc plus on a un niveau élevé (N augmente), plus le temps est long? O.o
Si D est la durée des réparations, D² est en secondes au carré. f est un coefficient (pas d'unité), donc 70 doit être en secondes, sinon, on aurait un soucis d'unité (le temps T est en secondes, et il est égale au produit secondes²*pas d'unité*pas d'unité, donc secondes = secondes²? O.o)


RE: calcul d'un bonus joueur suivant son niveau - starmindfr - 17-01-2013

Bonjour merci bien pour cette explication je vais voir comment transposer cela en php. Sinon en effet ma formule ne fonctionne pas et tend à augmenter le nombre de secondes avec le niveau tout en necessitant un N+1/N+2) c'est juste un exemple de ce que je passe facilement en script. J'ai vu que certaines méthodes mathématiques sont aussi supportées.

Je me baserais bien sur la 1+log(N) pour finaliser la ligne du script. Pour les bornes, je pense que 70% de reduction du temps et un niveau moyen de 50 pour la majorité, 100 a 150 pour les "mecanos" les plus anciens est assez raisonable, leur cout journalier dissuadant les joueurs de les entrainer au dela.


RE: calcul d'un bonus joueur suivant son niveau - Xenos - 18-01-2013

log(0) n'existe pas, tu auras un soucis au niveau 0. log(1) = 0 en revanche, donc il s'agirai en fait de

1+log(N+1)

Les valeurs, de N=0 à N=5: 1, 1.30, 1.47, 1.60, 1.70, 1.78...
1+log(51) = 2.7
1+log(151) = 3.18
Or 70%, de reduction, c'est 30% conservés, donc, un facteur de 3.18 correspond.


RE: calcul d'un bonus joueur suivant son niveau - starmindfr - 18-01-2013

merci en effet j'ai fait quelques tests et tout a l'air de fonctionner ,au final c'est une durée en minutes, et j'ai modifier avec un*15 histoire d'avoir un délais plus raisonnable :

$duree = ($duree/(1+log(($niveau+1)))*15);

ce qui me donne par exemple 4h30 avec un level 20 pour une petite réparation. J'ajusterais le *15 par la suite suivant les tests dans le jeu.