检查数组中的 3 个元素是否具有相同的值

问题描述 投票:0回答:1

我正在制作一个 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 个,从而游戏停止

c++ tic-tac-toe
1个回答
0
投票

可以利用幻方来执行线性时间检查。基本思想如下:提供一个可以用普通向量表示的幻方,执行线性探测,以便如果某个单元被 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};
}
© www.soinside.com 2019 - 2024. All rights reserved.