public class TicTacToeChecker {

    public static char checkWinner(char[][] board) {
        char rowWinner = checkRowWinner(board);
        if (rowWinner != ' ') {
            System.out.println(rowWinner + " wins with a row!");
            return rowWinner;
        }
        char colWinner = checkColWinner(board);
        if (colWinner != ' ') {
            System.out.println(colWinner + " wins with a col!");
            return colWinner;
        }
        char diagWinner = checkDiagWinner(board);
        if (diagWinner != ' ') {
            System.out.println(diagWinner + " wins with a diag!");
            return diagWinner;
        }

        System.out.println("No winner :(");
        return ' ';

    }

    /*
     * Returns 'X' if the X player has won in any row, 'O' if
     * the O player has won in any row, and ' ' (the space character)
     * if nobody has won by getting three in a row.
     */
    public static char checkRowWinner(char[][] board) {
        for (int row = 0; row < board.length; row++) {
            char firstMark = board[row][0];
            boolean allEqual = true;
            for (int col = 1; col < board[row].length; col++) {
                if (board[row][col] != firstMark) {
                    allEqual = false;
                }
            }
            if (allEqual) {
                return firstMark;
            }
        }
        return ' ';
    }

    /*
     * Returns 'X' if the X player has won in any column, 'O' if
     * the O player has won in any column, and ' ' (the space character)
     * if nobody has won by getting three in a column.
     */
    public static char checkColWinner(char[][] board) {
        for (int col = 0; col < board.length; col++) {
            char firstMark = board[0][col];
            boolean allEqual = true;
            for (int row = 1; row < board.length; row++) {
                if (board[row][col] != firstMark) {
                    allEqual = false;
                }
            }
            if (allEqual) {
                return firstMark;
            }
        }
        return ' ';
    }

    /*
     * Returns 'X' if the X player has won on either diagonal, 'O' if
     * the O player has won in a diagonal, and ' ' (the space character)
     * if nobody has won by getting the diagonals.
     */
    public static char checkDiagWinner(char[][] board) {
        char middleMark = board[1][1];
        if (middleMark == ' ') {
            return ' ';
        }
        boolean descendingDiagSame = middleMark == board[0][0] && middleMark == board[2][2];
        boolean ascendingDiagSame = middleMark == board[2][0] && middleMark == board[0][2];
        if (descendingDiagSame || ascendingDiagSame) {
            return middleMark;
        } else {
            return ' ';
        }
    }

}