Attributs pour calculer un coup dans un jeu au tour par tour ou Roguelikes
22
J'essaie de trouver une bonne formule pour déterminer un coup quand le joueur attaque un ennemi dans un Roguelike. J'aimerais proposer quelque chose de simpliste, mais toujours fidèle à la façon dont cela se fait dans D&D ou Roguelikes populaires comme AngBand ou NetHack.
Jusqu'à présent, j'ajoute les différences entre les attributs du joueur et de l'ennemi, ainsi qu'un entier aléatoire:
Cela rend le gameplay contre nature: le joueur ne manque jamais d'ennemis faibles et vice versa pour les plus forts. Est-ce que quelqu'un connaît un guide sur les combats basés sur les attributs utilisés dans les jeux au tour par tour, etc.? Dois-je (et puis-je) copier les règles D&D textuellement?
Je déterminerais ce que vous voulez que les chances de "coup sûr" et de "coup sûr garanti" soient (c'est-à-dire les chances pour un chaton de frapper un dragon et un dragon de manquer un chaton). Enregistrez votre résultat aléatoire et avant d'appliquer des différences de puissance, marquez un coup s'il se trouve dans ces limites. Cela évitera le problème des chances de réussite / manquement à 100% ... bien qu'il existe une autre option pour toujours fournir une chance de succès, détaillée ci-dessous.
D&D est un système "plat", où la probabilité est uniformément répartie entre les résultats de roulis possibles. D'autres systèmes utilisent une distribution plus courbe, généralement obtenue en lançant plusieurs dés et en les ajoutant. Il est assez facile de créer une courbe comme celle-ci (rand () + rand ()) / 2 me vient à l'esprit).
Une autre possibilité est «d'exploser les dés». Dans des systèmes comme Shadowrun et Savage Worlds, rouler le résultat de dé maximum possible vous permet de relancer ce dé et d'ajouter le nouveau résultat. Dans votre jeu, vous testez pour voir si votre résultat aléatoire est supérieur à un certain seuil, et si c'est le cas, relancez. Si vous laissez les dés exploser indéfiniment, alors même le gobelin le plus humble a une chance de toucher un dieu, et vous n'avez pas besoin d'un mécanisme explicite de "coup sûr".
Donc, une approche possible avec un lancer incurvé, une chance garantie de manquer et des dés qui explosent serait quelque chose comme:
function getRoll():Number{var result:Number=(rand()+ rand())*3;//Curved result from 0 to 6if(result >5.75) result += getRoll();//Explode over a certain threshold, recursivelyreturn result;}function attackHits():Boolean{var roll:Number= getRoll();if(roll <0.25)returnfalse;//Guaranteed chance of misselsereturn((player.dex - enemy.dex)+(player.speed - enemy.speed)+(player.luck - enemy.luck)+ roll)>=10;//Your original test.}
Bien sûr, c'est non testé et non équilibré; vous voudriez ajuster tous ces nombres magiques jusqu'à ce qu'ils se sentent bien.
Quant à la copie textuelle des règles, cela pose des problèmes juridiques et éthiques. Vous êtes bien en train de vous inspirer de D&D et d'autres jeux de table; c'est ainsi qu'ils ont tous été conçus en premier lieu. Vous n'avez pas non plus besoin de montrer au joueur exactement comment les règles fonctionnent, et vous constaterez peut-être que l'utilisation d'une courbe de dés à virgule flottante lisse donne une meilleure sensation que de se limiter aux contraintes entières des dés physiques.
quelle langue est-ce, avec les decls de type drôle? Ou est-ce juste un pseudocode?
tenpn
2
Je pense que cela peut être Actionscript ou Javascript, mais ne m'y tenez pas.
The Communist Duck
C'est Actionscript 3. Je suis développeur Flash.
Gregory Avery-Weir
6
Je suppose que c'est une question d'équilibre du jeu et non une question de codage, et il existe de nombreuses façons de gérer cela. D'après votre algorithme existant, je soupçonne que vous le rendez plus compliqué qu'il ne doit l'être (trois attributs ET un nombre aléatoire font un système extrêmement boueux du point de vue du joueur). Mon premier réflexe est de simplifier!
Privilégiez les attributs qui font plusieurs choses, plutôt que les résultats qui sont déterminés par plusieurs attributs. DEX fonctionne très bien en tant que principal déterminant de la chance de toucher; l'ajout de tout le reste ne fait que compliquer l'équilibre. Pensez-y de cette façon: les dégâts attendus d'un joueur à chaque coup sont son% de coup multiplié par ses dégâts moyens quand il touche. Comment prévoyez-vous de calculer un% à atteindre "normal" ou "typique" avec autant de variables?
Je vois un autre problème, c'est que votre formule n'est pas évolutive, et c'est probablement ce que vous vivez. En supposant que DEX, LUCK et SPEED ont tendance à augmenter au cours du jeu, les différences entre le joueur et le monstre dans ces statistiques auront également tendance à augmenter. À titre d'exemple, si le DEX en début de partie d'un joueur se situe dans la plage de 4 à 6, tout comme les monstres, c'est un modificateur de 10-20% pour toucher. Si la plage est plus proche de 10 à 20 dans les étapes ultérieures du jeu, cela correspond à un modificateur de 100%.
Une façon de résoudre ce problème est de maintenir les statistiques fixes. Les gammes de joueurs et de monstres sont les mêmes tout au long du jeu, et obtenir quelque chose comme +1 DEX est une affaire énorme, extrêmement rare et traitée comme telle (si elle existe). Ensuite, votre formule fonctionnera bien pour tout le jeu, et vous verrez un joueur avec environ la même chance de toucher tout au long.
Une autre façon est de changer ce "10" codé en dur pour évoluer avec le niveau, donc c'est peut-être "10 + niveau monstre" ou "10 + niveau donjon" ou quelque chose, ce qui provoque une légère augmentation de la difficulté à mesure que le jeu progresse, sauf si le joueur monte de niveau leurs statistiques en conséquence.
Une troisième façon, comme d'autres l'ont dit, consiste à fixer des plafonds fermes sur le% le plus élevé et le plus bas acceptable à atteindre, et à dire simplement "si la valeur calculée est inférieure à X, utilisez X à la place".
Par souci d'exhaustivité, je soulignerai qu'il n'y a pas de loi absolue que vous DEVEZ inclure un jet de touche en premier lieu. Prendre une action dans un jeu inefficace n'est pas particulièrement amusant et n'ajoute pas vraiment à l'expérience, sauf dans de rares cas. Une alternative est de laisser les joueurs TOUJOURS frapper, et juste jouer avec la gamme de dégâts afin que parfois ils fassent beaucoup moins de dégâts que les autres. N'oubliez pas que les systèmes complexes sont plus amusants pour le concepteur que pour le joueur.
Vous voudrez peut-être ajouter des coups critiques (généralement ne peut pas manquer, des dégâts bonus) et des coups critiques (chance plate de manquer quoi qu'il arrive, peut étourdir le joueur).
Je suppose que c'est une question d'équilibre du jeu et non une question de codage, et il existe de nombreuses façons de gérer cela. D'après votre algorithme existant, je soupçonne que vous le rendez plus compliqué qu'il ne doit l'être (trois attributs ET un nombre aléatoire font un système extrêmement boueux du point de vue du joueur). Mon premier réflexe est de simplifier!
Privilégiez les attributs qui font plusieurs choses, plutôt que les résultats qui sont déterminés par plusieurs attributs. DEX fonctionne très bien en tant que principal déterminant de la chance de toucher; l'ajout de tout le reste ne fait que compliquer l'équilibre. Pensez-y de cette façon: les dégâts attendus d'un joueur à chaque coup sont son% de coup multiplié par ses dégâts moyens quand il touche. Comment prévoyez-vous de calculer un% à atteindre "normal" ou "typique" avec autant de variables?
Je vois un autre problème, c'est que votre formule n'est pas évolutive, et c'est probablement ce que vous vivez. En supposant que DEX, LUCK et SPEED ont tendance à augmenter au cours du jeu, les différences entre le joueur et le monstre dans ces statistiques auront également tendance à augmenter. À titre d'exemple, si le DEX en début de partie d'un joueur se situe dans la plage de 4 à 6, tout comme les monstres, c'est un modificateur de 10-20% pour toucher. Si la plage est plus proche de 10 à 20 dans les étapes ultérieures du jeu, cela correspond à un modificateur de 100%.
Une façon de résoudre ce problème est de maintenir les statistiques fixes. Les gammes de joueurs et de monstres sont les mêmes tout au long du jeu, et obtenir quelque chose comme +1 DEX est une affaire énorme, extrêmement rare et traitée comme telle (si elle existe). Ensuite, votre formule fonctionnera bien pour tout le jeu, et vous verrez un joueur avec environ la même chance de toucher tout au long.
Une autre façon est de changer ce "10" codé en dur pour évoluer avec le niveau, donc c'est peut-être "10 + niveau monstre" ou "10 + niveau donjon" ou quelque chose, ce qui provoque une légère augmentation de la difficulté à mesure que le jeu progresse, sauf si le joueur monte de niveau leurs statistiques en conséquence.
Une troisième façon, comme d'autres l'ont dit, consiste à fixer des plafonds fermes sur le% le plus élevé et le plus bas acceptable à atteindre, et à dire simplement "si la valeur calculée est inférieure à X, utilisez X à la place".
Par souci d'exhaustivité, je soulignerai qu'il n'y a pas de loi absolue que vous DEVEZ inclure un jet de touche en premier lieu. Prendre une action dans un jeu inefficace n'est pas particulièrement amusant et n'ajoute pas vraiment à l'expérience, sauf dans de rares cas. Une alternative est de laisser les joueurs TOUJOURS frapper, et juste jouer avec la gamme de dégâts afin que parfois ils fassent beaucoup moins de dégâts que les autres. N'oubliez pas que les systèmes complexes sont plus amusants pour le concepteur que pour le joueur.
la source
Vous voudrez peut-être ajouter des coups critiques (généralement ne peut pas manquer, des dégâts bonus) et des coups critiques (chance plate de manquer quoi qu'il arrive, peut étourdir le joueur).
la source
De nombreux jeux utilisent un changement de cinq pour cent d'un coup indépendamment de tous les facteurs en plus de la formule de coup normale.
la source