wordle game 猜字遊戲

黄花菜狗發表於2024-12-03

wordle game

                        .___.__                                         
__  _  _____________  __| _/|  |   ____      _________    _____   ____  
\ \/ \/ /  _ \_  __ \/ __ | |  | _/ __ \    / ___\__  \  /     \_/ __ \ 
 \     (  <_> )  | \/ /_/ | |  |_\  ___/   / /_/  > __ \|  Y Y  \  ___/ 
  \/\_/ \____/|__|  \____ | |____/\___  >  \___  (____  /__|_|  /\___  >
                         \/           \/  /_____/     \/      \/     \/ 

遊戲規則介紹

現有一個長度已知的單詞,使用者需要對該單詞進行猜測。

對於使用者每次的猜測結果,單詞中未出現的字母用紅色標識,出現過但位置不對的字母用黃色標識,位置和字形都正確的字母用綠色標識。

共有十次猜測機會

EG.答案為bless 使用者猜測bleed,則程式返回的bleed中的字母顏色分別為:綠綠綠黃紅

遊戲畫面如圖所示:

程式碼實現

(1)引用標頭檔案與定義宏

#define path "dictionary.txt" //定義一個path

#define reset "\033[0m"  //用於字型顏色的改變和重置
#define red "\033[31m"
#define green "\033[32m"
#define yellow "\033[33m"

std::set<std::string> words;  //定義一個set容器 用於存放單詞

(2)函式體get_the_dictionary(獲取單詞字典)

void get_the_dictionary()
{
	std::ifstream file(path);
	for (std::string word; std::getline(file, word);)   //逐行讀取
	{
		int len = word.length();
		if (len >= 4&&len <= 6)     //控制單詞長度為4-6
		{
			words.insert(word);
		}
	}
	file.close();
}

(3)函式體get_random_word(生成隨機單詞)

void get_random_word(std::string& ans) 
{
	static std::mt19937 rng(std::random_device{}());    //隨機數生成器
	std::uniform_int_distribution<size_t> distribution(0, words.size() - 1);
	auto it = words.begin();    //迭代器 初始化指向words的開始
	std::advance(it, distribution(rng));
	ans = *it;   //將迭代器 it 當前指向的單詞(即隨機選中的單詞)賦值給引用引數 ans
}

(4)函式體result(輸出結果)

int result(std::string& input,std::string& ans)
{
	int res=0;
	if (input.length() != ans.length())  //長度錯誤
	{
		std::cout << "Wrong length!";
		return 0;
	}
	for (int i = 0; i < ans.length(); i++)  //歷遍每個字母並輸出對應顏色的字母
	{
		char c = input[i];
		if (c == ans[i])
		{
			std::cout << green << c << reset;
			res++;
		}
		else if (ans.find(c) != std::string::npos)   //在ans中尋找與c匹配的字母
		{
			std::cout << yellow << c << reset;
		}
		else
			std::cout << red << c << reset;
	}
	std::cout << "\n";
	return res;
}

(5)主體main函式

int main()
{
	int res = 0;
	int try_times_left = 10;
	std::string ans, input;

	get_the_dictionary();
	get_random_word(ans);

	std::cout << "The game starts\n";
	std::cout << "The length of the word is " << ans.length() << "\nYou have " << try_times_left << " times to try\n";
	while(res != ans.length())   //迴圈輸入,直到嘗試次數歸零
	{
		
		if (try_times_left == 0)
		{
			std::cout <<red<< "Loser!Now you can continue to try.";
		}
		else
			std::getline(std::cin, input);  //getline讀取輸入
			result(input, ans);
		if (res == ans.length())
		{
			std::cout << "Wuhoo,you win the game! >_<";   //QAQ
		}
		try_times_left--;
	}
	return 0;
}

注意

將你自己的單詞字典文件路徑在path中替換。單詞之間以換行符分隔以保證程式正常執行,請使用與執行環境一樣格式的文件換行符

相關文章