Esempio n. 1
0
        private static void MakeCastleMoves(Position p, List<Move> moves)
        {
            var player_to_move = p.PlayerToMove;
            var other_player = Helper.GetOtherPlayer(player_to_move);
            var my_pieces = p.GetPieces(player_to_move);

            int base_row = player_to_move == Players.White ?
                Chessboard.ROW_MIN : Chessboard.ROW_MAX;
            if (my_pieces.KingsCell != ChessboardCell.CalculateValue(
                base_row, Chessboard.COLUMN_E)
                || p.IsInCheck)
            {
                return;
            }

            if (p.IsCanCastleShort(player_to_move)
                && my_pieces.IsOccupiedCell(ChessboardCell.CalculateValue(
                    base_row, Chessboard.COLUMN_H))
                && my_pieces.IsRookAtCell(ChessboardCell.CalculateValue(
                    base_row, Chessboard.COLUMN_H))
                && p.IsEmptyCell(ChessboardCell.CalculateValue(
                    base_row, Chessboard.COLUMN_F))
                && p.IsEmptyCell(ChessboardCell.CalculateValue(
                    base_row, Chessboard.COLUMN_G))
                && !PositionHelper.IsCellAttacked(
                    new ChessboardCell(base_row, Chessboard.COLUMN_F),
                    other_player, p))
            {
                moves.Add(new Move(Exports.Pieces.King,
                    ChessboardCell.CalculateValue(base_row, Chessboard.COLUMN_E),
                    ChessboardCell.CalculateValue(base_row, Chessboard.COLUMN_G),
                    0, Move.Flags.ShortCastle));
            }

            if (p.IsCanCastleLong(player_to_move)
                && my_pieces.IsOccupiedCell(ChessboardCell.CalculateValue(
                    base_row, Chessboard.COLUMN_A))
                && my_pieces.IsRookAtCell(ChessboardCell.CalculateValue(
                    base_row, Chessboard.COLUMN_A))
                && p.IsEmptyCell(ChessboardCell.CalculateValue(
                    base_row, Chessboard.COLUMN_D))
                && p.IsEmptyCell(ChessboardCell.CalculateValue(
                    base_row, Chessboard.COLUMN_C))
                && p.IsEmptyCell(ChessboardCell.CalculateValue(
                    base_row, Chessboard.COLUMN_B))
                && !PositionHelper.IsCellAttacked(
                    new ChessboardCell(base_row, Chessboard.COLUMN_D),
                    other_player, p))
            {
                moves.Add(new Move(Exports.Pieces.King,
                    ChessboardCell.CalculateValue(base_row, Chessboard.COLUMN_E),
                    ChessboardCell.CalculateValue(base_row, Chessboard.COLUMN_C),
                    0, Move.Flags.LongCastle));
            }
        }