7 votes

Modélisation d'un mécanisme de pool de dés opposés dans AnyDice

Je demande humblement un programme AnyDice pour cette mécanique :

  1. L'attaquant (A) lance un certain nombre de d6 en fonction de ses paramètres. Le défenseur (D) lance un certain nombre de d6 en fonction de ses paramètres.

  2. Le dé le plus élevé obtenu par A fixe le nombre cible pour les dés de B.

    Le dé le plus élevé obtenu par B fixe le nombre cible pour les dés de A.

  3. A compte les dés qu'il a lancés et qui ont généré un nombre égal ou supérieur au nombre cible déterminé par le jet de B.

    B compte les dés qu'il a lancés et qui ont généré un nombre égal ou supérieur au nombre cible déterminé par le jet de A.

  4. Si A a plus de succès, il gagne. Si B a plus de succès, il gagne.

Exemple 1 : A obtient [6, 6, 4, 3, 3, 2]. B obtient [4, 2, 2, 2]. La TN de A est de 4. La TN de B est de 6. A obtient 3 succès (6, 6, 4). B obtient 0 succès. A gagne.

Exemple 2 : A obtient [6, 6, 5, 3, 1, 1]. B lance [6, 6, 6, 2]. La TN de A est de 6. La TN de B est de 6. A obtient 2 succès (6, 6). B obtient 3 succès (6, 6, 6).

En fonction de la probabilité d'une égalité, un mécanisme de départage pourrait être introduit : en cas d'égalité, A et B retirent chacun leur dé le plus élevé, puis procèdent au décompte des succès en utilisant les nouveaux dés les plus élevés comme numéros cibles. Dans ce dernier exemple, A et B retirent chacun deux 6. Ainsi, le nouveau TN de A est 6, celui de B est 5 et A obtient 0 succès. B obtient 1 succès.

7voto

trjh Points 11

Voici une solution simple de force brute :

function: compare A:s vs B:s {
  SA: A >= 1@B
  SB: B >= 1@A
  result: (SA > SB) - (SA < SB)
}
output [compare 5d6 vs 4d6]

Elle itère simplement sur tous les jets possibles pour chaque joueur (cela se fait automatiquement dans AnyDice lorsque vous passez des dés à une fonction qui attend des séquences), calcule le nombre de succès pour chaque joueur, et renvoie -1, 0 ou +1 selon que A a obtenu moins de succès, autant de succès ou plus de succès que B.


Mise en œuvre du système de départage s'avère encore plus simple :

function: compare A:s vs B:s {
  result: (A > B) - (A < B)
}
output [compare 5d6 vs 4d6]

La raison pour laquelle cela fonctionne est que, lorsque vous comparez deux séquences dans AnyDice, elles sont comparées lexicographiquement de gauche à droite (c'est-à-dire de la plus haute à la plus basse, dans l'ordre de tri par défaut). Ainsi, par exemple {6,5,5,1} > {6,5,4,4} est vrai (c'est-à-dire qu'il renvoie 1 ), car les deux premiers éléments des deux séquences sont égaux, mais le troisième élément est plus grand dans la première séquence.

(Il est un peu déroutant de constater que la comparaison d'une séquence à un nombre est différente : elle compare le nombre à chaque élément de la séquence et renvoie le nombre d'éléments pour lesquels la comparaison est vraie. Et la comparaison d'une séquence à un dé fait encore quelque chose de différent. Le fait que la documentation soit formulée de manière ambiguë n'aide pas, et pourrait peut être interprété comme signifiant que la comparaison de deux séquences renvoie le nombre de comparaisons réussies entre les éléments respectifs. Un test rapide montrera que ce n'est pas le cas).

En l'occurrence, il s'agit de précisément équivalent à votre règle de départage, du moins en ce qui concerne la détermination du vainqueur. Pour montrer pourquoi, permettez-moi d'abord d'écrire vos règles sous une forme plus compacte (mais, je l'espère, manifestement équivalente) :

  1. Si le dé le plus élevé d'un joueur est supérieur à celui de l'autre (ou si un seul joueur a encore des dés et que l'autre n'en a pas), c'est ce joueur qui gagne.
  2. En cas d'égalité des dés les plus élevés, le joueur qui possède le plus grand nombre de ces dés gagne.
  3. (départage) Si les joueurs ont le même nombre de dés les plus forts, ces dés sont défaussés et on recommence à partir de l'étape 1. (Si les deux joueurs n'ont plus de dés simultanément, il y a égalité parfaite. Cela ne peut se produire que si les deux joueurs ont le même nombre de dés au départ).

Il ne devrait pas être difficile de voir que les étapes 2 et 3 ci-dessus peuvent être remplacées par la règle alternative suivante :

  1. (alternative) Si les dés les plus élevés sont à égalité, écartez (uniquement !) ces deux dés et recommencez à partir de l'étape 1.

Il est clair que si un joueur gagne avec la règle originale 2, il gagnera également avec (suffisamment d'itérations) de la règle alternative 2. De même, si les dés les plus forts des joueurs sont à égalité et qu'ils sont jetés en vertu de la règle originale 3, il devrait être clair que l'application de la règle alternative un nombre suffisant de fois aboutira au même résultat.

-1voto

Dale M Points 183702

Je pense que cela suffira : http://anydice.com/program/627f

Je n'ai pas mis en œuvre la rupture d'égalité.

function: sign S:s {
if S>0 { result: 1 }
if S<0 { result: -1 }
result: 0
}

function: A:n beats B:n {
A_DICE: Ad6
B_DICE: Bd6
A_MAX: [highest 1 of A_DICE]
B_MAX: [highest 1 of B_DICE]

WINS: [count B_MAX in A_DICE]-[count A_MAX in B_DICE]

result: [sign WINS]
}

loop A over {1..5} {
 loop B over {1..5} {
  output [A beats B] named "[A] beats [B]"
 }
}

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