Je bricole depuis un certain temps avec un jeu et j'ai beaucoup de mal avec quelque chose:
J'ai deux personnages, chacun ayant des attributs (une dizaine) dans une plage (entre 1 et 20). Je veux utiliser ces attributs pour générer un «jet» tel que le jet supérieur gagne cette rencontre particulière. Il convient de noter que les deux personnages ne s'endommagent pas / ne se défendent pas . Ils roulent tous les deux pour voir s'ils réussissent ce que je suppose que nous pourrions appeler un test de compétence. Ils roulent tous les deux pour réussir / échouer par rapport à une valeur commune. Ils n'interagissent pas entre eux.
Cependant, lorsque l'un des personnages a même un petit avantage numérique, toute formule que j'ai trouvée fait en sorte que celle qui est toujours légèrement supérieure remporte une énorme majorité du temps. C'est indésirable.
J'ai essayé de pondérer l'attribut «le plus pertinent» pour le test à 80% et la somme des autres attributs à 20%. J'ai également essayé de comparer des moyennes pour produire une différence relative et de l'utiliser pour augmenter le caractère le plus faible. Les deux approches ont entraîné les avantages importants que j'essaie de supprimer (par exemple, si je lance la rencontre 5 000 fois, elle produit assez régulièrement une équipe gagnant les 5 000).
L'ajout d'un composant "chance" n'a d'importance, semble-t-il, que s'il est en quelque sorte pondéré en faveur du personnage inférieur, et je n'ai pas trouvé un bon équilibre là-bas.
Quelles approches puis-je adopter pour atténuer l'impact d'un petit avantage numérique tout en préservant et en augmentant cet avantage à mesure que l'écart relatif des attributs augmente?
Par la demande, voici les détails que j'ai jusqu'à présent. Certaines choses que je n'ai pas encore découvertes restent donc des généralités:
Pour le moment, le roulement est généré comme
0.8 * (mainAttribute) + 0.2 (1/3 * subAttA + 1/3 * subAttB * 1/3 subAttC)
À l'heure actuelle, cela produit des chiffres aux alentours de 4,0. Les attributs sont générés aléatoirement entre des plages spécifiées. Le test actuel utilise un caractère avec des attributs de 2 à 4, et l'adversaire entre 3 et 5. Comme on pouvait s'y attendre, cela produit des moyennes proches de 3 et 4 respectivement.
Avec cet avantage d'un point, j'aimerais que le plus fort des deux gagne dans la zone de 55% à 60% du temps, avec cette augmentation à environ 80% du temps avec un avantage d'attribut moyen de 5 ou 6, 90% avec des avantages de 7 ou 8, laissant une certaine marge pour une victoire improbable lorsque l'écart se creuse. Je préférerais ne jamais avoir de victoires garanties, mais peut-être que les choses deviennent très improbables - au rythme de gagner 99,5% ou 99,6% du temps lorsque l'écart devient très grand.
La formule actuelle produit un nombre non aléatoire. L'aléatoire vient de la sélection des attributs pertinents. Pas tous les attributs sont utilisés pour chaque rouleau. Il est possible que celui avec les attributs les plus faibles soit plus fort dans les domaines pertinents pour ce jet et vole une victoire. Mais, comme on pouvait s'y attendre, cela arrive rarement.
Ma prochaine tentative a été de peser leurs forces relatives, en prenant une moyenne de toutes les statistiques de chacun, en les divisant les unes contre les autres et en utilisant cette valeur pour donner un petit coup de pouce au personnage inférieur. Cela a un peu lissé les choses, mais avait toujours une tendance prononcée à produire des choses comme 5 000 victoires pour un gars sur 5 000 essais.
la source
Réponses:
Le problème avec votre approche est que vous décidez du résultat du combat au moment où vous décidez de la statistique principale. Lorsque vous avez 4 statistiques principales et que le combattant n'est meilleur que dans l'une d'entre elles, sa chance de gagner est toujours de 1 sur 4, quelle que soit la taille des différences. Lorsque vous voulez des résultats plus fins, vous avez besoin d'un caractère aléatoire plus fin.
Tout d'abord, je pense que vous pouvez conserver votre choix aléatoire pour l'attribut principal et vous pouvez également conserver votre formule si vous le souhaitez. C'est le nombre qui représente la longueur d'avance de ce combattant dans cette rencontre spécifique. Pour le reste de cet article, j'y ferai référence comme juste
power
.Une méthode que j'ai utilisée dans beaucoup de jeux et qui m'a très bien servi quand il s'agit d'un duel entre deux choses avec un certain
power
, est de lancer un nombre à virgule flottante aléatoire entre0
etpower
pour les deux et de voir qui a roulé plus haut. Voici une liste des résultats attendus de cette méthode. Les pourcentages ne sont pas calculés mais générés expérimentalement en exécutant 100000 combats par combinaison et nombre d'itérations et en comptant qui a gagné à quelle fréquence:La bonne chose à propos de cet algorithme est qu'il évolue quelle que soit la taille des nombres avec lesquels vous avez affaire. La chance de 0,3 vs 0,7 est la même que celle de 3 vs 7, 300 vs 700 ou 3 000 000 000 vs 7 000 000 000.
Lorsque cela est encore trop imprévisible à votre goût, vous pouvez rendre le combat plus prévisible en lançant plusieurs nombres aléatoires pour chaque combattant et en les additionnant. En raison de la loi des grands nombres , de nombreux événements aléatoires s'équilibreront et donneront des résultats plus prévisibles. Voici un tableau avec un nombre d'itérations différent.
Les résultats de 100% et 0% dans le tableau ci-dessus sont une illusion en raison des différences d'arrondi. À moins que la valeur
power
d'un combattant soit exactement 0, il y a toujours la possibilité qu'il gagne. Cela ne s'est tout simplement pas produit dans le test ci-dessus, vous pouvez donc vous attendre à ce qu'il soit inférieur à 1: 100000.Vous pouvez également remarquer de légères irrégularités qui peuvent être attribuées à des sautes d'humeur de java.lang.Random et peuvent ne pas apparaître lorsque vous exécutez à nouveau le code avec une graine différente.
Le programme que j'ai utilisé pour générer cette table (Java).
Si vous souhaitez utiliser ce code dans votre jeu, il est sous licence WTF Public License Version 2 publiée par Sam Hocevar .
la source
1 - powerA / ( 2 * powerB )
.powerA < powerB
. Une fois que powerA est plus grand, vous devez passer àpowerB / (2 * powerA)
.Votre erreur utilise une approche "basée sur les dés". Vous êtes sur un ordinateur, vous pouvez utiliser n'importe quel système que vous aimez. Créez un tableau qui transforme une différence de valeurs en% de chance de gagner en âge, puis vous pouvez définir les valeurs à tout ce que vous voulez, par exemple
(Vous avez seulement besoin de faire la moitié du tableau, choisissez simplement toujours A comme celui avec la statistique la plus élevée)
Évidemment, ces chiffres ne sont qu'un exemple, vous pouvez le faire suivre la distribution qui vous plaît.
la source
C'est une question assez profonde, honnêtement, du point de vue de la mécanique du jeu. Mais il y a quelques choses qui pourraient aider.
Tout d'abord, c'est pourquoi la plupart des jeux ont un composant distinct pour les coups et les dégâts, où il y a un "jet" pour voir si vous touchez pour des dégâts, puis un "jet" contre une table ou une portée de dégâts pour le personnage donné. Cela conduit également à certains archétypes standard dans tous les genres, où vous pourriez avoir des personnages plus petits et plus rapides qui ont moins de points de vie mais infligent plus de dégâts (mages de canons de verre, certains types de voleurs) et de plus grands personnages blindés qui frappent pour moins de dégâts (chars, guerriers ).
Cela conduit à un équilibre naturel où le petit personnage peut être fragile, mais évite d'être touché aussi souvent en raison d'une capacité de type agilité, et égalise également le terrain de jeu en faisant plus de dégâts (un sort ou un effet de poison qui fait des dégâts sur temps). Le char peut être plus lent et être touché plus souvent, mais il a souvent un énorme puits de santé ou des points de vie à maintenir, mais a tendance à faire moins de dégâts par coup (ou de dégâts par seconde).
Le contexte de ces derniers est la raison pour laquelle de nombreux jeux passent constamment par l'équilibre des armes, des classes et des statistiques. World ou Warcraft, Destiny, Diablo, Battlefield: tout type de jeu dans n'importe quel genre passe souvent par un équilibrage et un réglage au fil du temps.
Ce n'est peut-être pas une réponse directe, mais vous avez demandé des idées générales. Alors, évaluons également le système de jeu.
Comment fonctionnent ces attributs? Si tout le reste est égal (pas d'archétype, pas d'armure ou de meilleures armes ou autre), alors tout léger gain est absolument susceptible de jeter fortement les choses en faveur d'un côté. Tout en ajoutant des facettes pour combattre complique n'importe quel système, il permet également plus de flexibilité.
la source
Il y a deux grandes choses.
Tout d'abord, souvenez-vous que vous êtes sur un ordinateur. Vous pouvez créer n'importe quel système que vous souhaitez. Pas besoin de vous limiter à un jet de d20, bien que cela soit facile à comprendre pour les joueurs. Des choses comme lancer 6 dés D6 sont faciles sur un ordinateur et donnent des résultats beaucoup moins aléatoires.
Deuxièmement, en regardant d'autres systèmes comme D&D, il est évident qu'ils limitent tout simplement l'effet des attributs. Au lieu d'avoir votre statistique de base ajouter 80% de sa valeur à la règle, réduisez-la et rendez son ajout plus subtil. Dans D&D par exemple, si vous avez 18 dextérité, vous obtenez seulement 4 en bonus pour votre classe d'armure.
Donc, en bref, tout ce que vous devez faire est de réduire votre domaine pour mieux l'adapter à votre gamme. Mais qualitativement, je pense que regarder d'autres systèmes et proposer des choses qui semblent moins mathématiques rendraient le système plus satisfaisant pour le joueur.
la source
Que diriez-vous de ceci: Ajoutez une constante, par exemple 1000, à tous les attributs concernés. Ensuite, la différence relative devient très petite.
la source
Connaissez vos chiffres
Ajoutant un peu à la réponse de Philipp , à savoir que rand [x] par rapport à rand [y] peut ne pas toujours produire ce que l'on attend. Sous un tableau où nous comparons A à B. A et B ont les valeurs 1 ... 10. Nous comparons de deux manières (note: rand () dans ce cas génère des entiers, c'est-à-dire des rouleaux):
De plus, nous comparons
(dans ce cas, peu importe que ce soit> ou ≥ car ils sont si proches). Ces grandes figures sont entre parenthèses.
Les cellules contiennent des%. Chaque résultat contient 1 million d'itérations (effectuées à l'aide de Dyalog APL ).
Si l'on regarde A = 2 et B = 3 (et 1 million de tests):
Les surprises pourraient être que:
Je pourrais en fait résoudre ce Q différemment, en tapant simplement à la main une table 10x10 avec de bons pourcentages souhaités (peut-être que l'on veut aussi une irrégularité?). Ensuite, si nécessaire, interpolez entre deux valeurs, pour obtenir un pourcentage exact, disons que c'est pour une raison quelconque 53. Ensuite, il est facile de générer un hit de probabilité de 53%, un 0 ou 1, en exécutant simplement un rand (100) et en testant s'il est plus petit ou égal à 53 :-).
C'est le long de la ligne mentionne Jack Aidley .
la source
0.0
et1.0
. Dans ce cas, la différence entre>
et>=
est négligeable. Vous voudrez peut-être le souligner.L'approche traditionnelle que plusieurs réponses ont implicitement référencée mais que personne n'a vraiment expliquée est que la tâche nécessite un jet de dé fixe et ajoute un modificateur de capacité dérivé de vos statistiques.
Par exemple, si deux joueurs suivent la procédure:
et répétez jusqu'à ce qu'un côté bat l'autre, puis vous obtenez des nombres dans votre gamme: voici les chances de victoire avec un avantage numérique donné à leur modificateur:
la source
Les personnages ne se défient pas pour la suprématie. Ils défient une exigence. Et si les deux réussissent. Qui gagne? Je suis surpris que vous n'ayez pas suffisamment contesté la logique que vous ayez même fait le calcul avec.
Quoi qu'il en soit, voici deux choses qui pourraient vous faire du bien.
Gagnez un cas de chance avec avantage:
SI la barre de réussite / vérification des compétences est un jet de 10. A lance 40. B lance 42. SI un seul doit gagner. A partir d'un gain A 50% / B 50% égal. Vous pouvez ajouter% pour gagner des chances en fonction du montant de l'avantage. Le jet B a (42-40) / 40 = 5% d'avantage en termes de jet. L'ajouter directement augmente les chances de victoire de B de 55%. Ou vous pouvez déterminer une chance de victoire personnalisée par pourcentage d'avantage. Dites pour chaque avantage de 100% que vous ajoutez 10% de chances de gagner. Donc, si A lance 10 et B lance 20. Alors A gagne 40% et B gagne 60% des cas.
Concept d'équité aléatoire:
Faire une chance standard de 30% de gagner peut finir par gagner 38 chèques sur 100.
Certaines personnes veulent une étape supplémentaire dans l'équité et s'assurent qu'une chance de 30% gagne toujours exactement 30 des 100 rencontres et suffit avec le hasard de ne pas savoir quelles rencontres dans la séquence sont une victoire et lesquelles sont une perte.
Ceci est particulièrement utile pour des économies de jeu bien calculées. Parce qu'une statistique aléatoire de 70% de chances de gagner. Dites 70% de chances à une foule de perdre 5 pièces d'or. Les foules peuvent finir par perdre l'or 81 fois sur 100. Ce qui déséquilibre les revenus et les dépenses. Et selon le nombre d'entités / instances qui utilisent de tels rouleaux, une inflation et / ou des pénuries sont inévitablement créées. Bien sûr, de nombreuses personnes n'ont même pas une estimation approximative de la répartition complète des intrants / dépenses de leur économie. Beaucoup de gens suffisent pour faire "la plupart" des points d'économie. Et laissez quelques variables de génération qui ne sont pas calculées et empilez les écarts au fil du temps, même avec un caractère aléatoire assez juste.
L'inflation et les pénuries ne sont pas un problème en soi. Vous pouvez gérer un caractère aléatoire non équitable et même des variables imprévues si votre économie est configurée pour répondre adéquatement à l'inflation et à la pénurie.
Pourquoi s'embêter avec ça comme la loi des grands nombres égalise les choses à long terme?
Tous les environnements ne peuvent pas conserver leur comportement de conception tout en comptant sur les choses pour égaliser plus tard ...
la source