如何在C语言Wordle克隆中处理重复黄色字母问题
C语言Wordle克隆:重复黄色字母处理问题解决
我在开发C语言版Wordle克隆时遇到重复黄色字母的处理问题:当目标词为"apple",用户猜测为"aplle"(仅作示例),代码返回"APlLE",但预期结果是"AP*LE"。规则说明:大写字母=绿色(位置正确),小写字母=黄色(字母存在但位置错误),*=灰色(字母不存在)。
现有代码逻辑存在缺陷,无法正确处理重复字母的匹配计数问题,以下是修正方案:
问题根源
当前代码仅检查字母是否存在于目标词中,未跟踪目标词中每个字母的已匹配次数。比如目标apple中只有1个p,当猜测的第2位p已经被标记为绿色后,第4位的p不应该再被标记为黄色,但原逻辑仍会找到目标词中第2位的p并标记为黄色,导致错误。
修正后的代码
#include <stdio.h> #include <string.h> #include <ctype.h> int main() { char chosenWord[] = "apple"; // 示例目标词 char userGuess[6]; char userGuess2[6] = {0}; // 初始化结果数组 int correctGuess = 1; int guessNumber = 0; do { scanf("%5s", userGuess); correctGuess = strcmp(userGuess, chosenWord); if (strlen(userGuess) != 5) { printf("请输入5个字母的单词。\n"); continue; // 跳过后续逻辑,重新输入 } if (correctGuess == 0) { printf("答对了!\n"); guessNumber++; printf("猜测次数:%d\n", guessNumber); break; } guessNumber++; int used[5] = {0}; // 标记目标词中已匹配的位置,0=未使用,1=已使用 // 第一步:处理绿色字母(位置正确) for (int i = 0; i < 5; i++) { if (userGuess[i] == chosenWord[i]) { userGuess2[i] = toupper(userGuess[i]); used[i] = 1; // 标记该位置已被绿色匹配占用 } else { userGuess2[i] = '*'; // 先默认设为灰色,后续再处理黄色 } } // 第二步:处理黄色字母(字母存在但位置错误) for (int i = 0; i < 5; i++) { if (userGuess2[i] != '*') { continue; // 已经是绿色,跳过 } for (int j = 0; j < 5; j++) { if (!used[j] && userGuess[i] == chosenWord[j]) { userGuess2[i] = tolower(userGuess[i]); used[j] = 1; // 标记该位置已被黄色匹配占用 break; } } } printf("%s\n", userGuess2); } while (guessNumber < 6 && correctGuess != 0); // 最多6次猜测 return 0; }
关键逻辑说明
- 使用标记数组
used:用来跟踪目标词中每个位置的字母是否已经被绿色或黄色匹配占用,避免重复计数。 - 分两步处理:
- 先遍历所有位置,标记绿色字母并占用目标词对应位置;
- 再遍历未被标记为绿色的位置,在目标词中寻找未被占用的相同字母,标记为黄色并占用目标词对应位置;
- 剩余未处理的位置保持灰色
*。
- 修正循环条件:原代码中
i <=4改为i <5(更符合数组索引习惯),同时调整猜测次数的循环条件为guessNumber <6(确保最多6次猜测)。
测试示例:当输入aplle时,输出为AP*LE,符合预期。
内容的提问来源于stack exchange,提问作者Daniel Joseph
相关产品推荐
相关产品推荐

