// Path: xox/src/main/java/xox/game/Board.java
// public class Board {
//     public static final byte HUMAN = -1;
//     public static final byte COMPUTER = 1;
//     static final byte EMPTY = 0;
//     private byte[] board = new byte[9];
// 
//     public Board() {
// 
//     }
// 
//     private Board(byte[] _board) {
//         board = _board;
//     }
// 
//     /**
//      * Checks if the move applied to an empty place
//      *
//      * @param move move to make
//      * @return if the move is empty or not
//      */
//     boolean isEmpty(Move move) {
//         return board[move.getRow() + (move.getColumn() * 3)] == EMPTY;
//     }
// 
//     public void empty(int r, int c) {
//         board[c * 3 + r] = Board.EMPTY;
//     }
// 
//     /**
//      * Checks if board is filled or not
//      *
//      * @return true if board is full
//      */
//     public boolean isFull() {
//         for (int i = 0; i < 9; i++) {
//             if (board[i] == EMPTY) {
//                 return false;
//             }
//         }
//         return true;
//     }
// 
//     /**
//      * checks if player is the winner in the board
//      *
//      * @param player player to check if it is winner on the board
//      */
//     public boolean isWinner(byte player) {
//         // we check if player is the winner on the board
//         for (int i = 0; i < 3; i++) {
//             // check rows
//             if (board[(i * 3)] == player && board[(1) + (i * 3)] == player && board[(2) + (i * 3)] == player) {
//                 return true;
//             }
//             // check columns
//             if (board[i] == player && board[i + 3] == player && board[i + 6] == player) {
//                 return true;
//             }
//         }
//         // check both diagonals
//         if (board[0] == player && board[4] == player && board[8] == player) {
//             return true;
//         }
//         //not winner
//         return board[2] == player && board[4] == player && board[6] == player;
//     }
// 
//     /**
//      * Method making the move
//      *
//      * @param move move to make
//      */
//     public boolean doMove(Move move) {
//         if (board[(move.getColumn() * 3) + move.getRow()] != EMPTY) {
//             return false;
//         } else {
//             board[move.getColumn() * 3 + move.getRow()] = move.getPlayer();
//             return true;
//         }
//     }
// 
//     Board getClone() {
//         return new Board(Arrays.copyOf(board, board.length));
//     }
// }
// 
// Path: xox/src/main/java/xox/game/Move.java
// public class Move {
// 
//     private final int row;
// 
//     private final int column;
// 
//     private final byte player;
// 
//     public Move(int r, int c, byte p) {
//         super();
//         this.row = r;
//         this.column = c;
//         this.player = p;
//     }
// 
//     byte getPlayer() {
//         return player;
//     }
// 
//     public int getRow() {
//         return row;
//     }
// 
//     public int getColumn() {
//         return column;
//     }
// 
// }
// 
// Path: xox/src/main/java/xox/game/Node.java
// public class Node {
// 
//     private final Board board;
// 
//     private Move move = null;
// 
//     private Node[] children;
// 
//     public Node(Board b, Move m) {
//         board = b;
//         move = m;
//         generateChildren();
//     }
// 
//     /**
//      * Will change the player given as parameter
//      *
//      * @param player previous player
//      */
//     private static byte changePlayer(byte player) {
// 
//         if (player == Board.HUMAN) {
//             return Board.COMPUTER;
//         } else if (player == Board.COMPUTER) {
//             return Board.HUMAN;
//         } else {
//             throw new IllegalArgumentException("Only " + Board.HUMAN + " or " + Board.COMPUTER + " is allowed.");
//         }
//     }
// 
//     public Move getMove() {
//         return move;
//     }
// 
//     private byte getPlayer() {
//         return (move == null ? Board.HUMAN : changePlayer(move.getPlayer()));
//     }
// 
//     public boolean isLeaf() {
//         return children == null || (children.length == 0);
//     }
// 
//     /**
//      * Method to calculate value of this node
//      *
//      * @return value of this node
//      */
//     public byte getValue() {
//         if (board.isWinner(Board.COMPUTER)) {
//             return Board.COMPUTER;
//         } else if (board.isWinner(Board.HUMAN)) {
//             return Board.HUMAN;
//         } else {
//             return Board.EMPTY;
//         }
//     }
// 
//     /**
//      * Method to generate children of the node (next possible moves)
//      */
//     private void generateChildren() {
//         ArrayList<Node> c = null;
//         for (int x = 0; x < 3; x++) {
//             for (int y = 0; y < 3; y++) {
//                 Move m = new Move(x, y, this.getPlayer());
//                 if (board.isEmpty(m)) {
//                     if (c == null) {
//                         c = new ArrayList<>();
//                     }
//                     Board newPos = board.getClone();
//                     newPos.doMove(m);
//                     c.add(new Node(newPos, m));
//                 }
//             }
//         }
//         if (c != null) {
//             children = c.toArray(new Node[]{});
//         } else {
//             children = new Node[0];
//         }
//     }
// 
//     public Node[] getChildren() {
//         return children;
//     }
// }


import xox.game.Board;
import xox.game.Move;
import xox.game.Node;
package xox.ai;


public class AI {

