gpt4 book ai didi

c++ - 测试井字游戏中可能的胜利

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:20 27 4
gpt4 key购买 nike

我正在创建一个 tictactoe 游戏,每一步我都需要测试玩家是否赢了,这给我带来了很多麻烦。我有一个包含所有可能获胜组合的二维 vector :

vector<vector<int>> possibleWins {{1,2,3},{4,5,6},{7,8,9},{1,4,7},{2,5,8},{3,6,9},{1,5,9},{3,5,7}};

我循环遍历 2d vector 并将 player1 和 player2 vector 附加到它们标记的任何单元格中的每一步:

vector<int> totalX {};
vector<int> totalO {};
int count = 1;
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if(board[i][j] == 'x') {
if(totalX.size() == 0) {
totalX.push_back(count);
}
for(int k=0; k<totalX.size(); k++) {
if(count == totalX[k]) {
break;
}
else {
totalX.push_back(count);
}
}
}
else if(board[i][j] == 'o') {
if(totalO.size() == 0) {
totalO.push_back(count);
}
for(int k=0; k<totalO.size(); k++) {
if(count == totalO[k]) {
break;
}
else {
totalO.push_back(count);
}
}
}
count++;
}
}

然后我尝试测试每个玩家单元 vector 中的单元是否是单元的获胜组合,事实证明这对我来说很难:

int xInRow = 0;
for(int x=0; x<totalX.size(); x++) {
for(int y=0; y<possibleWins.size(); y++) {
xInRow = 0;
for(int z=0; z<3; z++) {
if(totalX[x] == possibleWins[y][z]) {
xInRow++;
if(xInRow == 3) {
return X_WON;
}
}
}
}
}

这行不通,我尝试过以多种不同的方式实现它,但老实说,我不知道如何枚举所有可能的胜利并测试玩家是否具有这些组合之一。

有没有一种方法可以更好地构建它以使其发挥作用?我对此很迷茫。

最佳答案

有两种方法。你的代码对于一个简单的操作来说有点太复杂了,所以我不会尝试去理解它。

我同意 YSC 的观点,即您不需要 std::vector。你知道每次都是 3x3 网格,所以 3x3 枚举数组应该好得多。有点像

enum TTTState {
EMPTY=0,
X,
O
}

TTState board[3][3];

会让你省去很多麻烦。你可以说 board[0][0] 是左上角,board[2][2] 是右下角。

选项 1

我喜欢你关于 possibleWins 的想法,所以使用新的 board[3][3] 数据结构,你可以用 int solutions[8][3][ 2] 但这已经有点乱了。

for each solution in solutions
for each triplet in solution
for each pair in triplet
if board[pair[0]][pair[1]] matches all other pair in triplet
then whoever has pieces in the row has won

选项 2

这可能更干净。有 3 种可能的获胜方式。水平、垂直和对角线。您可以分别查看这三种方式。

for i = 0 ; i != 3; i++
type = board[i][0]
won = true
for ii = 1; ii != 3; ii++
if board[i][ii] is not type
won = false
if won then you can return the function with who won

for i = 0 ; i != 3; i++
type = board[0][i]
won = true
for ii = 1; ii != 3; ii++
if board[ii][i] is not type
won = false
if won then you can return the function with who won

对角线可以硬编码,因为只有两个可能的胜利位置..

关于c++ - 测试井字游戏中可能的胜利,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35873422/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com