Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
                    }
                }
            }
        }
Exemplo n.º 3
0
 private static bool IsKingInCheck(Board board, King king) => IsCheckedRoseDirections(board, king) || IsCheckedKnightDirections(board, king);
Exemplo n.º 4
0
 public King(King kingCopy) : base(kingCopy)
 {
 }