public Square[] getUnoccupiedSquares() { if (occupied == 0) { return squares; } Square[] unocc = new Square[squares.length - occupied]; int i = 0; for (Square sq : squares) { if (!sq.isOccupied()) { unocc[i] = sq; i++; } } return unocc; }
/** * Add a legal destination to the ArrayList. * * @param dest The Square to be added to the List * @return If the Square was successfully added to the ArrayList */ public boolean addLegalDest(Square dest) { // If the Square is not habitable, don't add it, but return true so we // can move past it. if (!dest.isHabitable()) return true; if (dest.getRow() == m_curSquare.getRow() && dest.getCol() == m_curSquare.getCol()) return false; if (dest.isOccupied() && dest.getPiece().isBlack() == isBlack()) { // If the destination has a Piece from the same team, we must be // guarding that Piece getGuardSquares().add(dest); return false; } // Otherwise, add the Piece and return true. getLegalDests().add(dest); return true; }
/** * Generate the ArrayList of legal destinations for this Piece * * @param board The Board on which to look for legal destinations * @return The number of legal destinations for this Piece */ public int genLegalDests(Board board) { // Clear both ArrayLists getLegalDests().clear(); getGuardSquares().clear(); setPinnedBy(null); // Boolean to tell when we are done generating destinations /* * Special genLegalDests for Pawns, to incorporate enPassant, special * initial movement, and diagonal capturing. */ if (m_name.equals("Pawn")) { Square dest = null; int dir, row, col; setPinnedBy(null); if (m_captured) return 0; dir = (isBlack()) ? -1 : 1; // Take one step forward if (board.isRowValid(m_curSquare.getRow() + dir)) { dest = board.getSquare(m_curSquare.getRow() + dir, m_curSquare.getCol()); if (!dest.isOccupied() && !getLegalDests().contains(dest)) addLegalDest(dest); } // Take an opposing piece if (board.isRowValid(row = (m_curSquare.getRow() + dir))) { col = m_curSquare.getCol(); // if valid row // and the square is occupied (by the other team) // or it's not my move (so I'm threatening the square) if (board.isColValid((col + 1)) && ((board.getSquare(row, col + 1).isOccupied() && isBlack() != board.getSquare(row, col + 1).getPiece().isBlack()))) { addLegalDest(board.getSquare(row, col + 1)); } if (board.isColValid((col - 1)) && ((board.getSquare(row, col - 1).isOccupied() && isBlack() != board.getSquare(row, col - 1).getPiece().isBlack()))) { addLegalDest(board.getSquare(row, col - 1)); } } // two step if (getMoveCount() == 0 && board.isRowValid((m_curSquare.getRow() + (2 * dir)))) { dest = board.getSquare((m_curSquare.getRow() + (2 * dir)), m_curSquare.getCol()); if (!dest.isOccupied() && !board.getSquare((m_curSquare.getRow() + dir), m_curSquare.getCol()).isOccupied() && !getLegalDests().contains(dest)) { addLegalDest(dest); } } if (board.getGame().isClassicChess()) { // enPassant if (isBlack() == board.isBlackTurn() && ((!isBlack() && m_curSquare.getRow() == 5) || (isBlack() && m_curSquare.getRow() == 4))) { col = m_curSquare.getCol(); row = isBlack() ? m_curSquare.getRow() - 1 : m_curSquare.getRow() + 1; if (board.isColValid(col + 1) && board.getEnpassantCol() == (col + 1)) addLegalDest(board.getSquare(row, (col + 1))); if (board.isColValid(col - 1) && board.getEnpassantCol() == (col - 1)) addLegalDest(board.getSquare(row, (col - 1))); } } return getLegalDests().size(); } boolean done = false; Square dest; boolean wraparound = board.isWrapAround(); /* * East */ if (m_movements.containsKey('E')) { int northMax = m_movements.get('E') + m_curSquare.getCol(); if (northMax > board.getMaxCol() || m_movements.get('E') == -1) { if (!wraparound) northMax = board.getMaxCol(); } for (int c = m_curSquare.getCol() + 1; ((m_movements.get('E') == -1 && wraparound) ? true : c <= northMax) && !done; c++) { int j = c; if (wraparound) { if (j > board.getMaxCol()) j = j % board.getMaxCol(); } if (j == 0) break; dest = board.getSquare(m_curSquare.getRow(), j); done = !addLegalDest(dest); done = m_isLeaper ? false : (done || (dest.isOccupied() && !(board.isBlackTurn() != isBlack() && dest.getPiece() .equals(board.getGame().getOtherObjectivePiece(isBlack()))))); } } done = false; /* * West */ if (m_movements.containsKey('W')) { int southMax = m_curSquare.getCol() - m_movements.get('W'); if (southMax < 1 || m_movements.get('W') == -1) { if (!wraparound) southMax = 1; } for (int c = m_curSquare.getCol() - 1; ((m_movements.get('W') == -1 && wraparound) ? true : c >= southMax) && !done; c--) { int j = c; if (wraparound) { if (j < 1) j = board.getMaxCol() + j; } dest = board.getSquare(m_curSquare.getRow(), j); done = !addLegalDest(dest); done = m_isLeaper ? false : (done || (dest.isOccupied() && !(board.isBlackTurn() != isBlack() && dest.getPiece() .equals(board.getGame().getOtherObjectivePiece(isBlack()))))); } } done = false; /* * North */ if (m_movements.containsKey('N')) { int eastMax = m_movements.get('N') + m_curSquare.getRow(); if (eastMax >= board.getMaxRow() || m_movements.get('N') == -1) eastMax = board.getMaxRow(); for (int r = m_curSquare.getRow() + 1; (r <= eastMax) && !done; r++) { int j = r; dest = board.getSquare(j, m_curSquare.getCol()); done = !addLegalDest(dest); done = m_isLeaper ? false : (done || (dest.isOccupied() && !(board.isBlackTurn() != isBlack() && dest.getPiece() .equals(board.getGame().getOtherObjectivePiece(isBlack()))))); } } done = false; /* * South */ if (m_movements.containsKey('S')) { int westMax = m_curSquare.getRow() - m_movements.get('S'); if (westMax < 1 || m_movements.get('S') == -1) westMax = 1; for (int r = m_curSquare.getRow() - 1; (r >= westMax) && !done; r--) { int j = r; dest = board.getSquare(j, m_curSquare.getCol()); done = !addLegalDest(dest); done = m_isLeaper ? false : (done || (dest.isOccupied() && !(board.isBlackTurn() != isBlack() && dest.getPiece() .equals(board.getGame().getOtherObjectivePiece(isBlack()))))); } } /* * NorthEast */ done = false; if (m_movements.containsKey('R')) { int neMax = ((m_curSquare.getRow() >= m_curSquare.getCol()) ? m_curSquare.getRow() : m_curSquare.getCol()) + m_movements.get('R'); if (neMax >= board.getMaxCol() || m_movements.get('R') == -1) neMax = board.getMaxCol(); if (neMax >= board.getMaxRow() || m_movements.get('R') == -1) neMax = board.getMaxRow(); for (int r = m_curSquare.getRow() + 1, c = m_curSquare.getCol() + 1; r <= neMax && c <= neMax && !done; r++, c++) { dest = board.getSquare(r, c); done = !addLegalDest(dest); done = m_isLeaper ? false : (done || (dest.isOccupied() && !(board.isBlackTurn() != isBlack() && dest.getPiece() .equals(board.getGame().getOtherObjectivePiece(isBlack()))))); } } /* * SouthEast */ done = false; if (m_movements.containsKey('r')) { int eastMax = m_curSquare.getCol() + m_movements.get('r'); if (eastMax >= board.getMaxCol() || m_movements.get('r') == -1) eastMax = board.getMaxCol(); int southMin = m_curSquare.getRow() - m_movements.get('r'); if (southMin <= 1 || m_movements.get('R') == -1) southMin = 1; for (int r = m_curSquare.getRow() - 1, c = m_curSquare.getCol() + 1; r >= southMin && c <= eastMax && !done; r--, c++) { dest = board.getSquare(r, c); done = !addLegalDest(dest); done = m_isLeaper ? false : (done || (dest.isOccupied() && !(board.isBlackTurn() != isBlack() && dest.getPiece() .equals(board.getGame().getOtherObjectivePiece(isBlack()))))); } } /* * NorthWest */ done = false; if (m_movements.containsKey('L')) { int westMin = m_curSquare.getCol() - m_movements.get('L'); if (westMin <= 1 || m_movements.get('L') == -1) westMin = 1; int NorthMax = m_curSquare.getRow() + m_movements.get('L'); if (NorthMax >= board.getMaxRow() || m_movements.get('L') == -1) NorthMax = board.getMaxRow(); for (int r = m_curSquare.getRow() + 1, c = m_curSquare.getCol() - 1; r <= NorthMax && c >= westMin && !done; r++, c--) { dest = board.getSquare(r, c); done = !addLegalDest(dest); done = m_isLeaper ? false : (done || (dest.isOccupied() && !(board.isBlackTurn() != isBlack() && dest.getPiece() .equals(board.getGame().getOtherObjectivePiece(isBlack()))))); } } /* * SouthWest */ done = false; if (m_movements.containsKey('l')) { int westMin = m_curSquare.getCol() - m_movements.get('l'); if (westMin <= 1 || m_movements.get('l') == -1) westMin = 1; int southMin = m_curSquare.getRow() - m_movements.get('l'); if (southMin <= 1 || m_movements.get('l') == -1) southMin = 1; for (int r = m_curSquare.getRow() - 1, c = m_curSquare.getCol() - 1; r >= southMin && c >= westMin && !done; r--, c--) { dest = board.getSquare(r, c); done = !addLegalDest(dest); done = m_isLeaper ? false : (done || (dest.isOccupied() && !(board.isBlackTurn() != isBlack() && dest.getPiece() .equals(board.getGame().getOtherObjectivePiece(isBlack()))))); } } /* * Knight / Leaper Movements * * * Store of Knight Movements are as followed: * * A Piece can move x File by y Rank squares at a time. * * IE: A knight can move 1 by 2 or 2 by 1, but not 1 by 1 or 2 by 2 */ if (m_movements.containsKey('x')) { int f, r; int Rank = m_movements.get('x'); int File = m_movements.get('y'); f = (m_curSquare.getRow() + File); r = (m_curSquare.getCol() + Rank); if (wraparound) { if (r > board.getMaxCol() + 1) r = r % board.getMaxCol(); } if (board.isRowValid(f) && board.isColValid(r)) addLegalDest(board.getSquare(f, r)); // two o'clock f = (m_curSquare.getRow() + Rank); r = (m_curSquare.getCol() + File); if (wraparound) { if (r > board.getMaxCol() + 1) r = r % board.getMaxCol(); } if (board.isRowValid(f) && board.isColValid(r)) addLegalDest(board.getSquare(f, r)); // four o'clock f = (m_curSquare.getRow() + File); r = (m_curSquare.getCol() - Rank); if (wraparound) { if (r < 1) r = board.getMaxCol() + r; } if (board.isRowValid(f) && board.isColValid(r)) addLegalDest(board.getSquare(f, r)); // five o'clock f = (m_curSquare.getRow() + Rank); r = (m_curSquare.getCol() - File); if (wraparound) { if (r < 1) r = board.getMaxCol() + r; } if (board.isRowValid(f) && board.isColValid(r)) addLegalDest(board.getSquare(f, r)); // seven o'clock f = (m_curSquare.getRow() - File); r = (m_curSquare.getCol() - Rank); if (wraparound) { if (r < 1) r = board.getMaxCol() + r; } if (board.isRowValid(f) && board.isColValid(r)) addLegalDest(board.getSquare(f, r)); // eight o'clock f = (m_curSquare.getRow() - Rank); r = (m_curSquare.getCol() - File); if (wraparound) { if (r < 1) r = board.getMaxCol() + r; } if (board.isRowValid(f) && board.isColValid(r)) addLegalDest(board.getSquare(f, r)); // ten o'clock f = (m_curSquare.getRow() - File); r = (m_curSquare.getCol() + Rank); if (wraparound) { if (r > board.getMaxCol() + 1) r = r % board.getMaxCol(); } if (board.isRowValid(f) && board.isColValid(r)) addLegalDest(board.getSquare(f, r)); // eleven o'clock f = (m_curSquare.getRow() - Rank); r = (m_curSquare.getCol() + File); if (wraparound) { if (r > board.getMaxCol() + 1) r = r % board.getMaxCol(); } if (board.isRowValid(f) && board.isColValid(r)) addLegalDest(board.getSquare(f, r)); } return getLegalDests().size(); }