Retour décroissant simple avec capuchon

19

Problème

Le joueur obtient 5 points par niveau jusqu'au niveau 80 avec un maximum de 400. Il y a 5 statistiques à distribuer et aucune limite maximale à combien vous pouvez ajouter à une statistique.

  • Force
  • Endurance
  • Intelligence
  • Agilité
  • Chance - Confère une chance critique et des dégâts critiques

Je voudrais implémenter une équation de rendement décroissant sur, disons, la chance. Pour une chance critique, je ne souhaite pas que le joueur puisse toucher 100% de chance critique.

Il y aura un plafond auquel il atteindra à mesure que la croissance de plus en plus décroissante atteindra 0 point par point ajouté.

Exemple si la chance critique maximale que je veux que le joueur ait est de 40%, chaque point de chance augmentera de moins en moins les chances de critique jusqu'à ce que la chance critique atteigne environ 40%. Par lequel 1 chance donnera un montant très très minuscule.

Des solutions? Merci et votre aide est grandement appréciée!

pseudo
la source
Copie possible de Comment développer des formules de dommages RPG? - tl; dr le mot-clé que vous recherchez est courbe sigmoïde
BlueRaja - Danny Pflughoeft
@BlueRaja Je pense que ce n'est pas un doublon. Cette question concerne les fonctions à rendement décroissant en général - celle-ci concerne le calcul des dommages. En l'occurrence, les réponses à celle-ci ont surtout discuté des fonctions à rendement décroissant, mais je pense que les questions sont toujours clairement différentes.
Anko

Réponses:

30

Vous voulez commencer avec une fonction asymptotique. Autrement dit, celui qui commence à un nombre aet s'approche d'un autre nombre b, mais ne l'atteint jamais réellement. Ce sera probablement plus facile si a = 0et b = 1. Vous prendrez cette équation, saisirez le nombre de points de stat (points de chance) que possède le personnage et obtiendrez la valeur réelle de stat (Crit Chance) en sortie.

Un exemple très simple est y = x / (x + n)où se ntrouve une constante positive. Voici xvotre entrée, où vous alimentez le nombre de points de statistiques, et yvotre sortie, où vous obtenez la valeur finale des statistiques.

Pour n = 5voir à quoi il ressemble:

y = x / (x + 5) tracé pour x dans [0,100]

Lorsque vous vous nourrissez, x = 0vous obtenez y = 0, mais peu importe la taille que xvous mettez,y n'atteint jamais tout à fait 1. Parfait.

Maintenant, vous pouvez régler cela selon le désir de votre cœur. Vous pouvez multiplier par un facteur d'échelle pour définir le «plafond» à tout ce que vous voulez. y = a * x / (x + 5). Si vous souhaitez que le plafond soit de 40%, multipliez par 0,4. y = .4 * x / (x + n). Maintenant, lorsque vous introduisez x, yaugmentera mais il n'atteindra jamais tout à fait .4.

Ajustez npour définir la vitesse ou le ralentissement de l'équation. n = 100va augmenter beaucoup plus lentement que n = 5:

y = x / (x + 100) tracé pour x dans [0,400]

Vous pouvez résoudre cette équation car nsi vous savez que vous voulez la valeur de statistique que vous souhaitez atteindre à un nombre de points de statistiques spécifique. Disons que le personnage devrait avoir 35% de chances de coup critique à 100 points de chance. Résolution .35 = .4 * 100 / (100 + n)des nrendementsn = 14.29 .

Ces nombres ne doivent pas non plus être des constantes brutes. Peut-être que d'autres statistiques entrent dans le calcul des valeurs de n. Peut-être que certains personnages ont des caractères différents n, donc ils évoluent mieux dans leur statistique «préférée».

Si vous voulez une courbe de forme différente ou plus complexe, il existe de nombreux autres exemples de fonctions asymptotiques que vous pouvez également utiliser. Je vous laisse explorer cela à votre guise.

