Пример #1
0
        public MoveWrapper(string moveString, ChessBoard cb)
        {
            FromFile  = moveString[0];
            FromRank  = int.Parse(moveString.Substring(1, 1));
            FromIndex = (FromRank - 1) * 8 + 104 - FromFile;

            ToFile  = moveString[2];
            ToRank  = int.Parse(moveString.Substring(3, 1));
            ToIndex = (ToRank - 1) * 8 + 104 - ToFile;

            PieceIndex =
                (cb.Pieces[cb.ColorToMove][ChessConstants.Pawn] & Util.PowerLookup[FromIndex]) != 0
                    ? ChessConstants.Pawn
                    : (cb.Pieces[cb.ColorToMove][ChessConstants.Bishop] & Util.PowerLookup[FromIndex]) != 0
                        ? ChessConstants.Bishop
                        : (cb.Pieces[cb.ColorToMove][ChessConstants.Knight] & Util.PowerLookup[FromIndex]) != 0
                            ? ChessConstants.Knight
                            : (cb.Pieces[cb.ColorToMove][ChessConstants.King] & Util.PowerLookup[FromIndex]) != 0
                                ? ChessConstants.King
                                : (cb.Pieces[cb.ColorToMove][ChessConstants.Queen] & Util.PowerLookup[FromIndex]) != 0
                                    ? ChessConstants.Queen
                                    : (cb.Pieces[cb.ColorToMove][ChessConstants.Rook] & Util.PowerLookup[FromIndex]) !=
                0
                                        ? ChessConstants.Rook
                                        : -1;
            if (PieceIndex == -1)
            {
                throw new ArgumentException("Source piece not found at index " + FromIndex);
            }

            PieceIndexAttacked =
                (cb.Pieces[cb.ColorToMoveInverse][ChessConstants.Pawn] & Util.PowerLookup[ToIndex]) != 0
                    ? ChessConstants.Pawn
                    : (cb.Pieces[cb.ColorToMoveInverse][ChessConstants.Bishop] & Util.PowerLookup[ToIndex]) != 0
                        ? ChessConstants.Bishop
                        : (cb.Pieces[cb.ColorToMoveInverse][ChessConstants.Knight] & Util.PowerLookup[ToIndex]) != 0
                            ? ChessConstants.Knight
                            : (cb.Pieces[cb.ColorToMoveInverse][ChessConstants.King] & Util.PowerLookup[ToIndex]) != 0
                                ? ChessConstants.King
                                : (cb.Pieces[cb.ColorToMoveInverse][ChessConstants.Queen] &
                                   Util.PowerLookup[ToIndex]) != 0
                                    ? ChessConstants.Queen
                                    : (cb.Pieces[cb.ColorToMoveInverse][ChessConstants.Rook] &
                                       Util.PowerLookup[ToIndex]) != 0
                                        ? ChessConstants.Rook
                                        : 0;

            if (PieceIndexAttacked == 0)
            {
                switch (PieceIndex)
                {
                case ChessConstants.Pawn when ToRank == 1 || ToRank == 8:
                {
                    if (moveString.Length == 5)
                    {
                        switch (moveString.Substring(4, 1))
                        {
                        case "n":
                            IsKnightPromotion = true;
                            Move = MoveUtil.CreatePromotionMove(MoveUtil.TypePromotionN, FromIndex, ToIndex);
                            break;

                        case "r":
                            IsRookPromotion = true;
                            Move            = MoveUtil.CreatePromotionMove(MoveUtil.TypePromotionR, FromIndex, ToIndex);
                            break;

                        case "b":
                            IsBishopPromotion = true;
                            Move = MoveUtil.CreatePromotionMove(MoveUtil.TypePromotionB, FromIndex, ToIndex);
                            break;

                        case "q":
                            IsQueenPromotion = true;
                            Move             = MoveUtil.CreatePromotionMove(MoveUtil.TypePromotionQ, FromIndex, ToIndex);
                            break;
                        }
                    }
                    else
                    {
                        IsQueenPromotion = true;
                        Move             = MoveUtil.CreatePromotionMove(MoveUtil.TypePromotionQ, FromIndex, ToIndex);
                    }

                    break;
                }

                case ChessConstants.King when FromIndex - ToIndex == 2 || FromIndex - ToIndex == -2:
                    // castling
                    Move = MoveUtil.CreateCastlingMove(FromIndex, ToIndex);
                    break;

                case ChessConstants.Pawn when ToIndex % 8 != FromIndex % 8:
                    // ep
                    Move = MoveUtil.CreateEpMove(FromIndex, ToIndex);
                    break;

                default:
                    Move = MoveUtil.CreateMove(FromIndex, ToIndex, PieceIndex);
                    break;
                }
            }
            else
            {
                if (PieceIndex == ChessConstants.Pawn && (ToRank == 1 || ToRank == 8))
                {
                    if (moveString.Length == 5)
                    {
                        if (moveString.Substring(4, 1).Equals("n"))
                        {
                            IsKnightPromotion = true;
                            Move = MoveUtil.CreatePromotionAttack(MoveUtil.TypePromotionN, FromIndex, ToIndex,
                                                                  PieceIndexAttacked);
                        }
                        else if (moveString.Substring(4, 1).Equals("r"))
                        {
                            IsRookPromotion = true;
                            Move            = MoveUtil.CreatePromotionAttack(MoveUtil.TypePromotionR, FromIndex, ToIndex,
                                                                             PieceIndexAttacked);
                        }
                        else if (moveString.Substring(4, 1).Equals("b"))
                        {
                            IsBishopPromotion = true;
                            Move = MoveUtil.CreatePromotionAttack(MoveUtil.TypePromotionB, FromIndex, ToIndex,
                                                                  PieceIndexAttacked);
                        }
                        else if (moveString.Substring(4, 1).Equals("q"))
                        {
                            IsQueenPromotion = true;
                            Move             = MoveUtil.CreatePromotionAttack(MoveUtil.TypePromotionQ, FromIndex, ToIndex,
                                                                              PieceIndexAttacked);
                        }
                    }
                    else
                    {
                        Move = MoveUtil.CreatePromotionAttack(MoveUtil.TypePromotionQ, FromIndex, ToIndex,
                                                              PieceIndexAttacked);
                    }
                }
                else
                {
                    Move = MoveUtil.CreateAttackMove(FromIndex, ToIndex, PieceIndex, PieceIndexAttacked);
                }
            }
        }