对多维数组的线,列和对角线求和

时间:2016-05-14 03:02:19

标签: java multidimensional-array

我有一个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,但却不明白。这就是我提出这个问题的原因。如果有人能够解释我做错了什么而不是低估,我会非常感激,并且实际上会学到一些东西而不是复制。

2 个答案:

答案 0 :(得分:1)

假设棋盘在尚未播放的空间中包含0,并且你有方板,这应适用于任何尺寸的棋盘。如果有一个平局而不是-10,我改变你的方法返回0。另请注意,这不是最有效的实现,但它很好。你可以添加计数器,只使用一个forloop用于BigTheta(n)的运行时间,但这种方式不那么容易混淆和BigTheta(n ^ 2)这是任何合理的滴答声脚趾游戏(意味着人类将完成的任何游戏) )足够快。

/**
 * 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;
}

答案 1 :(得分: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 } }));
    }

}