Adam
la source
3
Ma courbe préférée est exponentielle. Prenez simplement un rapport fixe de la piscine restante avec chaque niveau.
John Dvorak
@JanDvorak pour l'exhaustivité, pouvez-vous fournir un exemple? Il y a beaucoup de courbes exponentielles et un lecteur peut ne pas savoir comment appliquer votre suggestion du commentaire précédent seul.
Adam
C'est un bon point de départ et les mathématiques sont bien expliquées, mais gardez à l'esprit que vous ne pouvez pas simplement choisir une fonction qui semble bonne; ce problème nécessite une attention particulière et beaucoup de réglages. Par exemple, l'un des inconvénients de cette méthode est son découragement de la spécialisation. Si les cinq statistiques sont également viables, les points dépensés pour la moins développée seront les plus précieux (et les plus développés le moins). La construction idéale serait une répartition égale des points, ce qui rend le choix du joueur sur la façon de les dépenser moins intéressant.
Marcks Thomas
@MarcksThomas Cela ne suppose aucune synergie entre les attributs, ni la capacité d'isoler tactiquement un attribut et de "gagner" avec lui. À titre d'exemple, imaginez un archer étonnant qui augmente son agilité au point que les ennemis meurent avant de les atteindre: même si l'agilité avait une efficacité décroissante, la tactique choisie rend les autres attributs sans importance. Une autre tactique impliquant la force pourrait être tout aussi efficace, de sorte que les attributs sont de «valeur égale», mais les tactiques signifient souvent que la spécialisation est dominante. Si votre système d'attributs récompense également la spécialisation, le jeu diverge.
Yakk
J'appelle cela le système "tirer des pierres d'un sac". La valeur P = x/(x+n)est la probabilité, étant donné un sac avec n pierres noires et x pierres blanches, que vous tiriez une pierre blanche du store. Une approche que vous pouvez faire est de définir des crits X = votre chance et N = leur chance. Votre chance de critiquer est alors de 50% si vous avez la même chance que votre ennemi. Si vous voulez que la chance de base soit de 10%, alors nous X = votre chance, N = 9x leur chance.
Yakk
10

Une bonne base serait une fonction comme arctan , car elle passe par l'origine et présente une asymptote horizontale.

arctan

Mettez-le à l'échelle par 40 / (pi/2)ou 80/pipour la limite souhaitée. Transformez ensuite luckpour obtenir la pente de courbe que vous souhaitez.

critical = 80/pi * arctan(f(luck))
jmegaffin
la source
8

J'aime vraiment la façon dont les jeux Souls abordent ce problème. Plutôt que de donner à chaque statistique des bonus basés sur une fonction continue comme cela a été suggéré, elle donne des bonus dans une fonction linéaire par morceaux.

Je ne me souviens pas des nombres exacts sur le dessus de ma tête, mais les fonctions sont dans le sens des suivantes (chaque statistique a ses propres constantes)

{0 <= x <20: y = 4x, 20 <= x <30: y = 3x + 20, 30 <= x <40: y = 2x + 50, 40 <= x <60: y = 1x + 90 , 60 <= x: y = 0,5x + 120}

Terrain

Cette méthode offre de nombreux avantages au concepteur et au joueur. Le concepteur en bénéficie car vous pouvez régler l'avantage exact par point dans une compétence de manière assez triviale, et le joueur en profite car il sait exactement combien il verra d'un niveau à l'autre.

Dans le cas d'une fonction continue, certains niveaux peuvent offrir un avantage qui ne se reflète pas dans les nombres en raison d'un alias de mesure. Bien sûr, ce dernier niveau vous a donné une augmentation de 0,9 du bonus XYZ, mais puisque la valeur réelle est passée de 23,52 à 24,42 et que vous arrondissez le nombre avant de l'afficher, le joueur ne se rend pas compte que quelque chose a changé.

Du point de vue UX, je suggérerais certainement d'utiliser une fonction linéaire par morceaux. Cependant, l'utilisation d'une fonction continue peut être plus facile à régler plus tard, car les joueurs ne seront pas aussi attachés aux constantes rondes.

