我正在制作一个 TicTacToe 游戏(我知道相当简单,但我是初学者),我快完成了,我现在的问题是我试图让它检查表格的行、列或对角线是否具有相同的值值,如果不是则递归地继续播放。我的主板看起来像这样:
char xToken = 'x';
char oToken = 'o';
char vertical = '|';
char horizontal = '-';
class Board {
public:
const static int rows = 6;
const static int cols = 6;
char grid[rows][cols]{};
Board() {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
grid[i][0] = '0' + i;
grid[0][j] = '0' + j;
if (j == 2 || j == 4) {
grid[i][j] = vertical;
}
if (i == 2 || i == 4) {
grid[i][j] = horizontal;
}
}
}
}
void printBoard() {
for (auto & i : grid) {
for (char j : i) {
cout << j << "\t";
}
cout << endl;
}
}
}
这是我的 play() 函数:
void play() {
int i = 0;
int j = 0;
cout << "choose index you want to play in" << endl;
cout << "Player 1" << endl;
cout << "Row: " << endl;
cin >> i;
cout << "Column: " << endl;
cin >> j;
cout << i << ", " << j << endl;
if (Board().grid[i][j] != vertical && Board().grid[i][j] != horizontal) {
grid[i][j] = xToken;
printBoard();
}
cout << "choose index you want to play in" << endl;
cout << "Player 2" << endl;
cout << "Row: " << endl;
cin >> i;
cout << "Column: " << endl;
cin >> j;
cout << i << ", " << j << endl;
if (Board().grid[i][j] != vertical && Board().grid[i][j] != horizontal) {
grid[i][j] = oToken;
printBoard();
}
if(grid[i][j] == xToken) {
cout << "You Win!" << endl;
} else
play();
}
这个想法是,如果行、列或对角线上没有 3 个具有相同值的元素,我会尝试递归地继续玩。现在的问题是找到如何读取棋盘,以便找到连续的 3 个,从而游戏停止
可以利用幻方来执行线性时间检查。基本思想如下:提供一个可以用普通向量表示的幻方,执行线性探测,以便如果某个单元被 tic tac 的相应单元中的第一个或第二个符号占据脚趾表,将数字分别添加到第一或第二总和中;当且仅当其符号的总和为 111 时,第一个或第二个玩家获胜。
示例:
std::pair<bool, bool> is_winner()
{
int sumx = 0;
int sumo = 0;
for(int i = 0; i != 6; ++i){
for(int j = 0; j != 6 ; ++j){
if(grid[i][j] == xToken)
sumx += magic[6 * i + j];
else
sumo += magic[6 * i + j];
}
}
return {sumx == 111, sumo == 111};
}