检查谁赢得了Tic Tac Toe更高效的C++

Mic*_*ael 3 c++ if-statement

我正在写一个Tic Tac Toe游戏,我想知道如何能够有效地检查谁赢了.包含X,O或空格的二维数组代表电路板.

  char CheckWin(const char board[][NUM_COLS], int& sum) // tic tac toe board - IN
{
    char tmp;
    int lcv;
    tmp = ' ';

    if (sum == 9)
    {
        return 'T';
    }
    else if (sum != 9)
    {
        if (((tmp = board[1][1]) != ' ' && board[0][0] == tmp && board[2][2] == tmp) || (board[2][0] == tmp && board[0][2] == tmp))
        {
            return tmp;
        }

        for (lcv = 0; lcv < 3; lcv++)
        {
            if ((tmp = board[lcv][0]) != ' ' && board[lcv][1] == tmp && board[lcv][2] == tmp)
            {
                return tmp;
            }
            else if ((tmp = board[lcv][0]) != ' ' && board[lcv][1] == tmp && board[lcv][2] == tmp)
            {
                return tmp;
            }
        }
    }

    return 'N';
}
Run Code Online (Sandbox Code Playgroud)

除了一遍又一遍地做类似的事情之外,我怎么能检查谁赢了并且如果X赢了则返回X,如果O有一个则是O,如果是平局则是T,如果还没有人则是N. 提前致谢.我正在努力熟悉C++和编程.

编辑:我刚刚用简单的方法,但我不知怎的搞砸了,有人知道怎么办?看起来它没有返回任何东西,因为当我在玩家选择一行和一列(这工作正常)之后在主要中调用它时,它不输出任何东西

Ski*_*izz 13

您可以将数组转换为两个九位值,一个用于O位置,一个用于X位置,以及空白计数:

x_mask = 0
y_mask = 0
empty_count = 0
mask = 1
for each square
  if x then x_mask |= mask
  if y then y_mask |= mask
  if empty then empty_count++
  mask <<= 1
Run Code Online (Sandbox Code Playgroud)

然后将x_mask和y_mask与八种可能的获胜组合进行比较:

for each player
  for each winning combination
    if player_mask & winning_mask == winning_mask then player has won
Run Code Online (Sandbox Code Playgroud)

然后处理玩家赢得的案件:

if neither player won
  if empty_count == 0
    its a tie
  else
    moves still available
Run Code Online (Sandbox Code Playgroud)