Vous ne pouvez pas inclure de manière significative les coups critiques sans tenir compte des probabilités de succès
Un bref discussion des variables aléatoires: une fonction mesurable définie sur un espace de probabilité qui mappe de l'espace d'échantillonnage aux nombres réels.
Les dégâts infligés lors d'un coup sont une variable aléatoire - appelons-la \$D\$. Celle-ci est composée d'autres variables, certaines aléatoires et d'autres non:
$$ D=\sum_{n=1}^\text{diceNumber}U(\text{diceSides})+\text{bonuses} $$
où \$U(n)\$ est la loi uniforme discrète de \$1\$ à \$n\$ une variable aléatoire et les autres variables sont vos variables.
Cela peut simuler \$U(n)\$ bien que notez que la fonction rand
est seulement pseudo-aléatoire mais cela n'aura pas d'importance pour vos besoins:
Math.floor(Math.random() * n + 1)
Comme un coup critique double le nombre de dés et les bonus, il est représenté par la variable aléatoire:
$$ C=\sum_{n=1}^{2\times\text{diceNumber}}U(\text{diceSides})+2\times\text{bonuses} $$
Pour les moyennes, vous pouvez calculer toutes les issues possibles avec des boucles imbriquées et ensuite calculer la moyenne. Cependant, il y a un raccourci mathématique - la moyenne de la somme de variables aléatoires indépendantes est égale à la somme des moyennes. De même, la variance de la somme de variables aléatoires indépendantes est égale à la somme des variances.
Ainsi:
$$ \begin{align} \bar D &= \text{diceNumber} \times \left(\bar U(\text{DiceSides})\right) +\text{bonuses}\\ &= \text{diceNumber} \times \left({{\text{DiceSides}+1}\over 2} \right) +\text{bonuses}\\ \bar C &= 2 \times \left( \text{diceNumber} \times \left({{\text{DiceSides}+1}\over 2} \right) +\text{bonuses}\right)\\ \end{align} $$
Donc, maintenant nous revenons à la raison pour laquelle vous avez besoin d'une variable aléatoire pour représenter vos chances de succès. Pour toute combinaison donnée de classe d'armure et de bonus à l'attaque il existe un nombre cible \$t\$ que vous devez obtenir sur un d20 égal ou supérieur auquel c'est un succès et en dessous c'est un échec et si vous obtenez un 20 vous obtenez un critique. Je suppose qu'un 20 est toujours un succès et toujours un coup critique: si vous pouvez échouer sur un 20, vous devez ajuster ce qui suit.
Ainsi les dégâts d'une attaque, incluant la chance de toucher, peuvent être représentés par une autre variable aléatoire:
$$ H = \begin{cases} 0, &U(20)\lt t\\ D, &20\gt U(20)\ge t\\ C, &U(20)=20\\ \end{cases} $$
Si vous êtes seulement intéressé par les moyennes, vous obtenez:
$$ \bar H = \sum\begin{cases} 0\times Pr(U(20)\lt t)\\ \bar D \times Pr(20\gt U(20)\ge t)\\ \bar C \times Pr(U(20)=20)\\ \end{cases} $$
Où \$Pr(E)\$Pr est la probabilité que l'événement \$E\$ se produise.
Pour \$20\ge t \ge 1\$, \$Pr(20\gt U(20)\ge t)=0.05\times (20-t)\$, pour \$t\gt 20\$, \$Pr(20\gt U(20)\ge t)=0\$ et pour \$t\lt 1\$, \$Pr(20\gt U(20)\ge t)=0.95\$. \$Pr(U(20)=20)=0.05\$ toujours.