FCC Simon游戏切换严格模式时重置功能异常问题求助
排查Simon游戏严格模式切换异常的问题
我看了你的代码和描述,切换严格模式时出现重复颜色、重复添加元素的问题,大概率是游戏逻辑重复触发+语法小错误导致的,咱们一步步来解决:
首先修复代码里的语法问题
你的两个addEventListener回调函数都缺少闭合的括号,这会导致语法错误,进而引发各种不可预期的行为:
// 修复后的代码 start.addEventListener("click", function(){ reset(); strict = false; game(); }); // 补上缺失的闭合括号 strictMode.addEventListener("click", function() { strict = true; strictLight.style.backgroundColor = "rgb(153, 0, 0)"; reset(); game(); }); // 补上缺失的闭合括号
核心问题:游戏逻辑重复执行
每次点击start或strictMode按钮,你都会调用reset()+game(),但如果之前的游戏实例没有被完全终止(比如定时器还在运行、颜色按钮的点击监听器没移除),就会导致多组游戏逻辑同时运行,最终出现重复添加颜色到数组的情况。
解决方案:添加游戏状态控制+完善重置逻辑
- 新增一个状态变量标记游戏是否正在运行,避免重复启动
- 在
reset()里彻底清空之前的游戏状态(包括定时器、事件监听器) - 优化严格模式的切换逻辑(改为点击切换开关,而非强制开启)
修改后的示例代码:
let isPlaying = false; let gameTimer; // 假设你用定时器控制颜色播放序列 function reset() { pickedColors = []; guessingColors = []; countNumber = 0; // 终止之前的定时器 if (gameTimer) clearTimeout(gameTimer); // 移除颜色按钮的点击监听器(如果之前绑定过) // 假设你的颜色按钮存在colorButtons数组里 colorButtons.forEach(btn => btn.removeEventListener('click', handleColorClick)); isPlaying = false; } start.addEventListener("click", function(){ reset(); strict = false; // 关闭严格模式指示灯 strictLight.style.backgroundColor = ""; game(); }); strictMode.addEventListener("click", function() { // 改为切换严格模式,更符合用户预期 strict = !strict; strictLight.style.backgroundColor = strict ? "rgb(153, 0, 0)" : ""; reset(); game(); }); function game() { // 如果正在游戏,直接返回避免重复启动 if (isPlaying) return; isPlaying = true; // 你的游戏初始化逻辑:生成第一个颜色、播放序列等 // 比如:pickedColors.push(getRandomColor()); // playSequence(pickedColors); }
额外检查点
确认你的game()函数中,颜色添加逻辑是每次游戏启动时从空数组开始生成,而不是在已有数组上追加。比如如果game()里每次调用都会直接push新颜色,那重复启动就会导致数组里多出来不必要的元素——这部分逻辑要和reset()的清空操作配合好。
内容的提问来源于stack exchange,提问作者Merim
相关产品推荐
相关产品推荐

