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

如何在C++版Wordle游戏中检查字符存在于答案但位置错误

解决Wordle游戏中“字母存在但位置错误”的判断问题

我正在用C++制作自己的WORDLE游戏,目前已实现检查字符是否处于正确位置的功能,但不知道如何检查字母存在于答案单词中但位置不同的情况。以下是我目前的代码:

#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include <cstdlib>
#include <ctime> // 原代码缺少time头文件,补充后才能正常使用time()函数

using namespace std;

string pickword();
string checkword(string ans, string word);

int main() {
  string guess;
  cout << "Hi welcome to WORDLE\n\n*Hit enter to start*";
  cin.ignore();
  string word = pickword();
  cout << endl << word;
  cout << "\nEnter a 5-letter word: ";
  cin >> guess;
  checkword(guess, word);
}

string pickword() {
  srand((unsigned) time(NULL));
  int random = 1 + (rand() %  1999);
  string string;
  ifstream ReadFile;
  ReadFile.open("words.txt");
  for (int i = 1; i <= random; i++) {
        getline(ReadFile, string);
    }
  ReadFile.close();
  return string;
}

string checkword(string ans, string word) {
  char anslst[5];
  char wrdlst[5];
  for (int i = 0; i <= 4; i++) {
    anslst[i] = ans[i];
    wrdlst[i] = word[i];
  }
  //Green = \033[32m
  //Red = \033[31m
  //Yellow = \033[33m
  for (int i = 0; i <= 4; i++) {
    if (anslst[i] == wrdlst[i]) {
      cout << "\033[32m" << anslst[i];
    }
    else if (anslst[i] != wrdlst[i]) {
      cout << "\033[31m" << anslst[i];
    }
  }
  
  return word;
}

问题相关部分在checkword()函数的末尾,请问如何判断玩家猜测中的字母是否存在于答案的字符列表中?


解决方案

要实现“字母存在但位置错误”的黄色标记,核心是避免重复匹配同一个字母(比如答案有一个A,猜测有两个A,只能有一个A被标记为绿色或黄色,另一个为灰色)。可以按以下步骤修改checkword()函数:

  1. 先遍历一次,标记所有位置正确的绿色字符,同时用布尔数组记录答案中已被匹配的字符。
  2. 再遍历一次,对未匹配的字符,检查它是否存在于答案的未使用位置中,存在则标记黄色,否则标记灰色。

修改后的checkword()函数代码:

string checkword(string ans, string word) {
    // 定义颜色常量,方便维护
    const string GREEN = "\033[32m";
    const string YELLOW = "\033[33m";
    const string GRAY = "\033[31m";
    const string RESET = "\033[0m"; // 重置颜色,避免后续输出受影响

    bool used[5] = {false}; // 标记答案中字符是否已被匹配
    char result[5]; // 存储每个字符的颜色标记结果

    // 第一步:处理位置正确的绿色字符
    for (int i = 0; i < 5; i++) {
        if (ans[i] == word[i]) {
            result[i] = 'G'; // G代表绿色
            used[i] = true; // 标记该位置已使用
        } else {
            result[i] = '?'; // 暂未确定
        }
    }

    // 第二步:处理存在但位置错误的黄色字符
    for (int i = 0; i < 5; i++) {
        if (result[i] == '?') { // 只处理未确定的字符
            for (int j = 0; j < 5; j++) {
                if (!used[j] && ans[i] == word[j]) {
                    result[i] = 'Y'; // Y代表黄色
                    used[j] = true; // 标记该答案字符已使用
                    break;
                }
            }
            // 遍历完未找到匹配,标记为灰色
            if (result[i] == '?') {
                result[i] = 'X'; // X代表灰色
            }
        }
    }

    // 输出带颜色的结果
    for (int i = 0; i < 5; i++) {
        switch (result[i]) {
            case 'G':
                cout << GREEN << ans[i] << RESET;
                break;
            case 'Y':
                cout << YELLOW << ans[i] << RESET;
                break;
            case 'X':
                cout << GRAY << ans[i] << RESET;
                break;
        }
    }
    cout << endl;

    return word;
}

关键说明

  • 布尔数组used:跟踪答案中哪些字符已经被匹配(绿色或黄色),防止同一个答案字符被多次匹配。
  • 分两次遍历:绿色优先级最高,必须先确定正确位置的字符,再处理剩余的黄色匹配。
  • 颜色重置:添加RESET常量,确保输出完带颜色的字符后,控制台后续输出恢复默认颜色。

另外注意原代码缺少<ctime>头文件,time()函数需要该头文件才能正常编译,已在代码中补充。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:30:50