private static bool IsCheckedRoseDirections(Board board, King king) { List <Square> surroundingSquares = new List <Square>(); List <Square> pawnAttackingSquares = new List <Square>(); GenerateSquareLists(surroundingSquares, pawnAttackingSquares, king); foreach (int fileOffset in new[] { -1, 0, 1 }) { foreach (int rankOffset in new[] { -1, 0, 1 }) { if (fileOffset == 0 && rankOffset == 0) { continue; } Square testSquare = new Square(king.Position, fileOffset, rankOffset); while (testSquare.IsValid && !board.IsOccupiedBySide(testSquare, king.Color)) { if (board.IsOccupiedBySide(testSquare, king.Color.Complement())) { Piece piece = board[testSquare]; //diagonal direction if (Math.Abs(fileOffset) == Math.Abs(rankOffset)) { if (piece is Bishop || piece is Queen || testSquare.Rank == king.Position.Rank + (king.Color == Side.White ? 1 : -1) && (testSquare.File == king.Position.File + 1 || testSquare.File == king.Position.File - 1) && piece is Pawn) { return(true); } switch (piece) { case King _ when surroundingSquares.Contains(piece.Position): case Pawn _ when pawnAttackingSquares.Contains(piece.Position): return(true); } } //cardinal directions else { switch (piece) { case Rook _: case Queen _: case King _ when surroundingSquares.Contains(piece.Position): return(true); } } break; } testSquare = new Square(testSquare, fileOffset, rankOffset); } } } return(false); }
private static void GenerateSquareLists(List <Square> surroundingSquares, List <Square> pawnAttackingSquares, King king) { foreach (int fileOffset in new[] { -1, 0, 1 }) { foreach (int rankOffset in new[] { -1, 0, 1 }) { if (fileOffset == 0 && rankOffset == 0) { continue; } Square testSquare = new Square(king.Position, fileOffset, rankOffset); if (testSquare.IsValid) { if ((fileOffset == 1 || fileOffset == -1) && rankOffset == (king.Color == Side.White ? 1 : -1)) { pawnAttackingSquares.Add(testSquare); } surroundingSquares.Add(testSquare); } } } }
private static bool IsKingInCheck(Board board, King king) => IsCheckedRoseDirections(board, king) || IsCheckedKnightDirections(board, king);
public King(King kingCopy) : base(kingCopy) { }