如何在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()函数:
- 先遍历一次,标记所有位置正确的绿色字符,同时用布尔数组记录答案中已被匹配的字符。
- 再遍历一次,对未匹配的字符,检查它是否存在于答案的未使用位置中,存在则标记黄色,否则标记灰色。
修改后的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
相关产品推荐
相关产品推荐

