井字游戏 horizontal/vertical 和对角线检查不起作用 - java

tic tac toe horizontal/vertical and diagonal check not wokring - java

我正在写一个井字游戏,除了检查(horizontal/vertical 和对角线)外,一切似乎都正常。我正在使用数组 (int [3][3]) 制作电路板。

这些是我的支票:

private boolean wonStraightLines( int player)
   {
       boolean answer = false;

       if (
            ((board[0][0] & board[0][1] & board[0][2]) == (player * 3)) || 
            ((board[1][0] & board[1][1] & board[1][2]) == (player * 3)) ||  
            ((board[2][0] & board[2][1] & board[2][2]) == (player * 3)) ||
            ((board[0][0] & board[1][0] & board[2][0]) == (player * 3)) ||
            ((board[0][1] & board[1][1] & board[2][1]) == (player * 3)) ||
            ((board[0][2] & board[1][2] & board[2][2]) == (player * 3))
          ) 
       {
           answer = true;   
       }
       else {
           answer = false;
       }
       return answer;
   }

对角线:

private boolean wonDiagonal( int player)
   {
      boolean answer = false;

      if (
              ((board[0][0] & board[1][1] & board[2][2]) == (player * 3)) || ((board[0][2] & board[1][1] & board[2][0]) == (player * 3))
         ) 
      {
          answer = true;
      }
      else {
          answer = false;
      }
      return answer;
   }

当我 运行 程序每当 X 或 O 从任何方向获得 3 时,游戏保持 运行ning 而不是抛出 "you win" 消息。任何帮助,将不胜感激。不确定是否需要代码的任何其他部分。

编辑:我也尝试在板数组值之间使用 + 而不是 & 但效果不佳。

我假设每个元素的状态有 3 个唯一值,例如:

board[row][col] = 0 // no entry
board[row][col] = 1 // player 1
board[row][col] = 2 // player 2

player 的水平检查(使用行优先结构)看起来像这样:

(board[0][0] == player && board[0][1] == player && board[0][2] == player)

并为每一行重复。

垂直方向类似,每列重复:

(board[0][0] == player && board[1][0] == player && board[2][0] == player)

还有一个对角线:

(board[0][0] == player && board[1][1] == player && board[2][2] == player)

如果您决定使用算术运算,那么您必须更改 "player" 值以避免重叠,例如玩家 1 == 1 和玩家 2 == 4,例如:

board[row][col] = 0 // no entry
board[row][col] = 1 // player 1
board[row][col] = 4 // player 2

然后你可以对水平行做类似的事情:

((board[0][0] + board[0][1] + board[0][2]) == (player * 3))

注意 Java 8 和以后添加一个 int 数组(在你的情况下是一行或一列)可以稍微更简洁:

// sum the first row
(IntStream.of(board[0]).sum() == (player * 3))

现在,如果您真的想使用按位 "and" 操作,那么这是您的检查,假设初始元素值 (0,1,2) 如顶部所述:

// check if the player's "bit" is set in all elements of first row.
(board[0][0] & board[0][1] & board[0][2]) == player