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!
Réponses:
Vous voulez commencer avec une fonction asymptotique. Autrement dit, celui qui commence à un nombre
a
et s'approche d'un autre nombreb
, mais ne l'atteint jamais réellement. Ce sera probablement plus facile sia = 0
etb = 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ù sen
trouve une constante positive. Voicix
votre entrée, où vous alimentez le nombre de points de statistiques, ety
votre sortie, où vous obtenez la valeur finale des statistiques.Pour
n = 5
voir à quoi il ressemble:Lorsque vous vous nourrissez,
x = 0
vous obtenezy = 0
, mais peu importe la taille quex
vous 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 introduisezx
,y
augmentera mais il n'atteindra jamais tout à fait .4.Ajustez
n
pour définir la vitesse ou le ralentissement de l'équation.n = 100
va augmenter beaucoup plus lentement quen = 5
:Vous pouvez résoudre cette équation car
n
si 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)
desn
rendementsn = 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érentsn
, 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.
la source
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.Une bonne base serait une fonction comme
arctan
, car elle passe par l'origine et présente une asymptote horizontale.Mettez-le à l'échelle par
40 / (pi/2)
ou80/pi
pour la limite souhaitée. Transformez ensuiteluck
pour obtenir la pente de courbe que vous souhaitez.la source
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)
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.
la source
ceil
la quantité d'augmentation avant d' ajouter, et ne permettent que des niveaux entier stat. oufloor
alorsx <= 0: x = 1
pour éviter de passer accidentellement le capuchon souple.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: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 avecy=
-e^(-x)
. Maintenant, il monte de -1 à 0. Nous pouvons ajouter 1 pour obteniry=
1- e^(-x)
et il monte de 0 à 1.À 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 dek=0.012
etA=0.5
, nous pouvons définir la limite à 50% et la laisser se rapprocher de cette limitex=400
.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
k
valeur pour avoir un effet similaire. Àk=0.02305
, la valeur arrondit à 49,99% ày=399
et 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 (dey(352)=49.99%
ày(399)=49.99%
ày(400)=50.00%
) et la dernière chance de critique de 1% prend 230 points (dey(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. Faire
y=0.6*(1-e^(-0.00447*x))
, vous vous retrouvez avec ceci: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.05041
etk=0.012
, il faut 102 points pour aller dey(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.
la source
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.
la source
1/2
) et vous n'expliquez pas la raisons pour lesquelles cela pourrait être utile.