JavaScript初学者求助:修复Hangman游戏重复猜字母的Bug
修复Hangman游戏中重复猜正确字母导致remainingLetters异常递减的Bug
你的问题出在循环更新answerArray和remainingLetters的逻辑里——现在只要猜中的字母和单词里的字符匹配,不管这个位置已经被填过(不是下划线),都会执行remainingLetters--,所以重复猜同一个正确字母时,这个数值会持续减少,破坏游戏的结束判断逻辑。
按照提示的思路,只需要在更新answerArray和递减remainingLetters之前,先判断对应位置的answerArray[j]是不是下划线(也就是这个位置还没被填对过),只有满足这个条件时才执行后续操作。
修改后的核心逻辑部分
else { for (var j = 0; j < word.length; j++) { // 新增判断:仅当该位置未被填充时才更新 if (word[j] === guess && answerArray[j] === "_") { answerArray[j] = guess; remainingLetters--; } } }
完整优化后的代码
<script> // 设置最大尝试次数 var maximumTries = 10; // 单词数组 var words = [ "quail", "chicken", "kookaburra", "parrot" ]; // 随机选择单词 var word = words[Math.floor(Math.random() * words.length)]; // 初始化答案数组 var answerArray = []; for (var i = 0; i < word.length; i++) { answerArray[i] = "_"; } var remainingLetters = word.length; // 存储所有已猜字母 var guessAll = ""; // 游戏循环 while (remainingLetters > 0 && guessAll.length < maximumTries) { // 展示当前进度 alert(answerArray.join(" ")); // 获取玩家输入 var guess = prompt("Guess a letter, or click Cancel to stop playing."); if (guess === null) { // 退出游戏 break; } guessAll += guess; guess = guess.toLowerCase(); if (guess.length !== 1) { alert("Please enter a single letter."); } else { for (var j = 0; j < word.length; j++) { if (word[j] === guess && answerArray[j] === "_") { answerArray[j] = guess; remainingLetters--; } } } } // 结束游戏,展示结果 alert(answerArray.join(" ")); if (remainingLetters === 0) { alert("Good job! The answer was " + word); } else { alert("Game over! The answer was " + word); } </script>
额外优化说明
- 把
while循环条件从remainingLetters >= 0改为remainingLetters > 0,因为当剩余字母数为0时,所有字母已猜中,游戏理应结束。 - 调整了
guess === null的判断顺序,避免将null存入guessAll导致尝试次数计数错误。
内容的提问来源于stack exchange,提问作者StarShining
相关产品推荐
相关产品推荐

