import TBNG.tbngAbstractBoardPlayerMatrix; public class othello2PlayerMatrix extends tbngAbstractBoardPlayerMatrix { public othello2PlayerMatrix (int rows, int columns) { boardMatrix = new int[rows][columns]; resetMatrix(); } //Checks each direction and depending on if doMove is true will perform the move for each direction private boolean checkEachDirection (int row, int column, int piece, boolean doMove) { boolean legalMove = false; if (checkNorth(row, column, piece, doMove)) { legalMove = true; } if (checkNorthEast(row, column, piece, doMove)) { legalMove = true; } if (checkEast(row, column, piece, doMove)) { legalMove = true; } if (checkSouthEast(row, column, piece, doMove)) { legalMove = true; } if (checkSouth(row, column, piece, doMove)) { legalMove = true; } if (checkSouthWest(row, column, piece, doMove)) { legalMove = true; } if (checkWest(row, column, piece, doMove)) { legalMove = true; } if (checkNorthWest(row, column, piece, doMove)) { legalMove = true; } return legalMove; } private boolean checkEast (int row, int startColumn, int piece, boolean doMove) { int desColumn = -1; int cellsBetween = 0; for (int column = (startColumn + 1); column < boardMatrix.length; column++) { if (boardMatrix[row][column] == EMPTY) { return false; } else if (boardMatrix[row][column] == piece) { desColumn = column; break; } cellsBetween++; } if (desColumn == -1 || cellsBetween == 0) { return false; } if (!doMove) { return true; } for (int column = (startColumn + 1);cellsBetween > 0; cellsBetween--, column++) { boardMatrix[row][column] = piece; } return true; } private boolean checkNorth (int startRow, int column, int piece, boolean doMove) { int desRow = -1; int cellsBetween = 0; for (int row = (startRow - 1); row >= 0; row--) { if (boardMatrix[row][column] == EMPTY) { return false; } else if (boardMatrix[row][column] == piece) { desRow = row; break; } cellsBetween++; } if (desRow == -1 || cellsBetween == 0) { return false; } if (!doMove) //If only testing, then do not overwrite the coins { return true; } for (int row = (startRow - 1);cellsBetween > 0; cellsBetween--, row--) { boardMatrix[row][column] = piece; } return true; } private boolean checkNorthEast (int startRow, int startColumn, int piece, boolean doMove) { int desRow = -1; int desColumn = -1; int cellsBetween = 0; for (int row = (startRow - 1), column = (startColumn + 1); row >= 0 && column < boardMatrix.length; row--, column++) { if (boardMatrix[row][column] == EMPTY) { return false; } else if (boardMatrix[row][column] == piece) { desRow = row; desColumn = column; break; } cellsBetween++; } if (desRow == -1 || cellsBetween == 0) { return false; } if (!doMove) //If only testing, then do not overwrite the coins { return true; } for (int row = (startRow - 1), column = (startColumn + 1);cellsBetween > 0; cellsBetween--, row--, column++) { boardMatrix[row][column] = piece; } return true; } private boolean checkNorthWest (int startRow, int startColumn, int piece, boolean doMove) { int desRow = -1; int desColumn = -1; int cellsBetween = 0; for (int row = (startRow - 1), column = (startColumn - 1); row >= 0 && column >= 0; row--, column--) { if (boardMatrix[row][column] == EMPTY) { return false; } else if (boardMatrix[row][column] == piece) { desRow = row; desColumn = column; break; } cellsBetween++; } if (desRow == -1 || cellsBetween == 0) { return false; } if (!doMove) //If only testing, then do not overwrite the coins { return true; } for (int row = (startRow - 1), column = (startColumn - 1);cellsBetween > 0; cellsBetween--, row--, column--) { boardMatrix[row][column] = piece; } return true; } private boolean checkSouth (int startRow, int column, int piece, boolean doMove) { int desRow = -1; int cellsBetween = 0; for (int row = (startRow + 1); row < boardMatrix.length; row++) { if (boardMatrix[row][column] == EMPTY) { return false; } else if (boardMatrix[row][column] == piece) { desRow = row; break; } cellsBetween++; } if (desRow == -1 || cellsBetween == 0) { return false; } if (!doMove) { return true; } for (int row = (startRow + 1);cellsBetween > 0; cellsBetween--, row++) { boardMatrix[row][column] = piece; } return true; } private boolean checkSouthEast (int startRow, int startColumn, int piece, boolean doMove) { int desRow = -1; int desColumn = -1; int cellsBetween = 0; for (int row = (startRow + 1), column = (startColumn + 1); row < boardMatrix.length && column < boardMatrix.length; row++, column++) { if (boardMatrix[row][column] == EMPTY) { return false; } else if (boardMatrix[row][column] == piece) { desRow = row; desColumn = column; break; } cellsBetween++; } if (desRow == -1 || cellsBetween == 0) { return false; } if (!doMove) //If only testing, then do not overwrite the coins { return true; } for (int row = (startRow + 1), column = (startColumn + 1);cellsBetween > 0; cellsBetween--, row++, column++) { boardMatrix[row][column] = piece; } return true; } private boolean checkSouthWest (int startRow, int startColumn, int piece, boolean doMove) { int desRow = -1; int desColumn = -1; int cellsBetween = 0; for (int row = (startRow + 1), column = (startColumn - 1); row < boardMatrix.length && column >= 0; row++, column--) { if (boardMatrix[row][column] == EMPTY) { return false; } else if (boardMatrix[row][column] == piece) { desRow = row; desColumn = column; break; } cellsBetween++; } if (desRow == -1 || cellsBetween == 0) { return false; } if (!doMove) //If only testing, then do not overwrite the coins { return true; } for (int row = (startRow + 1), column = (startColumn - 1);cellsBetween > 0; cellsBetween--, row++, column--) { boardMatrix[row][column] = piece; } return true; } private boolean checkWest (int row, int startColumn, int piece, boolean doMove) { int desColumn = -1; int cellsBetween = 0; for (int column = (startColumn - 1); column >= 0; column--) { if (boardMatrix[row][column] == EMPTY) { return false; } else if (boardMatrix[row][column] == piece) { desColumn = column; break; } cellsBetween++; } if (desColumn == -1 || cellsBetween == 0) { return false; } if (!doMove) { return true; } for (int column = (startColumn - 1);cellsBetween > 0; cellsBetween--, column--) { boardMatrix[row][column] = piece; } return true; } public boolean isLegalMove (int row, int column, int piece) { if (boardMatrix[row][column] != EMPTY) { return false; } return checkEachDirection(row, column, piece, false); //Check each direction, but do not perform the move } public boolean isWinner (int row, int column, int piece) { return true; } public void setCellContents (int row, int column, int piece) { checkEachDirection(row, column, piece, true); boardMatrix[row][column] = piece; } }