JS开发刽子手猜词游戏时,如何仅展示用户猜中单词的对应隐藏字母
刽子手猜词游戏字母匹配逻辑修正方案
原有代码的核心问题
- 正则写法失效:代码里写的
/userGuess/g是正则字面量,内部内容会被当成固定字符串"userGuess"匹配,不会读取userGuess变量存储的实际用户输入,自然匹配不到对应内容 - 替换参照错位:原逻辑想从全是星号的
asteriskWord里找匹配项替换,但这个字符串本身没有任何真实字母,根本不存在可替换的内容 - 流程没有闭环:就算匹配逻辑写对了,计算出的新展示串没有做持久化存储、没有输出到控制台,用户看不到任何交互结果
可正常运行的实现代码
let storeWord = ["house", "dog", "love"]; const randomWord = storeWord[Math.floor(Math.random() * storeWord.length)]; console.log("调试信息-选中的目标单词:", randomWord); // 初始生成全星隐藏串 let currentDisplay = randomWord.replace(/./g, '*'); console.log("初始展示状态:", currentDisplay); // 获取用户输入,统一转小写避免大小写匹配失败 let userGuess = input.question("type your guess(a single letter): ").toLowerCase(); // 输入合法性校验 if(!/^[a-z]$/.test(userGuess)) { console.log("You need to put one letter"); } else { checkLetter(userGuess); } function checkLetter(guess) { let newDisplay = ""; // 逐位对比目标单词,生成新的展示串 for(let pos = 0; pos < randomWord.length; pos++) { // 匹配到对应位置的字母就显示真实字符,否则保留原有展示状态 newDisplay += randomWord[pos] === guess ? guess : currentDisplay[pos]; } // 更新全局展示状态 currentDisplay = newDisplay; console.log("猜题后展示状态:", currentDisplay); // 增加通关判断 if(!currentDisplay.includes("*")) { console.log("猜中全部单词啦!"); } }
实现逻辑说明
- 用逐位遍历的方式替代原本的正则替换,完全避免了动态变量嵌入正则失效的问题
- 每次生成新展示串时,会保留之前已经猜中的字母位置,不会把多轮猜的结果冲掉,支持连续多轮猜测的交互
- 统一转换输入大小写,解决用户输入大写字母时和目标词匹配失败的问题
- 每次猜完都会更新全局的
currentDisplay变量,让下一次猜的时候能基于最新的展示状态计算结果
举个实际运行的例子:选中目标词为"house",初始展示为
*****,用户猜"o",程序会逐位比对,在第二个位置替换成"o",最终输出*o***,其余位置保持星号不变。
内容的提问来源于stack exchange,提问作者orela123
相关产品推荐
相关产品推荐

