javascript - 计算 DnD 掷骰子应用的平均伤害
问题描述
我是 JS 新手(不到 20 小时),并且正在构建一个 Web 应用程序作为一种学习方式,可以像在 DnD 中一样掷骰子。它似乎工作正常,除了我不明白如何在每轮造成的伤害中增加致命一击。
如果您不熟悉,在 DnD 中,每次攻击都有机会根据临界百分比造成双倍伤害(骰子和奖金),我希望这能以每轮平均伤害表示。向您展示我到目前为止所做的工作可能会更容易,所以请看一下:
// Bonuses
const strenghBonus = document.querySelector('.strBonus');
const enchantmentBonus = document.querySelector('.enchBonus');
const otherBonus = document.querySelector('.otherBonus');
const totalDamageBonus = document.querySelector('.totalDamageBonus');
document.querySelectorAll('.bonus').forEach((item) => {
item.addEventListener('click', calculateDamageBonus);
});
function calculateDamageBonus() {
totalDamageBonus.value = Number(strenghBonus.value) + Number(enchantmentBonus.value) + Number(otherBonus.value);
}
// Rolls
const rollDamage = document.querySelector('.rollDamage');
const rollMinDamage = document.querySelector('.rollMinDamage');
const rollMaxDamage = document.querySelector('.rollMaxDamage');
const rollAverageDamage = document.querySelector('.rollAverageDamage');
// Totals
const totalDamage = document.querySelector('.totalDamage');
const minTotalDamage = document.querySelector('.minTotalDamage');
const maxTotalDamage = document.querySelector('.maxTotalDamage');
const averageTotalDamage = document.querySelector('.averageTotalDamage');
const minDamagePerRound = document.querySelector('.minDamagePerRound');
const maxDamagePerRound = document.querySelector('.maxDamagePerRound');
const averageDamagePerRound = document.querySelector('.averageDamagePerRound');
const criticalHitChance = document.querySelector('.criticalHit').value;
function rollDice() {
let numberOfDice = document.querySelector('.numberOfDice').value;
let numberOfSides = document.querySelector('.numberOfSides').value;
let diceTotal = 0;
let attacksPerRound = document.querySelector('.attacksPerRound').value;
for (i = 1; i <= numberOfDice; i++) {
diceTotal += Math.floor(Math.random() * numberOfSides + 1);
}
rollDamage.value = diceTotal;
rollMinDamage.value = numberOfDice;
rollMaxDamage.value = numberOfDice * numberOfSides;
rollAverageDamage.value = (numberOfSides + 1) / 2 * numberOfDice / 10;
totalDamage.value = diceTotal + Number(totalDamageBonus.value);
minTotalDamage.value = Number(rollMinDamage.value) + Number(totalDamageBonus.value);
maxTotalDamage.value = Number(rollMaxDamage.value) + Number(totalDamageBonus.value);
averageTotalDamage.value = Number(rollAverageDamage.value) + Number(totalDamageBonus.value);
minDamagePerRound.value = Number(minTotalDamage.value) * attacksPerRound;
maxDamagePerRound.value = Number(maxTotalDamage.value) * attacksPerRound;
}
function resetForm() {
document.getElementById('myForm').reset();
}
* {
box-sizing: border-box;
}
.container {
display: flex;
width: 100%;
height: 100%;
}
.column {
flex: 1;
color: white;
align-items: center;
justify-content: center;
text-align: center;
padding: 20px 20px;
}
.bonusesColumn {
background-color: red;
}
.diceColumn {
background-color: green;
}
.totalsColumn {
background-color: blue;
}
.attribute {
margin-top: 20px;
}
.dropDown {
padding: 2px;
width: 40%;
height: 100%;
margin: 2px;
}
input {
padding: 2px;
margin: 2px;
width: 40%;
height: 100%;
}
label {
display: block;
}
.hitDice {
justify-content: center;
align-items: center;
display: flex;
margin: 5px 2px;
}
.hitDice p {
margin: 15px 5px;
}
.buttonsAndDamage {
margin: 10px;
}
<body>
<form id="myForm">
<div class="container">
<div class="column bonusesColumn">
<div class="attribute">
<label>Strength Bonus</label>
<input class="bonus strBonus" type="number" min="o" placeholder="0" value="0">
</div>
<div class="attribute">
<label>Enchantment Bonus</label>
<input class="bonus enchBonus" type="number" min="o" placeholder="0" value="0">
</div>
<div class="attribute">
<label>Other Bonus</label>
<input class="bonus otherBonus" type="number" min="o" placeholder="0"value="0" >
</div>
<div class="attribute">
<label>Total Damage Bonus </label>
<input class="totalDamageBonus" type="number" min="o" placeholder="0"value="0" readonly>
</div>
<div class="attribute">
<label>Attacks Per Round</label>
<select class="attacksPerRound dropDown" value="0" type="number">
<option value="1">1</option>
<option value="1.5">1.5</option>
<option value="2">2</option>
<option value="2.5">2.5</option>
<option value="3">3</option>
<option value="3.5">3.5</option>
<option value="4">4</option>
<option value="4.5">4.5</option>
<option value="5">5</option>
</select>
</div>
<div class="attribute">
<label>Critical Hit Roll</label>
<select class="criticalHit dropDown" value="0" type="number">
<option type="number" value="1">1</option>
<option type="number" value="0.95">2</option>
<option type="number" value="0.9">3</option>
<option type="number" value="0.85">4</option>
<option type="number" value="0.8">5</option>
<option type="number" value="0.75">6</option>
<option type="number" value="0.7">7</option>
<option type="number" value="0.65">8</option>
<option type="number" value="0.6">9</option>
<option type="number" value="0.55">10</option>
<option type="number" value="0.5">11</option>
<option type="number" value="0.45">12</option>
<option type="number" value="0.40">13</option>
<option type="number" value="0.35">14</option>
<option type="number" value="0.30">15</option>
<option type="number" value="0.25">16</option>
<option type="number" value="0.20">17</option>
<option type="number" value="0.15">18</option>
<option type="number" value="0.1">19</option>
<option type="number" selected="selected" value="0.05">20</option>
</select>
</div>
</div>
<div class="column diceColumn">
<div class="hitDice">
<input class="dice numberOfDice" type="number" min="0" placeholder="0" value="0">
<p>D</p>
<input class="dice numberOfSides" type="number" min="0" placeholder="0" value="0">
</div>
<div class="buttonsAndDamage">
<div>
<button type="button" onclick="rollDice()">ROLL</button>
<button type="button" onclick="resetForm()">RESET</button>
</div>
<div class="attribute">
<label>Damage</label>
<input class="rollDamage" type="number" min="0" placeholder="0" value="0" readonly>
</div>
<div class="attribute">
<label>Minimum Damage</label>
<input class="rollMinDamage" type="number" min="0" placeholder="0" value="0" readonly>
</div>
<div class="attribute">
<label>Maximum Damage</label>
<input class="rollMaxDamage" type="number" min="0" placeholder="0" value="0" readonly>
</div>
<div class="attribute">
<label>Average Damage</label>
<input class="rollAverageDamage" type="number" min="0" placeholder="0" value="0" readonly>
</div>
</div>
</div>
<div class="column totalsColumn">
<div class="attribute">
<label>Total Damage</label>
<input class="totalDamage" type="number" min="0" placeholder="0" value="0" readonly>
</div>
<div class="attribute">
<label>Minimum Total Damage</label>
<input class="minTotalDamage" type="number" min="0" placeholder="0" value="0" readonly>
</div>
<div class="attribute">
<label>Maximum Total Damage</label>
<input class="maxTotalDamage" type="number" min="0" placeholder="0" value="0" readonly>
</div>
<div class="attribute">
<label>Average Total Damage</label>
<input class="averageTotalDamage" type="number" min="0" placeholder="0" value="0" readonly>
</div>
<div class="attribute">
<label>Minimum Damage Per Round</label>
<input class="minDamagePerRound" type="number" min="0" placeholder="0" value="0" readonly>
</div>
<div class="attribute">
<label>Maximum Damage Per Round</label>
<input class="maxDamagePerRound" type="number" min="0" placeholder="0" value="0" readonly>
</div>
<div class="attribute">
<label>Average Damage Per Round</label>
<input class="averageDamagePerRound" type="number" min="0" placeholder="0" value="0" readonly>
</div>
</div>
</div>
</form>
<script type="text/javascript" src="index.js"></script>
</body>
我在另一个论坛上问了这个问题,但我得到的答案,虽然非常感谢,但完全超出了我的想象。 https://rpg.stackexchange.com/questions/170602/what-is-the-formula-for-damage-per-round/170604#170604
请帮我解决这个问题,以及是否还有其他需要更改/可以改进的部分。
谢谢
解决方案
n 面骰子的平均掷骰数为 (n+1)/2。所以,如果你有 4d4+1d12+6,平均掷骰数是4*(2.5)+(6.5)+6 = 22.5
最低卷:4+1+6 = 11
最高卷:16+12+6=34
推荐阅读
- java - 将 SQL 更改为 Criteria 或 HQL
- python - Gstreamer 在一个元素中链接 udpsink 和 udpsrc (C++)
- html - 如何使下面的块的z-index小于上面的块之一
- javascript - 用于以检查格式打印行条目的 JavaScript 或 jQuery 表格的每一行都应通过打印链接单独打印
- ansible - Ansible 过滤器中的 Ansible Vault 单变量
- c++ - 如何编写需要回调的 C 函数的 C++ 包装类方法?
- google-apps-script - G Suite Marketplace SDK [发布] 按钮总是灰显?
- ios - Apple App Store 显示应用程序的通用大小,而不是应用程序的单个安装大小
- amazon-web-services - 查询分区 athena 表以获取 aws alb 日志时出现问题
- c# - 在 C# 中在 Google Analytics 中跟踪服务器端重定向