2016-05-14 81 views
-1

我有一个3x3二维数组TicTac脚趾游戏,并且我在遇到麻烦时应该返回胜者。数字1被分配给玩家1并且-1分配给玩家2,我需要总结线条,列和对角线以查看是否有赢家。总结一个多维数组的行,列和对角线

public static int checkWinner (int[][] board) { 
     for(int i=0; i<3;i++) { 
      for(int j=0;j<3;j++) { 
       if(board[i][j]+ board[i][j]+ board[i][j] == 3) { 
        return 1; 
       } else if (board[i][j] + board[i][j] + board[i][j] == -3) { 
        return -1; 
       } 
      } 
     } 
     return -10; //placeholder 
    } 

我该如何做到这一点,并以可扩展的方式(如果我改变我们说的4x4网格)。

编辑:我已经看到了Algorithm for Determining Tic Tac Toe Game Over,但不明白。这就是我提出这个问题的原因。如果任何人都可以解释我做错了什么,而不是downvoting,我会非常感激,并会实际学到的东西,而不是复制。

+1

试着看一下:http://stackoverflow.com/questions/1056316/algorithm-for-determining-tic-tac-toe-game-over – sshashank124

+0

@ sshashank124我已经做到了。但是不明白。 –

+0

他们已经做到了这一点(我更喜欢这种方法)的方式是他们传递新添加的标记的坐标。这样,他们只需检查包含该位置的可能的行和列。这比每次检查整个板块要好 – sshashank124

回答

1

假设电路板在尚未播放的空间中包含0,并且您有方形电路板,这可以在任何尺寸的电路板上工作。我改变了你的方法返回0,如果有一个领带,而不是-10。另外请注意,这不是最有效的实现,但它很好。你可以添加计数器,并且只使用一个forloop作为BigTheta(n)的运行时间,但这种方式不那么令人困惑,而BigTheta(n^2)是任何合理的tick-tack-toe(也就是任何人类游戏都可以完成的游戏) )足够快。

/** 
* Checks the board to see if there is a winner 
* 
* @param board The board to check 
* @return Returns (1 if player1 wins) (-1 if player2 wins) and (0 if no one won) 
*/ 
public static int checkWinner (int[][] board) { 
    int row, col, diagDown=0, diagUp=0; 
    for(int i=0; i<board[0].length; i++) { 
     row=0; 
     col=0; 
     for(int j=0; j<board.length; j++) { 
      row+=board[i][j]; 
      col+=board[j][i]; 
     } 
     //Player1 wins! 
     if(row==board.length||col==board.length) 
      return 1; 
     //Player2 wins! 
     if(row==-1*board.length||col==-1*board.length) 
      return -1; 

     diagDown+=board[i][i]; 
     diagUp+=board[i][board.length-1-i]; 
    } 
    //Player1 wins! 
    if(diagUp==board.length||diagDown==board.length) 
     return 1; 
    //Player2 wins! 
    if(diagUp==-1*board.length||diagDown==-1*board.length) 
     return -1; 
    //No winner 
    return 0; 
} 
0
public class TicTacToe { 

    enum State { 
     NO_WINNER, WINNER_1, WINNER_2 
    }; 

    public static State checkWinner(int[][] board) { 

     // Check LINES 
     for (int i = 0; i < board.length; i++) { // for each line 
      int sum = 0; 
      for (int j = 0; j < board[i].length; j++) { 
       sum += board[i][j]; 
      } 
      if (sum == board.length) { 
       return State.WINNER_1; 
      } 
      if (sum == -board.length) { 
       return State.WINNER_2; 
      } 
     } 

     // Check COLUMNS 
     for (int i = 0; i < board.length; i++) { // for each column 
      int sum = 0; 
      for (int j = 0; j < board.length; j++) { 
       sum += board[j][i]; 
      } 
      if (sum == board.length) { 
       return State.WINNER_1; 
      } 
      if (sum == -board.length) { 
       return State.WINNER_2; 
      } 
     } 

     // Check first DIAGONAL 
     int sum = 0; 
     for (int i = 0; i < board.length; i++) { 
      sum += board[i][i]; 
      if (sum == board.length) { 
       return State.WINNER_1; 
      } 
      if (sum == -board.length) { 
       return State.WINNER_2; 
      } 
     } 

     // Check second DIAGONAL 
     sum = 0; 
     for (int i = 0; i < board.length; i++) { 
      sum += board[i][board.length - i - 1]; 
      if (sum == board.length) { 
       return State.WINNER_1; 
      } 
      if (sum == -board.length) { 
       return State.WINNER_2; 
      } 
     } 

     return State.NO_WINNER; 

    } 

    public static void main(String[] args) { 
     System.out.println(checkWinner(new int[][] { { 1, 1, 1 }, { 0, 0, 0 },{ 0, 0, 0 } })); 
     System.out.println(checkWinner(new int[][] { { -1, 0, 0 },{ -1, 0, 0 }, { -1, 0, 0 } })); 
     System.out.println(checkWinner(new int[][] { { 1, 0, 0 }, { 0, 1, 0 },{ 0, 0, 1 } })); 
     System.out.println(checkWinner(new int[][] { { 0, 0, -1 }, { 0, -1, 0 },{ -1, 0, 0 } })); 
     System.out.println(checkWinner(new int[][] { { 1, 0, 0 }, { 0, 0, 0 },{ 0, 0, 1 } })); 
    } 

}