如何通过JavaScript猜词游戏的自动化测试?
如何通过JavaScript猜词游戏的自动化测试?
我看了你的代码和测试需求,发现几个关键问题导致你无法通过测试,下面逐个分析并给出修复方案:
一、核心问题分析
- 变量名冲突:你一开始声明了
var wins = 0来跟踪胜利次数,但后面又用var wins = document.getElementById('wins')把同一个变量赋值为DOM元素,直接覆盖了原来的数值变量,导致后续wins.innerText++的逻辑完全错误。同理,loss和losses变量名不一致,容易混淆出错。 - 冗余代码干扰:你在正确猜测时保留了对
currentWord的修改代码(即便注释了核心修改行),这会让代码逻辑变得混乱,影响后续猜测的判断准确性。 - 字符串操作风险:直接对
remainingGuess.textContent做--操作,textContent返回的是字符串,虽然JS会自动转换,但显式转换成数字再操作更可靠,避免潜在bug。 - 状态重置的细节遗漏:虽然你写了重置函数,但变量分离不清晰,导致部分状态更新不彻底。
二、修复后的完整代码
var words = [ 'bananas', 'grapes', 'carousel', 'milkshake', 'javascript', 'limousine', 'chocolate', 'programming', 'meatloaf', 'ukulele', 'mango' ]; // 游戏状态变量 let correctGuesses = []; let incorrectGuesses = []; let guessedLetters = []; const maxGuesses = 10; let winsCount = 0; // 单独变量跟踪胜利次数 let lossesCount = 0; // 单独变量跟踪失败次数 // DOM元素获取(和状态变量分离) const wordToGuess = document.getElementById('word-to-guess'); const remainingGuess = document.getElementById('remaining-guesses'); const incorrectLetters = document.getElementById('incorrect-letters'); const previousWord = document.getElementById('previous-word'); const winsDisplay = document.getElementById('wins'); const lossesDisplay = document.getElementById('losses'); // 初始化游戏 function initGame() { remainingGuess.textContent = maxGuesses; currentWord = words[Math.floor(Math.random() * words.length)]; tempCurrentWord = currentWord; hiddenWord = Array(currentWord.length + 1).join('_'); wordToGuess.textContent = hiddenWord; } initGame(); // 键盘事件处理 document.onkeyup = function(e) { const key = e.key.toLowerCase(); const letterRegex = /^[a-z]$/; // 过滤非字母和已猜测的字母 if (!letterRegex.test(key) || guessedLetters.includes(key)) { return; } guessedLetters.push(key); if (currentWord.includes(key)) { correctGuesses.push(key); const hiddenWordLetters = hiddenWord.split(''); // 替换所有匹配的字母 for (let i = 0; i < currentWord.length; i++) { if (currentWord[i] === key) { hiddenWordLetters[i] = key; } } hiddenWord = hiddenWordLetters.join(''); wordToGuess.textContent = hiddenWord; // 判断胜利 if (hiddenWord === tempCurrentWord) { winsCount++; winsDisplay.textContent = winsCount; resetGame(); } } else { incorrectGuesses.push(key); incorrectLetters.textContent = incorrectGuesses.join(', '); // 显式转换为数字后减1 remainingGuess.textContent = parseInt(remainingGuess.textContent) - 1; // 判断失败 if (parseInt(remainingGuess.textContent) === 0) { lossesCount++; lossesDisplay.textContent = lossesCount; resetGame(); } } }; // 重置游戏函数 function resetGame() { // 显示上一个单词 previousWord.textContent = tempCurrentWord; // 初始化新游戏 initGame(); // 清空猜测记录 incorrectGuesses = []; guessedLetters = []; incorrectLetters.textContent = ""; }
三、关键修复点说明
- 变量彻底分离:把跟踪次数的数值变量(
winsCount、lossesCount)和DOM显示变量完全分开,从根源解决变量覆盖问题。 - 模块化初始化:新增
initGame函数统一处理游戏初始化逻辑,让代码更清晰,避免重复代码。 - 可靠的数值操作:对剩余猜测数先转换为数字再增减,彻底避免字符串操作的意外问题。
- 移除冗余代码:删除了对
currentWord的不必要修改,让currentWord始终保持原单词,确保后续猜测判断准确。
这样修改后,你的游戏就能满足所有测试要求:
- 正确统计胜利/失败次数并更新显示
- 胜利/失败后正确重置状态、显示上一个单词
- 准确过滤重复猜测和非字母输入
- 正确更新正确/错误猜测的显示内容
备注:内容来源于stack exchange,提问作者hotmess23
相关产品推荐
相关产品推荐

