public final class QueenAttackCalculator {
private final BoardCoordinate whiteQueenCoordinate;
private final BoardCoordinate blackQueenCoordinate;
public QueenAttackCalculator(final BoardCoordinate whiteQueenCoordinate, final BoardCoordinate blackQueenCoordinate)
throws IllegalArgumentException {
this.whiteQueenCoordinate = whiteQueenCoordinate;
this.blackQueenCoordinate = blackQueenCoordinate;
validateInputs();
}
public boolean canQueensAttackOneAnother() {
return queensShareFile() || queensShareRank() || queensShareDiagonal();
}
private void validateInputs() throws IllegalArgumentException {
if (whiteQueenCoordinate == null || blackQueenCoordinate == null) {
throw new IllegalArgumentException("You must supply valid board coordinates for both Queens.");
}
if (queensShareBoardCoordinate()) {
throw new IllegalArgumentException("Queens may not occupy the same board coordinate.");
}
}
private boolean queensShareRank() {
return differenceBetweenRanks() == 0;
}
private boolean queensShareFile() {
return differenceBetweenFiles() == 0;
}
private boolean queensShareBoardCoordinate() {
return queensShareRank() && queensShareFile();
}
private boolean queensShareDiagonal() {
return differenceBetweenRanks() == differenceBetweenFiles();
}
private int differenceBetweenRanks() {
return Math.abs(whiteQueenCoordinate.getRank() - blackQueenCoordinate.getRank());
}
private int differenceBetweenFiles() {
return Math.abs(whiteQueenCoordinate.getFile() - blackQueenCoordinate.getFile());
}
}