4 votes

Comment modéliser une série itérative de rounds de combat dans Anydice ?

Les combats de Némésis sont simples :

  1. Choisissez des bassins de yang/yin,
  2. Lancez Nd6 contre l'habileté,
  3. Distribuer des coups de Yang à un ou plusieurs adversaires,
  4. Bloquez les coups portés avec le Yin ou le Chi,
  5. Le premier à -1 Chi perd,
  6. Les joueurs gagnent les égalités.

En vertu d'un question précédente J'essaie de modéliser cette séquence dans Anydice. Pour des raisons de simplicité, je saute les étapes du yang/yin et modélise les joueurs comme un seul grand pool de Chi.

Idéalement, ce graphique Anydice doit afficher la probabilité que les joueurs possédant PCHI chi gagner un combat contre un Némésis possédant NCHI chi.

La fonction récursive "combat" :

function: fight PCHI:n chi vs NCHI:n chi {
 HITS: 5d(1d6<=2)
 TAKES: 5d(1d6<=2)
 PLAYERWIN: HITS >= TAKES

 if PLAYERWIN {
  if NCHI = 0 {
   result: 1
  }
  result: [fight PCHI chi vs NCHI-1 chi]
 }

 if X = 0 {
  result: 0
 }
 result: [fight PCHI-1 chi vs NCHI chi]

}

output [fight 5 chi vs 5 chi]

Actuellement, Anydice produit l'erreur suivante :

calculation error

Boolean values can only be numbers, but you provided "d{?}".
Depending on what you want, you might need to create a function.

Je crois que cela indique que PLAYERWIN est une gamme de rouleaux. Tout cela est bien beau, mais pour l'instant je ne sais pas comment structurer la fonction pour qu'elle revienne avec des arguments différents selon que les joueurs ont effectivement infligé des coups égaux ou supérieurs.

2voto

HighDiceRoller Points 1548

AnyDice et le flux de contrôle

Le problème ici, c'est qu'AnyDice's if est uniquement déterministe. Vous ne pouvez pas faire en sorte que le programme prenne une déclaration séparée if en fonction du résultat d'un jet (ou plus précisément, qu'il prenne les deux branches et pondère les résultats en fonction de la probabilité de chaque branche).

AFAIK AnyDice a exactement un mécanisme pour le flux de contrôle non déterministe, qui consiste à fournir un argument de dé à un paramètre de fonction de type n o s Dans ce cas, la fonction sera évaluée pour toutes les sommes ou séquences possibles, respectivement. Par exemple, vous pouvez utiliser cette fonction pour écrire un opérateur conditionnel .

Votre code ci-dessus pourrait alors être écrit comme suit :

function: if CONDITION:n then A else B {
  if CONDITION { result: A } else { result: B }
}

function: fight PCHI:n chi vs NCHI:n chi {
 if PCHI = 0 { result: 0 }
 if NCHI = 0 { result: 1 }
 HITS: 5d(1d6<=2)
 TAKES: 5d(1d6<=2)
 PLAYERWIN: HITS >= TAKES

 result: [if PLAYERWIN then [fight PCHI chi vs NCHI-1 chi] else [fight PCHI-1 chi vs NCHI chi]]
}

output [fight 5 chi vs 5 chi]

Problèmes

Cependant, il y a quelques problèmes. Tout d'abord, ce code prend du temps pour les grands Chi de départ. Deuxièmement, même avec les simplifications mentionnées

Pour simplifier, je passe sur les étapes du yang/yin, et je modélise les joueurs comme un seul grand pool de Chi.

il y a encore d'autres facteurs non pris en compte :

  • Ce n'est pas que le côté qui a gagné le moins de coups perd 1 Chi. Les deux camps perdent un Chi égal au nombre de coups subis, ce qui peut être le fait d'un seul, des deux ou d'aucun des deux camps, et peut représenter plusieurs Chi perdus.
  • Il existe des règles de départage supplémentaires pour les cas où les deux camps n'ont plus de Chi en même temps.

J'essaierai peut-être de rédiger un script plus complet si personne d'autre n'y arrive avant moi.

1voto

Leon Radley Points 1314

Quelque peu inspiré par notre discussion dans Réponse de @HighDiceRoller j'ai adapté mon anciens travaux pour les combats à plusieurs manches dans Risus en utilisant dyce ¹ et mis en place un widget interactif utilisant Jupyter qui pourrait vous aider. Une limitation est qu'il ne permet de configurer les allocations de pool que pour l'ensemble du combat, et non par round :

Widget Screenshot

Ceci étant dit, après avoir joué avec et en supposant que je comprenne le mécanisme (et que mes maths et mes widgets soient bien connectés), je ne suis pas sûr que ce soit toujours une bonne stratégie de consacrer des dés à la défense. (D'autres personnes plus prudentes et observatrices que moi sont encouragées à intervenir sur le caractère douteux de ma conclusion).

anydyce ² est utilisé pour générer des graphiques "en rafale". Vous pouvez jouer avec dans votre navigateur : Try dyce [ source ]

Si vous parlez Python, l'implémentation substantive peut être trouvée dans nemesis.py . Sachez qu'il utilise la récursion dans des fonctions imbriquées, ce qui le rend probablement plus difficile à comprendre. Mais il est assez performant comparé à AnyDice, principalement en raison de la mémorisation (c'est-à-dire l'utilisation de Python @functools.cache décorateur ).


¹ dyce est ma bibliothèque de probabilité de dés en Python.

² anydyce est ma couche de visualisation pour dyce conçu comme un substitut approximatif de AnyDice.

AlleGamers.com

AlleGamers est une communauté de gamers qui cherche à élargir la connaissance des jeux vidéo.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X