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

分支场景项目添加骰子功能失败:JS代码崩溃求助

问题:分支场景游戏添加骰子功能后程序停止运行

我完成了一个学校的分支场景项目(基于HTML/CSS/JavaScript),想在id为19、23、29、34的节点加入骰子功能提升交互性,但添加后整个程序直接停止运行。我试过编写rollDice函数嵌入对应节点,也尝试过跳转到包含JavaScript的次级HTML页面,都没能解决问题。


我尝试的骰子函数

// 掷骰子函数
function rollDice() {
    // 生成1-6的随机数
    let diceRoll = Math.floor(Math.random() * 6) + 1;
    
    // 显示结果
    document.getElementById('diceResult').innerHTML = `你掷出了:${diceRoll}`;
    
    // 更新骰子图片(可选,假设存在dice1.png到dice6.png的图片)
    let diceImage = document.getElementById('diceImage');
    diceImage.src = `dice${diceRoll}.png`;
}

项目核心代码

JavaScript核心逻辑

"use strict";
const heading_element = document.getElementById('heading'); // 用于更新场景标题
const txt_element = document.getElementById('txt'); // 用于更新场景文本
const buttonsContainer = document.getElementById('buttons-container'); // 用于动态生成选项按钮

// 场景节点数组
const steps = [
  {
    id: 0,
    heading: "Pros. VS Cons",
    txt: "一场决策之旅",
    options: [
      { target: 1, txt: "规则" },
      { target: 2, txt: "开始" }
    ]
  },
  // 其余节点内容省略,完整代码包含id为19、23、29、34的机会节点
];

function scenarieStart(stepIndex) {
  const currentStep = steps[stepIndex];
  heading_element.textContent = currentStep.heading;
  txt_element.textContent = currentStep.txt;
  buttonsContainer.innerHTML = "";
  currentStep.options.forEach((option, index) => {
    const button = document.createElement("button");
    button.textContent = option.txt;
    button.classList.add("btn");
    button.addEventListener("click", () => {
      scenarieStart(option.target);
    });
    buttonsContainer.appendChild(button);
  });
}
scenarieStart(0);

HTML结构

<title>Pros._VS_Cons!</title>
<link rel="stylesheet" href="css/style.css">
<script src="script.js" defer></script>

<img src="img/bg_1-100.jpg" alt="Windows 95复古背景" aria-hidden="true" class="bg">
<header id="header"></header>
<main class="window">
  <div class="branch">
    <div id="heading">标题</div>
    <div id="txt">文本</div>
    <div id="buttons-container">
      <button class="btn">选项1</button>
      <button class="btn">选项2</button>
      <button class="btn">选项3</button>
    </div>
  </div>
</main>

问题原因及解决办法

1. 缺失DOM元素导致报错

你的rollDice函数直接调用了diceResult和diceImage元素,但当前HTML中完全没有这两个节点,执行时会抛出Cannot set property 'innerHTML' of null类错误,直接阻断程序运行。

解决:
在HTML的.branch容器内添加骰子相关元素:

<div class="branch">
  <div id="heading">标题</div>
  <div id="txt">文本</div>
  <!-- 新增骰子功能所需元素 -->
  <div id="diceResult"></div>
  <img id="diceImage" src="dice1.png" alt="骰子" style="display:none;">
  <div id="buttons-container">
    <button class="btn">选项1</button>
    <button class="btn">选项2</button>
    <button class="btn">选项3</button>
  </div>
</div>

2. 骰子功能未正确嵌入目标节点

需要在场景切换函数中判断当前节点是否为需要骰子功能的id,动态添加骰子按钮,而非硬编码函数。

修改scenarieStart函数:

function scenarieStart(stepIndex) {
  const currentStep = steps[stepIndex];
  heading_element.textContent = currentStep.heading;
  txt_element.textContent = currentStep.txt;
  buttonsContainer.innerHTML = "";

  // 标记需要骰子功能的节点id
  const diceStepIds = [19,23,29,34];
  if(diceStepIds.includes(currentStep.id)){
    // 创建掷骰子按钮
    const diceBtn = document.createElement("button");
    diceBtn.textContent = "掷骰子";
    diceBtn.classList.add("btn");
    diceBtn.addEventListener("click", rollDice);
    buttonsContainer.appendChild(diceBtn);
    // 显示骰子图片
    document.getElementById('diceImage').style.display = "block";
  }

  // 生成常规选项按钮
  currentStep.options.forEach((option, index) => {
    const button = document.createElement("button");
    button.textContent = option.txt;
    button.classList.add("btn");
    button.addEventListener("click", () => {
      scenarieStart(option.target);
      // 切换场景后隐藏骰子元素
      document.getElementById('diceResult').innerHTML = "";
      document.getElementById('diceImage').style.display = "none";
    });
    buttonsContainer.appendChild(button);
  });
}

3. 放弃次级页面跳转逻辑

跳转页面会重置当前游戏状态,完全没必要。直接在当前页面动态控制骰子元素的显示/隐藏,就能保持游戏流程的连贯性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:00:55