切换难度后按空格键触发打字测速游戏重置的问题求助
切换难度后按空格键触发打字测速游戏重置的问题求助
嘿,我仔细看了你的代码和问题描述,很快就找到问题根源啦!
问题到底出在哪?
你现在的handleDifficultyChange函数里,切换难度时直接调用了resetGame()——这个函数会把所有游戏状态(计时器、打字速度、准确率、当前输入位置、错误计数)全重置为初始值,还会重新拉取对应难度的文本。所以其实在你切换难度的那一刻,游戏已经被重置了,之后按空格键触发的只是新游戏的计时启动,但你误以为是按空格导致的重置。
而你的期望是切换难度后,只是更新文本内容,保持游戏进程不中断(比如计时器继续走,不需要从头开始),对吧?
解决方案
我们需要修改handleDifficultyChange函数,不再调用resetGame(),而是单独处理难度切换的逻辑:只更新文本、重置当前输入位置,同时保留计时器和统计数据(你也可以根据需求调整是否保留统计)。
修改后的代码
把原来的handleDifficultyChange函数替换成下面这样,同时新增一个更新文本的专用函数:
function handleDifficultyChange(e) { const selectedDifficulty = e.target.getAttribute("data-difficulty"); currentDifficulty = selectedDifficulty; // 不再调用resetGame,改用自定义的文本更新函数 updateSampleText(); difficultyOptions.classList.remove("active"); highlightCurrentDifficulty(); } // 新增:专门用于切换难度时更新文本的函数 async function updateSampleText() { // 记录计时器之前是否在运行 const wasTimerRunning = !!startTime; // 获取对应难度的新文本 sampleText = await getWords(currentDifficulty); // 更新页面上的文本显示 textDisplay.innerHTML = sampleText .split("") .map((char) => `<span>${char}</span>`) .join(""); // 重置当前输入位置和光标样式 currentIndex = 0; const spans = textDisplay.querySelectorAll("span"); spans.forEach((span) => { span.classList.remove("correct", "incorrect", "current"); }); initializeCursor(); // 如果之前计时器在运行,继续保持计时状态 if (wasTimerRunning && !timerInterval) { startTimer(); } }
如果切换难度后你希望重置统计数据(比如错误计数、速度显示),可以在updateSampleText里加上这几句:
// 可选:重置统计数据 mistakesCounter = 0; speedDisplay.textContent = "0"; accuracyDisplay.textContent = "0";
额外说明
如果你其实是希望切换难度后启动新的一轮游戏,但不想让按空格时看起来像“二次重置”,那可以在切换难度后自动启动计时器,或者在界面上提示用户已经进入新游戏。但从你的期望描述来看,上面的修改更贴合你的需求。
备注:内容来源于stack exchange,提问作者Zoooriiel
相关产品推荐
相关产品推荐

