package dev.kske.chess.board; import java.util.ArrayList; import java.util.List; /** * Project: Chess
* File: Queen.java
* Created: 01.07.2019
* Author: Kai S. K. Engelbart */ public class Queen extends Piece { public Queen(Color color, Board board) { super(color, board); } @Override public boolean isValidMove(Move move) { return ((move.isHorizontal() || move.isVertical()) || move.isDiagonal()) && isFreePath(move); } @Override protected boolean isFreePath(Move move) { if (move.isHorizontal()) { for (int i = move.pos.x + move.xSign; i != move.dest.x; i += move.xSign) if (board.getBoardArr()[i][move.pos.y] != null) return false; } else if (move.isVertical()) { for (int i = move.pos.y + move.ySign; i != move.dest.y; i += move.ySign) if (board.getBoardArr()[move.pos.x][i] != null) return false; } else { for (int i = move.pos.x + move.xSign, j = move.pos.y + move.ySign; i != move.dest.x; i += move.xSign, j += move.ySign) if (board.getBoardArr()[i][j] != null) return false; } return checkDestination(move); } @Override protected List getPseudolegalMoves(Position pos) { List moves = new ArrayList<>(); // Horizontal moves to the right for (int i = pos.x + 1; i < 8; i++) { Move move = new Move(pos, new Position(i, pos.y)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Horizontal moves to the left for (int i = pos.x - 1; i >= 0; i--) { Move move = new Move(pos, new Position(i, pos.y)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Vertical moves to the top for (int i = pos.y - 1; i >= 0; i--) { Move move = new Move(pos, new Position(pos.x, i)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Vertical moves to the bottom for (int i = pos.y + 1; i < 8; i++) { Move move = new Move(pos, new Position(pos.x, i)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Diagonal moves to the lower right for (int i = pos.x + 1, j = pos.y + 1; i < 8 && j < 8; i++, j++) { Move move = new Move(pos, new Position(i, j)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Diagonal moves to the lower left for (int i = pos.x - 1, j = pos.y + 1; i >= 0 && j < 8; i--, j++) { Move move = new Move(pos, new Position(i, j)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Diagonal moves to the upper right for (int i = pos.x + 1, j = pos.y - 1; i < 8 && j >= 0; i++, j--) { Move move = new Move(pos, new Position(i, j)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } // Diagonal moves to the upper left for (int i = pos.x - 1, j = pos.y - 1; i >= 0 && j >= 0; i--, j--) { Move move = new Move(pos, new Position(i, j)); if (board.getDest(move) == null || board.getDest(move).getColor() != getColor()) { moves.add(move); if (board.getDest(move) != null) break; } else break; } return moves; } @Override public Type getType() { return Type.QUEEN; } }