private static CheckStatus analyseCheckAfterEnpassent( SimpleChessBoardInterface game, boolean whiteInCheck, Move lastMove) { final Position kingPos = game.getKingPosition(whiteInCheck); final List<Position> attackPositions = new ArrayList<Position>(2); final Figure attackFigure = game.getFigure(lastMove.to); Position passiveAttacker = getPassiveAttacker(game, kingPos, lastMove.from); if (passiveAttacker == null) { // an attackpath may have opend over the diagonal of the removed pawn Position removedPawnPos = Position.get(lastMove.from.row, lastMove.to.column); passiveAttacker = getPassiveAttacker(game, kingPos, removedPawnPos); } if (attackFigure.isReachable(kingPos, game)) { attackPositions.add(attackFigure.getPosition()); } if (passiveAttacker != null) { attackPositions.add(passiveAttacker); } switch (attackPositions.size()) { case 0: return CheckStatus.NO_CHECK; case 1: return getPossiblePositions(kingPos, attackPositions.get(0)); case 2: return CheckStatus.DOUBLE_CHECK; default: throw new IllegalStateException( "more than 2 attackers are impossible " + attackPositions.size()); } }
private static CheckStatus analyseCheckAfterPawnTransform( SimpleChessBoardInterface game, boolean whiteInCheck, Move lastMove) { final Position kingPos = game.getKingPosition(whiteInCheck); final Figure transformedPawn = game.getFigure(lastMove.to); final List<Position> attackPositions = new ArrayList<Position>(2); final Position passiveAttacker = getPassiveAttacker(game, kingPos, lastMove.from); if (transformedPawn.isReachable(kingPos, game)) { attackPositions.add(lastMove.to); } if (passiveAttacker != null && !passiveAttacker.equalsPosition(lastMove.to)) { attackPositions.add(passiveAttacker); } switch (attackPositions.size()) { case 0: return CheckStatus.NO_CHECK; case 1: return getPossiblePositions(kingPos, attackPositions.get(0)); case 2: return CheckStatus.DOUBLE_CHECK; default: throw new IllegalStateException( "more than 2 attackers are impossible " + attackPositions.size()); } }
private static CheckStatus analyseCheckAfterRochade( SimpleChessBoardInterface game, boolean whiteInCheck, Move lastMove) { final Position kingPos = game.getKingPosition(whiteInCheck); final int rock_row = lastMove.to.row; final int rock_column = lastMove.to.column == 2 ? 3 : 5; final Position rockPos = Position.get(rock_row, rock_column); final Figure rock = game.getFigure(rockPos); if (rock.isReachable(kingPos, game)) return getPossiblePositions(kingPos, rockPos); return CheckStatus.NO_CHECK; }
public static CheckStatus analyseCheck(SimpleChessBoardInterface game, boolean whiteInCheck) { final Position kingPos = game.getKingPosition(whiteInCheck); final boolean isWhite = game.getFigure(kingPos).isWhite(); final List<Position> attackPositions = new ArrayList<Position>(2); isCheckByBishopOrQueen(game, kingPos, attackPositions, isWhite); isCheckByKing(game, kingPos, attackPositions); isCheckByKnight(game, kingPos, attackPositions, isWhite); isCheckByPawn(game, kingPos, attackPositions, isWhite); isCheckByRockOrQueen(game, kingPos, attackPositions, isWhite); switch (attackPositions.size()) { case 0: return CheckStatus.NO_CHECK; case 1: return getPossiblePositions(kingPos, attackPositions.get(0)); case 2: return CheckStatus.DOUBLE_CHECK; default: throw new IllegalStateException( "more than 2 attackers are impossible " + attackPositions.size()); } }
public static CheckStatus analyseCheck( SimpleChessBoardInterface game, boolean whiteInCheck, ExtendedMove lastMove) { if (lastMove == null) { return analyseCheck(game, whiteInCheck); } if (lastMove.isEnpassent()) return analyseCheckAfterEnpassent(game, whiteInCheck, lastMove); if (lastMove.isRochade()) return analyseCheckAfterRochade(game, whiteInCheck, lastMove); if (lastMove.pawnTransformed()) return analyseCheckAfterPawnTransform(game, whiteInCheck, lastMove); final Position kingPos = game.getKingPosition(whiteInCheck); final Figure movedFigure = game.getFigure(lastMove.to); final List<Position> attackPositions = new ArrayList<Position>(2); if (movedFigure.isReachable(kingPos, game)) { attackPositions.add(lastMove.to); } Position passiveAttacker = getPassiveAttacker(game, kingPos, lastMove.from); if (passiveAttacker != null) { attackPositions.add(passiveAttacker); } switch (attackPositions.size()) { case 0: return CheckStatus.NO_CHECK; case 1: return getPossiblePositions(kingPos, attackPositions.get(0)); case 2: return CheckStatus.DOUBLE_CHECK; default: throw new IllegalStateException( "more than 2 attackers are impossible " + attackPositions.size()); } }