示例#1
0
        // get the move type using the before and after piece types
        private static PieceMoveType MoveTypeFromPieceTypes(PieceMoveType before, PieceMoveType after)
        {
            // argument guard
            if (before < PieceMoveType.Pawn || before > PieceMoveType.King || after < PieceMoveType.Pawn || after > PieceMoveType.King)
            {
                return(PieceMoveType.Undefined);
            }

            if (before == after)   // standard or castling move
            {
                return(before);
            }
            else if (before == PieceMoveType.Pawn)     // pawn promo
            {
                switch (after)
                {
                case PieceMoveType.Queen:
                    return(PieceMoveType.PawnQueen);

                case PieceMoveType.Rook:
                    return(PieceMoveType.PawnRook);

                case PieceMoveType.Bishop:
                    return(PieceMoveType.PawnBishop);

                case PieceMoveType.Knight:
                    return(PieceMoveType.PawnKnight);

                default:
                    return(PieceMoveType.Undefined);
                }
            }

            return(PieceMoveType.Undefined);
        }
示例#2
0
 public Move(ulong f, ulong t, PieceMoveType m)
 {
     From     = new BoardAddress(f);
     To       = new BoardAddress(t);
     MoveType = m;
 }
示例#3
0
        // create a move from ACN string and the piece positions
        public Move(string acn, PiecePositions pieces)
        {
            int Len = acn.Length;

            if (Len < 4 || Len > 5)
            {
                throw new ArgumentException(string.Format("ACN strings must be 4 or 5 characters long: \"{0}\"", acn));
            }
            string f = acn.Substring(0, 2);
            string t = acn.Substring(2, 2);

            From = new BoardAddress(f);
            To   = new BoardAddress(t);

            // determine the type of piece that is moving
            if ((pieces.Pawns & From.Position) != 0)
            {
                MoveType = PieceMoveType.Pawn;
            }
            else if ((pieces.Knights & From.Position) != 0)
            {
                MoveType = PieceMoveType.Knight;
            }
            else if ((pieces.Bishops & From.Position) != 0)
            {
                MoveType = PieceMoveType.Bishop;
            }
            else if ((pieces.Rooks & From.Position) != 0)
            {
                MoveType = PieceMoveType.Rook;
            }
            else if ((pieces.Queens & From.Position) != 0)
            {
                MoveType = PieceMoveType.Queen;
            }
            else if ((pieces.Kings & From.Position) != 0)
            {
                MoveType = PieceMoveType.King;
            }
            else
            {
                throw new ArgumentException(string.Format("move \"{0}\" invalid given current piece positions", acn));
            }

            // promotion on this move?
            if (Len == 5)   // yes
            {
                if (MoveType != PieceMoveType.Pawn)
                {
                    throw new ArgumentException("tried to promote from a piece type other than pawn");
                }
                char promo = char.ToLower(acn[4]);
                switch (promo)
                {
                case 'n':
                    MoveType = PieceMoveType.PawnKnight;
                    break;

                case 'b':
                    MoveType = PieceMoveType.PawnBishop;
                    break;

                case 'r':
                    MoveType = PieceMoveType.PawnRook;
                    break;

                case 'q':
                    MoveType = PieceMoveType.PawnQueen;
                    break;

                default:
                    throw new ArgumentException(string.Format("ACN string contains invalid promotion character \"{0}\"", promo));
                }
            }
        }
示例#4
0
 public Move(BoardAddress f, BoardAddress t, PieceMoveType m)
 {
     From     = f;
     To       = t;
     MoveType = m;
 }