    public static Move getMove(Board board, Move previous) {

        // Create the move as Node
// Path: xox/src/main/java/xox/game/Board.java
// public class Board {
//     public static final byte HUMAN = -1;
//     public static final byte COMPUTER = 1;
//     static final byte EMPTY = 0;
//     private byte[] board = new byte[9];
// 
//     public Board() {
// 
//     }
// 
//     private Board(byte[] _board) {
//         board = _board;
//     }
// 
//     /**
//      * Checks if the move applied to an empty place
//      *
//      * @param move move to make
//      * @return if the move is empty or not
//      */
//     boolean isEmpty(Move move) {
//         return board[move.getRow() + (move.getColumn() * 3)] == EMPTY;
//     }
// 
//     public void empty(int r, int c) {
//         board[c * 3 + r] = Board.EMPTY;
//     }
// 
//     /**
//      * Checks if board is filled or not
//      *
//      * @return true if board is full
//      */
//     public boolean isFull() {
//         for (int i = 0; i < 9; i++) {
//             if (board[i] == EMPTY) {
//                 return false;
//             }
//         }
//         return true;
//     }
// 
//     /**
//      * checks if player is the winner in the board
//      *
//      * @param player player to check if it is winner on the board
//      */
//     public boolean isWinner(byte player) {
//         // we check if player is the winner on the board
//         for (int i = 0; i < 3; i++) {
//             // check rows
//             if (board[(i * 3)] == player && board[(1) + (i * 3)] == player && board[(2) + (i * 3)] == player) {
//                 return true;
//             }
//             // check columns
//             if (board[i] == player && board[i + 3] == player && board[i + 6] == player) {
//                 return true;
//             }
//         }
//         // check both diagonals
//         if (board[0] == player && board[4] == player && board[8] == player) {
//             return true;
//         }
//         //not winner
//         return board[2] == player && board[4] == player && board[6] == player;
//     }
// 
//     /**
//      * Method making the move
//      *
//      * @param move move to make
//      */
//     public boolean doMove(Move move) {
//         if (board[(move.getColumn() * 3) + move.getRow()] != EMPTY) {
//             return false;
//         } else {
//             board[move.getColumn() * 3 + move.getRow()] = move.getPlayer();
//             return true;
//         }
//     }
// 
//     Board getClone() {
//         return new Board(Arrays.copyOf(board, board.length));
//     }
// }
// 
// Path: xox/src/main/java/xox/game/Move.java
// public class Move {
// 
//     private final int row;
// 
//     private final int column;
// 
//     private final byte player;
// 
//     public Move(int r, int c, byte p) {
//         super();
//         this.row = r;
//         this.column = c;
//         this.player = p;
//     }
// 
//     byte getPlayer() {
//         return player;
//     }
// 
//     public int getRow() {
//         return row;
//     }
// 
//     public int getColumn() {
//         return column;
//     }
// 
// }
// 
// Path: xox/src/main/java/xox/game/Node.java
// public class Node {
// 
//     private final Board board;
// 
//     private Move move = null;
// 
//     private Node[] children;
// 
//     public Node(Board b, Move m) {
//         board = b;
//         move = m;
//         generateChildren();
//     }
// 
//     /**
//      * Will change the player given as parameter
//      *
//      * @param player previous player
//      */
//     private static byte changePlayer(byte player) {
// 
//         if (player == Board.HUMAN) {
//             return Board.COMPUTER;
//         } else if (player == Board.COMPUTER) {
//             return Board.HUMAN;
//         } else {
//             throw new IllegalArgumentException("Only " + Board.HUMAN + " or " + Board.COMPUTER + " is allowed.");
//         }
//     }
// 
//     public Move getMove() {
//         return move;
//     }
// 
//     private byte getPlayer() {
//         return (move == null ? Board.HUMAN : changePlayer(move.getPlayer()));
//     }
// 
//     public boolean isLeaf() {
//         return children == null || (children.length == 0);
//     }
// 
//     /**
//      * Method to calculate value of this node
//      *
//      * @return value of this node
//      */
//     public byte getValue() {
//         if (board.isWinner(Board.COMPUTER)) {
//             return Board.COMPUTER;
//         } else if (board.isWinner(Board.HUMAN)) {
//             return Board.HUMAN;
//         } else {
//             return Board.EMPTY;
//         }
//     }
// 
//     /**
//      * Method to generate children of the node (next possible moves)
//      */
//     private void generateChildren() {
//         ArrayList<Node> c = null;
//         for (int x = 0; x < 3; x++) {
//             for (int y = 0; y < 3; y++) {
//                 Move m = new Move(x, y, this.getPlayer());
//                 if (board.isEmpty(m)) {
//                     if (c == null) {
//                         c = new ArrayList<>();
//                     }
//                     Board newPos = board.getClone();
//                     newPos.doMove(m);
//                     c.add(new Node(newPos, m));
//                 }
//             }
//         }
//         if (c != null) {
//             children = c.toArray(new Node[]{});
//         } else {
//             children = new Node[0];
//         }
//     }
// 
//     public Node[] getChildren() {
//         return children;
//     }
// }


// Path: xox/src/main/java/xox/ai/AI.java
import xox.game.Board;
import xox.game.Move;
import xox.game.Node;

package xox.ai;


public class AI {

    public static Move getMove(Board board, Move previous) {

        // Create the move as Node
        Node root = new Node(board, previous);