Example #1
0
        internal void UndoMove(Move move)
        {
            //ARRAY
            this.pieceSet[move.FromSquare] = this.pieceSet[move.ToSquare]; // muove il pezzo
            this.pieceSet[move.ToSquare] = move.IsCapture() ? new Piece(SideToMove, move.PieceCaptured) : new Piece(PieceColor.None, PieceType.None); // svuota o riempie la casella di partenza

            //BITBOARDS
            BitBoard From = Constants.SquareMask[move.FromSquare];
            BitBoard To = Constants.SquareMask[move.ToSquare];
            BitBoard FromTo = From | To;

            this.SideToMove = this.SideToMove.GetOpposite();

            // aggiorna la bitboard
            this.bitBoardSet[this.SideToMove][move.PieceMoved] ^= FromTo;
            if (this.SideToMove == PieceColor.White)
                this.WhitePieces ^= FromTo;
            else
                this.BlackPieces ^= FromTo;

            if (move.PieceMoved == PieceType.King)
                this.kingSquare[this.SideToMove] = move.FromSquare;

            if (move.IsCapture())
            {
                this.bitBoardSet[this.SideToMove.GetOpposite()][move.PieceCaptured] ^= To;

                //aggiorna i pezzi dell'avversario
                if (this.SideToMove == PieceColor.White)
                    this.BlackPieces ^= To;
                else
                    this.WhitePieces ^= To;

                this.OccupiedSquares ^= From;
                this.EmptySquares ^= From;
            }
            else
            {
                this.OccupiedSquares ^= FromTo;
                this.EmptySquares ^= FromTo;
            }
        }