Esempio n. 1
0
        // Return false if move is illegal
        public bool MakeMove(int oldPos, int destPos)
        {
            PieceType pieceType = S[oldPos].PieceType;

            // Handle queening and castle prevention
            if (WhosMove == Colour.Black)
            {
                if (pieceType == PieceType.Pawn)
                {
                    if (Rank(destPos) == 0)
                        S[oldPos] = new Piece(Colour.Black, PieceType.Queen);
                    if (destPos == oldPos - 16)   // set en-passant square
                        EpSquare = destPos + 8;
                }
                else if (pieceType == PieceType.King)
                {
                    BlackCanQCastle = false;
                    BlackCanKCastle = false;
                    if (destPos == oldPos + 2)   //Q-side castle move rook
                    {
                        S[63] = null;
                        S[60] = new Piece(Colour.Black, PieceType.Rook);
                    }
                    if (destPos == oldPos - 2)   //K-side castle move rook
                    {
                        S[56] = null;
                        S[58] = new Piece(Colour.Black, PieceType.Rook);
                    }
                }
                else if (pieceType == PieceType.Rook && oldPos == 56)
                    BlackCanKCastle = false;
                else if (pieceType == PieceType.Rook && oldPos == 63)
                    BlackCanQCastle = false;
            }
            if (WhosMove == Colour.White)
            {
                if (pieceType == PieceType.Pawn)
                {
                    if (Rank(destPos) == 7)
                        S[oldPos] = new Piece(Colour.White, PieceType.Queen);
                    if (destPos == oldPos + 16)  // set en-passant square
                        EpSquare = destPos - 8;
                }
                if (pieceType == PieceType.King)
                {
                    WhiteCanQCastle = false;
                    WhiteCanKCastle = false;
                    if (destPos == oldPos + 2)   //Q-side castle move rook
                    {
                        S[7] = null;
                        S[4] = new Piece(Colour.White, PieceType.Rook);
                    }
                    if (destPos == oldPos - 2)   //K-side castle move rook
                    {
                        S[0] = null;
                        S[2] = new Piece(Colour.White, PieceType.Rook);
                    }
                }
                if (pieceType == PieceType.Rook && oldPos == 0)
                    WhiteCanKCastle = false;
                if (pieceType == PieceType.Rook && oldPos == 7)
                    WhiteCanQCastle = false;
            }

            if (destPos == m_OldBoard.EpSquare && pieceType == PieceType.Pawn)
            {
                if (WhosMove == Colour.White)
                    S[m_OldBoard.EpSquare - 8] = null;
                if (WhosMove == Colour.Black)
                    S[m_OldBoard.EpSquare + 8] = null;
            }
            S[destPos] = new Piece(S[oldPos]);
            S[oldPos] = null;

            if (KingIsInCheck) return false;

            this.WhosMove = m_OldBoard.WhosMove == Colour.White ? Colour.Black : Colour.White;

            return true;
        }
Esempio n. 2
0
        public Board(Board currentBoard)
        {
            this.BlackCanQCastle = currentBoard.BlackCanQCastle;
            this.BlackCanKCastle = currentBoard.BlackCanKCastle;
            this.WhiteCanQCastle = currentBoard.WhiteCanQCastle;
            this.WhiteCanKCastle = currentBoard.WhiteCanKCastle;
            this.WhosMove = currentBoard.WhosMove;

            for (int i = 0; i < 64; i++)
            {
                if (currentBoard.S[i] != null)
                    S[i] = new Piece(currentBoard.S[i]);
            }
            m_OldBoard = currentBoard;
        }
Esempio n. 3
0
 public Piece(Piece piece)
     : this(piece.Colour, piece.PieceType)
 {
 }