You need to enable JavaScript to run this app. JS开发刽子手猜词游戏时,如何仅展示用户猜中单词的对应隐藏字母
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.10 16:36:03