Wordle复刻项目中重复字母校验逻辑失效问题求助
问题分析与修复方案
你的核心问题在于重复字母的校验逻辑完全搞反了。当前代码是拿目标词当前位置的字母(wordPoint)去和输入的其他位置字母对比,这不符合Wordle的规则——Wordle的黄色/灰色判定,是要基于目标词中每个字母的剩余可用次数,而不是输入里有没有和目标当前位置相同的字母。
举个例子,目标词是cancer(字母c出现2次,a、n、e、r各1次),如果输入是ccxxxx,第一个c会标绿色,第二个c应该标黄色,但你的代码逻辑会错误地把第二个c标成灰色,因为你在检查第二个c的时候,会拿目标词第二个位置的字母a和输入里的字母对比,完全偏离了正确规则。
正确的逻辑步骤
- 先统计目标词中每个字母的出现次数,用来跟踪还有多少个该字母可以被标记为黄色。
- 第一轮遍历:先处理所有**位置完全匹配(绿色)**的情况,每匹配一个,就把对应字母的可用次数减1,同时记录
feedback为green。 - 第二轮遍历:处理非绿色的字母:
- 如果字母不在目标词里,直接标
grey。 - 如果字母在目标词里,但对应的可用次数已经为0,标
grey。 - 否则标
yellow,同时把可用次数减1。
- 如果字母不在目标词里,直接标
修复后的代码
socket.on('check wordle', (check) => { const targetWord = "cancer"; const feedback = new Array(check.length).fill("grey"); const letterCounts = {}; // 统计目标词中每个字母的出现次数 for (const char of targetWord) { letterCounts[char] = (letterCounts[char] || 0) + 1; } // 先处理绿色匹配的情况,消耗对应字母的计数 for (let i = 0; i < check.length; i++) { const inputChar = check[i]; const targetChar = targetWord[i]; if (inputChar === targetChar) { feedback[i] = "green"; letterCounts[inputChar]--; } } // 处理黄色和灰色的情况 for (let i = 0; i < check.length; i++) { const inputChar = check[i]; // 已经是绿色的跳过 if (feedback[i] === "green") continue; if (letterCounts[inputChar] > 0) { feedback[i] = "yellow"; letterCounts[inputChar]--; } // 否则保持默认的grey } console.log(feedback); io.emit('wordle feedback', feedback); });
为什么原来的逻辑失效?
你之前的代码里,dupCheck == wordPoint是拿输入的字母和目标词当前位置的字母对比,这完全不是判断重复字母是否应该标黄色的逻辑。比如当输入字母是c但位置不对时,你应该看目标词里还有没有未被绿色匹配消耗的c,而不是看输入里有没有和目标当前位置相同的字母。
测试这个修复后的代码,比如输入ccaaaa,第一个c会标绿色,第二个c标黄色,后面的a因为目标词里只有1个a,所以第一个a标黄色,剩下的a标灰色,完全符合Wordle的规则。
内容的提问来源于stack exchange,提问作者Butheus
相关产品推荐
相关产品推荐

