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中替換。單詞之間以換行符分隔以保證程式正常執行,請使用與執行環境一樣格式的文件換行符