chessbitboard

Sliding move generation using magic bitboard


This is a question regarding the big picture of how to validate a sliding piece move in chess using magic bitboards. Just to clarify, I am not asking how magic bitboards work internally.

Now, some more details about the question. I'm writing chess board representation using bitboard and I want to validate sliding piece moves using magic bitboards. Can somebody list the main steps of how to achieve that? As an example consider the following board position:

White to move. Validate a given move for the rook on g3

Assume we have all magic bitboard functions and data structures initialised and ready to use. So using only the function signatures for magic bitboards, can you list the steps (pseudo code or any language) to validate a given move for the white rook on g3?


Solution

  • It's good that we can assume magic bitboard functions are available, but in general bitboard move generation functions can accept any technique that produces a bitboard that gives the possible squares to move to. Say RookMoves is such a function, then you would populate the move list as follows:

    UInt64 pieceBitboard = Bitboard[SideToMove | Piece.Rook];
    UInt64 targetBitboard = ~Bitboard[SideToMove | Piece.All];
    
    while (pieceBitboard != 0) {
       Int32 from = Bit.Pop(ref pieceBitboard);
       UInt64 moveBitboard = targetBitboard & RookMoves(from, OccupiedBitboard);
    
       while (moveBitboard != 0) {
           Int32 to = Bit.Pop(ref moveBitboard);
           moveList[index++] = Move.Create(this, from, to);
       }
    }
    

    where Bit.Pop(ref x) returns the least significant bit in x while simultaneously "popping" (removing) it from x.

    To validate a move (I'm interpreting this as confirming move validity), you would either check to see if the move is in the move list, or perform the move and see whether it leaves you in check. Of course, you might need to check whether it obeys the movement rules for the piece but that is trivial.

    if ((RookRays[move.From] & Bit.At[move.To]) == 0)
       return false;
    
    Int32 side = SideToMove;
    position.Make(move);
    Boolean valid = position.InCheck(side);
    position.Unmake(move);
    
    return valid;