我正在用 C 創建基于文本的 TicTacToe,需要創建一個檢查獲勝的函式。
現在,我有一個玩家 X 所做的所有動作的向量:
std::vector<int> x_vector = {1, 2, 3, 5, 7};
我還有一個獲勝條件的二維向量:
std::vector<std::vector> > wins = {{1, 2, 3}, {4, 5, 6}, {7, 8, 8}};
在這種情況下,獲勝向量的每個元素代表一個獲勝條件。如果玩家 X 在他們的向量中有一個包含其中一個獲勝條件的輸入組合,我會嘗試讓 bool 函式回傳 true。
我是 C 和一般編碼的新手,因此感謝所有耐心,并且您可以幫助我找到更好的解決方案越簡單。
uj5u.com熱心網友回復:
您可以遍歷已知勝利的串列,檢查每個勝利以查看它是否是用戶移動串列的子集。該std::includes
函式將執行此測驗 - 但請注意,需要對兩個“串列”進行排序。
為了避免在每次輸入后手動對用戶的移動串列進行排序,您可以使用std::set
容器(它是固有排序的),而不是std::vector
.
下面的代碼片段展示了isWin()
使用這種方法的一個相對簡單的函式實作,以及一些基本的測驗用例:
#include <iostream>
#include <vector>
#include <set>
#include <algorithm> // For std::includes
bool isWin(const std::set<int>& test)
{
static std::vector<std::set<int>> winlist = {
{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, // Horizontal lines
{1, 4, 7}, {2, 5, 8}, {3, 6, 9}, // Vertical lines
{1, 5, 9}, {3, 5, 7}, // Diagonal lines
};
for (auto win : winlist) {
if (std::includes(test.begin(), test.end(), win.begin(), win.end())) {
return true; // Match - Win!
}
}
return false; // Didn't get a match - no win
}
int main()
{
std::set<int> s1{ 1, 2 }; // Trivial "No win" (only 2 moves)
std::cout << "s1: " << isWin(s1) << "\n";
std::set<int> s2{ 1, 2, 3 }; // Trivial "Win" (top row)
std::cout << "s2: " << isWin(s2) << "\n";
std::set<int> s3{ 2, 4, 1, 5 }; // " No Win"
std::cout << "s3: " << isWin(s3) << "\n";
std::set<int> s4{ 5, 2, 4, 6 }; // "Win" (middle row)
std::cout << "s4: " << isWin(s4) << "\n";
std::set<int> s5{ 5, 1, 3, 6, 9 }; // "Win" (diagonal)
std::cout << "s5: " << isWin(s5) << "\n";
return 0;
}
請注意,這種方法可能不是在井字游戲中檢查獲勝的最佳方法;但是,如果您的目的是學習向量、集合和尋找匹配的子序列,它可能會提供一個有用的起點。
對于您的實際用戶輸入,您將宣告并初始化一個空集,然后使用容器類的insert
成員函式添加移動std::set
;像這樣:
int main()
{
std::set<int> user{}; // Empty Set
user.insert(5);
user.insert(2);
user.insert(4);
user.insert(6);
std::cout << "user (1): " << isWin(user) << "\n";
user.clear();
user.insert(2);
user.insert(4);
user.insert(1);
user.insert(5);
std::cout << "user (2): " << isWin(user) << "\n";
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/396641.html
上一篇:printf()是如何表達的?