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

如何重复switch语句并保留历史输出?骰子随机数生成器开发求助

解决方案:实现可重复掷骰并保留历史记录

先梳理下你的代码问题,再给出针对性的优化方案:


核心问题分析

  1. 变量重复声明:每个case里用var roll重新声明变量,会覆盖全局的roll,无法有效保存历史值。
  2. 循环逻辑错误:while(repeat = 3)是赋值操作(永远为真),不是条件判断,而且逻辑上应该让用户自主选择是否继续掷骰。
  3. 冗余代码:每个case的掷骰逻辑高度重复,可大幅简化。
  4. 页面覆盖问题:document.write会清空页面内容,不适合多次输出结果。

优化后的完整代码

下面的代码实现了重复掷骰功能,同时完整保留每次的掷骰记录:

// 存储所有历史掷骰结果的数组
let rollHistory = [];
// 允许的骰子面数集合
const validDice = [4, 6, 8, 10, 12, 20, 100];

do {
  let diceInput = prompt("请输入骰子面数(可选:4、6、8、10、12、20、100)");
  let diceSides = parseInt(diceInput);

  // 验证输入是否合法
  if (validDice.includes(diceSides)) {
    // 生成随机掷骰结果
    let roll = Math.floor(Math.random() * diceSides) + 1;
    // 保存到历史记录
    rollHistory.push({ 骰子: `d${diceSides}`, 结果: roll });

    // 拼接输出文本
    let output = `本次掷d${diceSides}结果:${roll}\n\n历史记录:\n`;
    rollHistory.forEach((item, index) => {
      output += `${index + 1}. ${item.骰子}:${item.结果}\n`;
    });
    alert(output);
  } else {
    alert("输入无效!请输入指定的骰子面数,比如掷d4就输入'4'。");
  }

  // 询问用户是否继续掷骰
  let repeat = confirm("要继续掷骰吗?");
} while (repeat); // 用户点击确定则重复循环

关键改进点

  • 历史记录存储:用数组rollHistory保存每次的骰子类型和结果,随时可以查看过往记录。
  • 简化验证逻辑:用validDice.includes()替代冗长的switch判断,代码更简洁易维护。
  • 合理循环结构:do-while循环保证至少执行一次掷骰,再根据用户选择决定是否继续。
  • 友好输出方式:用alert展示结果和历史,避免覆盖页面内容。
  • 变量规范:用let替代var,块级作用域更清晰,避免变量提升问题。

保留原有switch结构的修改版本

如果不想大幅改动原有代码结构,也可以这样调整,保留switch同时实现需求:

let rollHistory = [];
let continueRolling = true;

while (continueRolling) {
  let Dice = prompt("The options are the d4, d6, d8, d10, d12, d20, and d100.");
  let roll;

  switch (parseInt(Dice)) {
    case 4:
      roll = Math.floor(Math.random() * 4) + 1;
      break;
    case 6:
      roll = Math.floor(Math.random() * 6) + 1;
      break;
    case 8:
      roll = Math.floor(Math.random() * 8) + 1;
      break;
    case 10:
      roll = Math.floor(Math.random() * 10) + 1;
      break;
    case 12:
      roll = Math.floor(Math.random() * 12) + 1;
      break;
    case 20:
      roll = Math.floor(Math.random() * 20) + 1;
      break;
    case 100:
      roll = Math.floor(Math.random() * 100) + 1;
      break;
    default:
      alert("Just put the number of sides the die has. Example: to roll a d4, input '4'.");
      continue; // 跳过本次循环,重新询问输入
  }

  // 保存历史记录
  rollHistory.push({ dice: `d${Dice}`, result: roll });
  // 展示结果和历史
  let displayText = `You rolled a ${roll} on d${Dice}\n\nPrevious rolls:\n`;
  rollHistory.forEach((entry, i) => {
    displayText += `${i+1}. ${entry.dice}: ${entry.result}\n`;
  });
  alert(displayText);

  // 询问是否继续
  continueRolling = confirm("Roll again?");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:31:06