public ulong Captures(ulong currentPieces, ulong opponentPieces, ulong location)
        {
            // from our current location, we can move in any direction
            // as long as we continually encounter opponent pieces
            // we capture them all as long as the first non opponent piece contains a current player piece
            ulong captures  = 0ul;
            int   loc_index = BitTwiddling.TrailingZeroCount(location);
            int   row       = loc_index / 8;
            int   col       = loc_index % 8;

            captures |= Look(currentPieces, opponentPieces, row, col, -1, 0);  // up
            captures |= Look(currentPieces, opponentPieces, row, col, 1, 0);   // down
            captures |= Look(currentPieces, opponentPieces, row, col, 0, -1);  // left
            captures |= Look(currentPieces, opponentPieces, row, col, 0, 1);   // right
            captures |= Look(currentPieces, opponentPieces, row, col, -1, -1); // up left
            captures |= Look(currentPieces, opponentPieces, row, col, -1, 1);  // up right
            captures |= Look(currentPieces, opponentPieces, row, col, 1, -1);  // down left
            captures |= Look(currentPieces, opponentPieces, row, col, 1, 1);   // down right
            return(captures);
        }
 public string DescribeLastMove() => BitTwiddling.TrailingZeroCount(lastMove).ToString();