JS Cookie猜数字游戏积分异常、用户名重复弹窗问题求解
问题根源
现有代码不符合预期的核心原因有3点:
- 用户名输入、积分初始化逻辑全部写在递归调用的
guessingGame函数内部,每次进入下一关触发函数递归时,都会重新弹出用户名输入框、同时把积分重置为0,直接导致重复弹窗、积分无法累加 - 积分更新逻辑混乱:猜对后先执行一次积分+1存Cookie,递归调用下一关结束后又重复执行一次积分+1存Cookie的冗余操作,逻辑顺序完全错误
- 缺少Cookie读取逻辑,游戏启动时无法获取之前已经存储的用户名和积分数据,每次重新开始都相当于重置状态
修复后完整代码
// 新增Cookie读取工具方法,用于获取已存储的用户名、积分数据 const getCookie = (name) => { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) return parts.pop().split(';').shift(); return null; }; playButton.addEventListener("click", () => { // 用户名、积分变量移到递归函数外层,递归进入下一关时不会重置值 let playerName = getCookie("username"); let point = Number(getCookie("point")) || 0; // 仅当Cookie中没有已存用户名时,才弹出输入框 if (!playerName) { playerName = prompt("请输入用户名"); setCookie("username", playerName, 1); } const guessingGame = (range) => { const rndGuess = Math.floor(Math.random() * range) + 1; console.log("当前关卡正确答案:", rndGuess); const guess = prompt(`请猜一个1到${range}之间的数字`); // 用户点击取消按钮时直接终止游戏 if (guess === null) return; const playerGuess = Number(guess); if (rndGuess === playerGuess) { // 猜对后累加积分、存入Cookie,再进入下一关 point += 1; setCookie("point", point, 1); alert(`恭喜猜对!${playerName},你当前累计积分为${point}分`); // 范围上限加1,进入下一关 guessingGame(range + 1); } else { // 猜错后积分清零,同步更新Cookie point = 0; setCookie("point", point, 1); alert("猜错了,游戏结束!"); } }; // 初始第一关猜数范围为1-2 guessingGame(2); });
改动说明
- 新增通用
getCookie方法,游戏启动时优先读取本地Cookie存储的用户名和积分,避免重复弹出用户名输入框 - 将用户名、积分变量的声明移到
guessingGame函数外层的点击事件回调作用域中,递归进入下一关时不会重置这两个值,保证积分可以正常累加 - 删除了递归调用后重复执行的积分累加、Cookie存储逻辑,仅在猜对判断分支内执行一次积分更新,避免逻辑混乱
- 增加了用户点击猜数弹窗「取消」按钮的终止逻辑,避免空值进入数字判断导致异常
- 猜错时同步将Cookie中存储的积分清零,保证页面存储数据和游戏实际状态一致
- 所有用户提示文本已替换为中文,符合中文使用场景
内容的提问来源于stack exchange,提问作者AbdulAzeez Olanrewaju
相关产品推荐
相关产品推荐

