You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
}

关键逻辑说明

  1. 使用标记数组used:用来跟踪目标词中每个位置的字母是否已经被绿色或黄色匹配占用,避免重复计数。
  2. 分两步处理:
    • 先遍历所有位置,标记绿色字母并占用目标词对应位置;
    • 再遍历未被标记为绿色的位置,在目标词中寻找未被占用的相同字母,标记为黄色并占用目标词对应位置;
    • 剩余未处理的位置保持灰色*。
  3. 修正循环条件:原代码中i <=4改为i <5(更符合数组索引习惯),同时调整猜测次数的循环条件为guessNumber <6(确保最多6次猜测)。

测试示例:当输入aplle时,输出为AP*LE,符合预期。

内容的提问来源于stack exchange,提问作者Daniel Joseph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:15:19