Kaslai
la source
1
Approximation d'une courbe qui ne nécessite pas beaucoup de mathématiques et simple à modifier. Je l'aime. :)
Casey Kuball
> Vous arrondissez le numéro avant de l' afficher => un moyen de compensation est à ceilla quantité d'augmentation avant d' ajouter, et ne permettent que des niveaux entier stat. ou flooralors x <= 0: x = 1pour éviter de passer accidentellement le capuchon souple.
Bob
1
Bien que vous puissiez toujours faire une fonction par morceaux, elle n'a pas l'effet que vous recherchez ici. La valeur de chance est un pourcentage, avec un maximum de 400 notes. Cela signifie que chaque point d'évaluation doit entraîner un gain de valeur inférieur à 1%, même dans une fonction linéaire avec 100% de chance. L'astuce montre juste assez de décimales pour que y (399) soit différent de y (400). Votre fonction fait la même chose en faisant grandir y pour que les augmentations puissent toujours être intégrales. À x = 40, y est plus de 4 fois la valeur de x.
MichaelS
@MichaelS Je donnais juste un exemple du type de fonction utilisé dans Dark Souls. Il faudrait qu'il soit équilibré différemment selon la situation à laquelle il est appliqué, mais mon argument est toujours que les joueurs comprendront l'effet d'une fonction linéaire par morceaux beaucoup plus facilement qu'une courbe arctangente ou une section conique.
Kaslai
3

Jan Dvorak souligne la fonction exponentielle dans un commentaire. Je vais l'expliquer ici.

Notez que les opérations exponentielles (et trigonométriques) sont considérablement plus coûteuses en termes de calcul que même les opérations de racine carrée, qui sont elles-mêmes bien pires que les mathématiques de base, donc vous êtes probablement mieux avec l'approche d'Adam si vous effectuez ces calculs plusieurs fois par seconde . Si vous calculez simplement les valeurs lorsque le niveau du joueur, change d'équipement, etc., la vitesse n'est pas importante, alors utilisez ce qui vous donne la meilleure courbe.

Une fonction exponentielle est une certaine base B , dans une certaine puissance, x , y=B^x. Les mathématiciens utilisent généralement une base de e , (~ = 2,718), mais il n'y a aucune raison que vous ne puissiez pas utiliser 2 ou 10 si vous préférez.

y=e^x ressemble à ça: y = e ^ x

Remarquez que le côté gauche se déplace de manière asympotique vers 0. Nous pouvons donc inverser l'axe des x en faisant y=e^(-x) , mais il descend toujours de 1 à 0 et nous voulons qu'il monte. Nous pouvons donc le retourner sur l'axe des y avec y=-e^(-x) . Maintenant, il monte de -1 à 0. Nous pouvons ajouter 1 pour obteniry= 1- e^(-x) et il monte de 0 à 1.

y = 1-e ^ (- x)

À partir d'ici, il suffit de le mettre à l'échelle verticalement et horizontalement. Nous pouvons multiplier le tout par une valeur, appelons-la A , qui définit la limite asymptotique. Ensuite, nous pouvons multiplier x par une valeur de taux de changement, k , pour ajuster la vitesse à laquelle il se rapproche de la limite.

Cela nous donne une équation finale de y=A*(1 - e^(-k*x)). En utilisant les valeurs de k=0.012et A=0.5, nous pouvons définir la limite à 50% et la laisser se rapprocher de cette limite x=400.

y = 0,5 * (1-e ^ (- 0,012 * k))

Maintenant, vous pouvez apporter quelques modifications à cela. Un ajustement que j'ai fait était en train de changer A=0.5041, donc si nous arrondissons à un pourcentage avec 2 décimales (comme 32,23%), y (399) = 49,99% et y (400) = 50,00%. À partir de y (347), il y a plusieurs endroits où il faut deux points pour obtenir un changement de 0,01%. Mais ce dernier point possible donne toujours un avantage (à peine) tangible, et le porte à 50%.

