You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在掷骰子游戏中实现分数累加与追踪

掷骰子游戏总分累加问题解决

问题说明

开发掷骰子游戏时,无法实现每次掷骰子后自动累加顶部“Poäng”总分,需要将每次的“Summa kast”数值累加到总分中。

原HTML代码

<body>
    <header>
        <p class="score">Poäng: 0</p>
    </header>

    <main>
        <H1>Välj ditt "knockout" nummer:</H1>       
         <select name="" id="ko">
            <option value="6">6</option>
            <option value="7">7</option>
            <option value="8">8</option>
            <option value="9">9</option>
        </select>
<div class="dce">
        <p class="dice1">Tärning 1: - </p>
        <p class="dice2">Tärning 2: - </p>
        <p class="sumkast">Summa kast: 0 </p>
</div>
        <a href="#" class="btn">KASTA</a>
    </main>

    <footer>
        <section class="restart">
            <button onClick="window.location.reload();">BÖRJA OM</button>
        </section>
    </footer>

    <script src="js/spel.js"></script>
</body>
</html>

原JavaScript代码(含错误尝试)

let btn = document.getElementById("btn");
let dice = document.querySelectorAll("dice");
let diceArr1 = [1, 2, 3, 4, 5, 6];
let diceArr2 = [1, 2, 3, 4, 5, 6];

document.querySelector('a.btn')
.addEventListener('click', () => {

let diceRandom1 = Math.floor(Math.random() * diceArr1.length);
let diceRandom2 = Math.floor(Math.random() * diceArr2.length);
  let dice1 = diceArr1[diceRandom1];
  let dice2 = diceArr2[diceRandom2];
  console.log(dice1,dice2);
let rollpts = (dice1 + dice2);

// 错误尝试的代码
score = 0;
score += score+rollpts;
document.querySelector('p.score').innerText = "Poäng: "+ + + 
score;

document.querySelector('p.dice1').innerText = "Tärning 1: "+ + + dice1;
document.querySelector('p.dice2').innerText = "Tärning 2: "+ + + dice2;
document.querySelector('p.sumkast').innerText = "Summa kast: "+ + + rollpts;

var e = document.getElementById("ko");
function onChange() {
  var value = e.value;
  var text = e.options[e.selectedIndex].text;
  console.log(value, text);
}
e.onchange = onChange;
onChange();

if (rollpts == e.value) {
    alert("Game over! Tryck på RESTART om du vill köra igen!");
}

});

错误原因分析

  • 总分变量重置:每次点击按钮时都执行score = 0,导致之前的总分被清空,无法实现累加。
  • 累加逻辑错误:score += score+rollpts等价于score = score + (score + rollpts),会让总分翻倍再加当前点数,逻辑完全错误,正确累加应为score += rollpts。
  • 无效语法符号:字符串拼接时的+ + +属于冗余无效代码,只需单个+即可完成拼接。
  • 函数位置不合理:onChange函数定义在点击事件内部,每次点击都会重复定义,完全没必要。

修正后的完整JavaScript代码

// 初始化总分,放在点击事件外部避免每次重置
let totalScore = 0;
// 提前获取DOM元素,减少重复查询
const koSelect = document.getElementById("ko");
const scoreElement = document.querySelector('p.score');
const dice1Element = document.querySelector('p.dice1');
const dice2Element = document.querySelector('p.dice2');
const sumkastElement = document.querySelector('p.sumkast');

// 下拉框监听函数,只需定义一次
function onChangeKo() {
  const value = koSelect.value;
  const text = koSelect.options[koSelect.selectedIndex].text;
  console.log(value, text);
}
koSelect.onchange = onChangeKo;
onChangeKo();

// 掷骰子按钮点击事件
document.querySelector('a.btn').addEventListener('click', () => {
  // 简化骰子点数生成逻辑
  const dice1 = Math.floor(Math.random() * 6) + 1;
  const dice2 = Math.floor(Math.random() * 6) + 1;
  const rollpts = dice1 + dice2;

  // 更新总分
  totalScore += rollpts;
  scoreElement.innerText = `Poäng: ${totalScore}`;

  // 更新骰子和单次点数显示
  dice1Element.innerText = `Tärning 1: ${dice1}`;
  dice2Element.innerText = `Tärning 2: ${dice2}`;
  sumkastElement.innerText = `Summa kast: ${rollpts}`;

  // 游戏结束判断
  if (rollpts == koSelect.value) {
    alert("Game over! Tryck på RESTART om du vill köra igen!");
  }
});

关键修改点

  • 将总分变量totalScore定义在点击事件外部,确保每次点击不会重置累加值。
  • 简化骰子点数生成,直接用Math.floor(Math.random()*6)+1生成1-6的随机数,无需额外数组。
  • 使用模板字符串${变量}替代冗余的字符串拼接符号,代码更简洁易读。
  • 将下拉框监听函数移到点击事件外部,避免重复定义。
  • 提前获取所有需要操作的DOM元素,减少重复查询DOM的性能消耗。

内容的提问来源于stack exchange,提问作者Portello

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:57:50