La réponse apportée par Grzegorz Sławecki est déjà bonne, mais je voulais expliquer la logique de sa méthode et vous donner les outils pour adapter les solutions à vos besoins de gameplay.
Les paramètres du problème actuel sont le niveau d'attaque du joueur a , les dégâts de l'arme w , le total des dégâts infligés en une seule attaque d , la santé de l'ennemi H et le nombre minimum de coups nécessaires pour tuer l'ennemi, appelons-le n .
Si vous voulez que le joueur tue en n coups, alors ses dégâts totaux d doivent être tels que
(n-1) .d <H ≤ nd ou en d'autres termes, n = ceil (H / d) .
d dépend des dégâts de l'arme w et du niveau d'attaque du joueur a et nous pouvons nous attendre à ce que les armes s'améliorent à mesure que le niveau augmente, alors écrivons d (a) et w (a) au lieu de simplement d et w . Les ennemis auxquels le joueur est confronté devraient également devenir plus coriaces, donc, encore une fois, H (a) . Ce sont toutes des fonctions croissantes de a , et vous voulez qu'elles satisfassent aux inéquations ci-dessus. Les inconnues du problème sont les fonctions. Vous en définissez une comme contrainte et vous trouvez les autres. Vous avez cependant des degrés de liberté, ce qui est une bonne chose.
Si je comprends bien votre question, vous avez un gameplay précis à l'esprit, et ce gameplay est principalement représenté ici par le nombre de coups nécessaires pour tuer l'ennemi, n (a) . Par conséquent, définissez n (a) en fonction du gameplay que vous envisagez pour le jeu, puis recherchez les autres variables du problème . C'est ce que vous devez toujours faire parce que, comme le montre votre question, votre première tentative a été d'essayer un algorithme que vous pensiez pouvoir faire, puis vous avez réalisé qu'il entraînait un gameplay indésirable.
Supposons, par exemple, que vous souhaitiez que le joueur frappe de plus en plus de fois au cours de sa progression dans le jeu. Vous voulez également que, à mesure que le nombre de coups requis augmente, il augmente de moins en moins souvent, de sorte que le joueur passe une partie plus longue du jeu à frapper 5 fois que 2 fois. Voici à quoi ressemble n (a) :
La fonction utilisée est n (a) = ceil (2 / 3.sqrt (a)) .
Nous voulons que H (a) / d (a) reste dans les plages de valeurs qui font que n (a) a la valeur souhaitée et puisque n (a) = ceil (H (a) / d (a)) , ces plages sont les rectangles suivants:
et H (a) / d (a) peut naturellement être réglé sur 2 / 3.sqrt (a) de sorte que nous obtenons le graphique suivant, avec la courbe rouge étant H (a) / d (a) :
Remarque: nous pouvons facilement trouver H (a) / d (a) ici parce que nous connaissons la fonction dont n (a) est le plafond, mais si notre spécification pour n était moins agréable, nous devions faire notre propre ajustement fonction en utilisant diverses astuces. Tous les problèmes ne sont pas si agréables!
Nous voulons donc que H (a) / d (a) ressemble à une fonction de racine carrée personnalisée et nous savons que H et d doivent être des fonctions croissantes. Les solutions sont nombreuses. Par exemple,
H (a) = a. 2 / 3.sqrt (a) et d (a) = a
Mais nous aimerions que les dégâts et les PV de l'ennemi augmentent énormément afin qu'il y ait de gros chiffres impressionnants à la fin du jeu, juste pour le style, alors nous avons plutôt défini
H (a) = a². 20 / 3.sqrt (a) et d (a) = 10.a²
Le point principal, et la meilleure partie, est le suivant: vous savez que vos solutions au problème ( H (a) et d (a) ) obéissent aux spécifications ( n (a) ), donc vous obtenez le même n (a) , mais vous avez la liberté. Vous connaissez exactement la liberté dont vous disposez et vous pouvez l'utiliser pour personnaliser l'expérience. Vous devriez toujours essayer de vous donner une telle liberté tout en satisfaisant vos besoins les plus importants, dans la mesure du possible.
Maintenant que nous avons choisi les dégâts à un coup d (a) , et puisque d (a) dépend des dégâts de l'arme w (a) , nous pouvons utiliser d (a) comme spécification et essayer de trouver un w (a ) qui nous donne ce d (a) . Les principes sont les mêmes, le problème est différent: nous voulons que le joueur inflige plus de dégâts à mesure que son niveau augmente, même si l'arme reste la même, et nous voulons également que les dégâts augmentent lorsque l'arme seule s'améliore et que le niveau reste le même.
Mais quelle importance chaque facteur devrait-il avoir? Supposons que le niveau soit plus important que les armes: une plus grande partie des variations de d (a) = a² doit être indépendante de w (a) , par exemple avec
w (a) = 22.sqrt (a) et, par conséquent, d (a) = (22.sqrt (a)). (10 / 22.a.sqrt (a)) = w (a). (10 / 22.a.sqrt (a))
Nous obtenons le graphique suivant pour w (a) ...
... et toujours le même d (a) , car nous avons à nouveau trouvé une solution qui obéissait à la spécification , ici d (a) , et nous avons les propriétés mentionnées ci-dessus avec w et a contribuant aux dommages (supposons que nous regardions d en fonction de a et w : alors si a était fixe et que nous avions w varie dans l'équation d (a, w) = a / 30.w , d serait toujours une fonction croissante de w , et il en va de même si vous fixez w et faire une varier).
Ce w (a) pourrait vous donner la valeur à afficher dans la description du jeu de l'arme: nous obtiendrions "Weapon Damage: 220" avec la meilleure arme du jeu par exemple.
Nous aurions pu utiliser une spécification complètement différente pour notre gameplay et donc pour n (a) , par exemple une qui fait augmenter rapidement le nombre de hits requis au fur et à mesure que le jeu progresse puis se stabilise, et les solutions résultantes auraient été différentes.
playerAttack
statistique à 100? Étant donné que c'est la valeur maximale, tuer l'ennemi en quelques coups ne serait-il pas approprié? (L'ennemi de 1000 HP est-il quelque chose que vous verriez au début du jeu? Un ennemi standard? Boss?)