如何阻止玩家通过重复输入正确字母刷分?
解决重复输入正确字母刷分的问题
嘿,我太懂这种没喝咖啡脑子转不动的状态了😅,咱们来一步步搞定你的问题!
首先,你的核心问题是:玩家可以重复输入同一个正确字母,每次都能加1分直到满5分,但实际上每个正确字母(或者说每个未填充的单词位置)应该只加一次分。咱们来看看代码里的问题,再给你修复方案:
问题根源分析
你的代码里有两个关键问题:
- 没检查字母是否已被猜中过:循环里只要匹配到正确字母且分数<5就直接加分,完全没看这个位置的
correctLetters是不是已经被填充了——所以玩家重复按同一个正确字母时,每次都会触发加分。 found变量完全没被利用:你定义了let found = false,但后面从来没给它赋值,导致后面的if(found) return永远不会执行,错误字母的处理逻辑也容易出问题。
修复后的代码
function checkLetter() { document.onkeyup = function (event) { const guess = event.key.toLowerCase(); // 用const避免全局变量污染 let found = false; let newCorrectCount = 0; // 记录这次猜中了多少个新的未填充字母 // 提前过滤无效操作:已经猜过的错误字母/已经满分 if (wrongLetters.includes(guess) || score >= 5) { return; } // 遍历单词所有位置,填充未被匹配的正确字母 for (let i = 0; i < word.length; i++) { if (guess === word[i] && !correctLetters[i]) { correctLetters[i] = guess; newCorrectCount++; found = true; } } // 处理猜中正确字母的情况 if (found) { score += newCorrectCount; scoreBox.innerHTML = score; letterSpace(); // 满分时可以添加胜利逻辑 if (score === 5) { alert("恭喜你赢了!"); // 这里可以加winGame()函数,如果有的话 } return; } // 处理猜错字母的情况 if (attempts > 0) { wrongLetters.push(guess); document.getElementById("used-letters-box").innerHTML = wrongLetters.join(''); attempts -= 1; attemptsBox.innerHTML = attempts; } // 检查是否输掉游戏 if (attempts === 0 && score < 5) { loseGame(); } }; }
关键修改点说明
- 新增
newCorrectCount:用来统计这次猜中了多少个未被填充的正确字母位置,重复输入同一个字母时,这个值会是0,自然不会加分。 - 检查
correctLetters[i]状态:只有当对应位置还没被填充时,才会更新数组并计数,从根源上阻止重复加分。 - 修复
found变量的使用:猜中正确字母时把found设为true,确保后续逻辑分支正确。 - 提前过滤无效操作:如果字母已经在错误列表里,或者已经满分,直接返回,避免多余的循环判断。
- 用
let i替代全局i:原始代码里的i是全局变量,可能导致后续循环出问题,用块级作用域的let更安全。
这样修改后,玩家重复输入同一个正确字母就再也刷不了分啦!下次写代码前记得先喝杯咖啡☕,思路会清晰很多~
内容的提问来源于stack exchange,提问作者JerryCoin
相关产品推荐
相关产品推荐