Alternativement, nous pourrions ajuster la kvaleur pour avoir un effet similaire. À k=0.02305, la valeur arrondit à 49,99% à y=399et 50,00% à y=400. Cependant, cela a le problème que le graphique est très peu profond à la fin - il faut 48 points pour obtenir ce dernier centième de pour cent (de y(352)=49.99%ày(399)=49.99% à y(400)=50.00%) et la dernière chance de critique de 1% prend 230 points (de y(170)=49.01%à y(400)=50.00%) ce qui diminue probablement un peu trop les rendements.

Si vous le souhaitez, vous pouvez ajuster à la fois A et k afin qu'il diminue à une limite un peu plus élevée à un rythme plus lent, pour donner quelque chose entre la décroissance linéaire et exponentielle. Fairey=0.6*(1-e^(-0.00447*x)) , vous vous retrouvez avec ceci: y = 0,6 * (1-e ^ (- 0,00447 * x))

Notez que la courbe continue au-delà de 50%, mais comme il y a une limite dure de 400, le joueur ne peut pas passer ce point (et s'il parvient à le passer, il y a toujours une limite dure de 60% critique). Avec cette équation, vous pouvez utiliser 1 décimale et toujours voir des gains tous les 2 à 3 points, avec un dernier tick de y(399)=49.9%ày(400)=50.0% .

Mathématiquement, les équations précédentes peuvent sembler meilleures, car elles approchent en fait de 50%, mais je pense personnellement que des gains de 0,1% tous les points se sentent mieux que des gains de 0,01%. Même avec A=0.05041et k=0.012, il faut 102 points pour aller de y(298)=49.00%à y(400)=50.00%. 25% de vos points dépensés sur 2% de vos critiques sont probablement trop diminués. L'équation de 60% ne prend que 20 points pour le dernier pour cent (ce qui est toujours 5 fois plus élevé que les 4 points nécessaires pour le premier pour cent).

Avec ces dernières équations, j'ai simplement branché les équations dans une feuille de calcul et modifié manuellement les valeurs jusqu'à ce qu'elles semblent bonnes. Il faudrait faire quelque chose de similaire si vous vouliez un plafond différent.

MichaelS
la source
2
La note sur la vitesse relative des opérations mathématiques est correcte, mais probablement sans pertinence pour les statistiques des joueurs. Les goulots d'étranglement dans les jeux modernes sont généralement des éléments qui gèrent plusieurs milliers d'éléments par image (par exemple, physique et rendu). Les scripts de gameplay qui s'exécutent probablement plusieurs dizaines de fois par image ne sont probablement pas un échec par rapport à cela, et sont généralement pleins de cache manquants de toute façon, ce qui laissera au processeur beaucoup de temps pour tourner les pouces à votre guise. tl; dr: Ne vous sentez pas obligé d'éviter des opérations coûteuses à moins que vous n'écriviez des shaders ou d'autres choses qui doivent exécuter d'énormes lots
DMGregory
-1

Pour une solution très simple, que diriez-vous de la racine carrée x 2

La racine carrée de 400 (max possible) est 20, 20 * 2 = 40.

Catwood
la source
Pourquoi le vote négatif? Il résout la question posée et est simple, ce qui a également été demandé.
Catwood
1
Je ne suis pas le downvoter, mais c'est probablement parce que votre réponse est trop spécifique et ne fournit aucune information qui n'a pas déjà été fournie (une racine carrée est juste une exponentiation au pouvoir de 1/2) et vous n'expliquez pas la raisons pour lesquelles cela pourrait être utile.
Kaslai
Je n'ai pas downvote, mais je ne pense pas que ce soit une bonne réponse car elle n'est pas très flexible - la racine carrée n'est pas asymptotique, donc si le niveau max change jamais, vous devez changer la formule afin de garder le max stat la même chose.
BlueRaja - Danny Pflughoeft