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

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(),但如果之前的游戏实例没有被完全终止(比如定时器还在运行、颜色按钮的点击监听器没移除),就会导致多组游戏逻辑同时运行,最终出现重复添加颜色到数组的情况。

解决方案:添加游戏状态控制+完善重置逻辑

  1. 新增一个状态变量标记游戏是否正在运行,避免重复启动
  2. 在reset()里彻底清空之前的游戏状态(包括定时器、事件监听器)
  3. 优化严格模式的切换逻辑(改为点击切换开关,而非强制开启)

修改后的示例代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:23:12