如何重复switch语句并保留历史输出?骰子随机数生成器开发求助
解决方案:实现可重复掷骰并保留历史记录
先梳理下你的代码问题,再给出针对性的优化方案:
核心问题分析
- 变量重复声明:每个
case里用var roll重新声明变量,会覆盖全局的roll,无法有效保存历史值。 - 循环逻辑错误:
while(repeat = 3)是赋值操作(永远为真),不是条件判断,而且逻辑上应该让用户自主选择是否继续掷骰。 - 冗余代码:每个
case的掷骰逻辑高度重复,可大幅简化。 - 页面覆盖问题:
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
相关产品推荐
相关产品推荐

