【发布时间】:2016-03-08 17:00:26
【问题描述】:
我正在创建一个tictactoe游戏,每一步我都需要测试一个玩家是否赢了,这给我带来了很多麻烦。我有一个包含所有可能获胜组合的二维向量:
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 向量,并将 player1 和 player2 向量附加到它们标记的任何单元格:
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++;
}
}
然后我尝试测试每个玩家单元向量中的单元是否是单元的获胜组合,这对我来说很困难:
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;
}
}
}
}
}
这行不通,我已经尝试以多种不同的方式实现它,但老实说,我不知道如何枚举所有可能的胜利并测试玩家是否拥有这些组合之一。
有没有办法可以更好地构建它以使其工作?我很迷茫。
【问题讨论】:
-
将
std::vector<std::vector<int>>用于tictactoe 板是矫枉过正并且带有巨大 的缺点。您应该定义一个TicTacToeBoard类,其中有九个值代表游戏的九个方格(NW、N、NE、W、C、E、SW、S、SE)的状态(空、x 或 o)。跨度> -
顺便说一句,如果您将您的棋盘表示为 3x3 {-1,0,1} 矩阵 A,
[ 1 1 1 ]*A和A*[1 1 1]^T会告诉您是否有赢家以及谁赢了:如果乘法结果的复合是3,1胜,如果是-3,1-胜。
标签: c++ tic-tac-toe