I’ve been in Tokyo this week on business. So there hasn’t been too much time for chess programming (sigh). Hopefully I’ll have time on the 13 hour flight back via Dallas Fort-Worth.
I’m in the process of using perft to debug the move generating and make / unmake routines. For those who haven’t come across perft, it’s a routine which calculates all of the possible positions from a give starting position to a specified depth. It’s a great way of debugging your core code as there are known possible where stable programs have calculated the correct nodes counts. I’ll come back and talk about perft in a later post – once I’ve managed to get all of these bugs out!
As I’m debugging I’m struck by just how many bugs there are in my code. I’ve always thoughts of myself as a reasonably defensive programmer and quite good at creating bug free code. But there are a myriad of little bugs which are cropping up. Take for example this macro:
#define SQUARE64(s) ((t_bitboard)1 << s)
It's not too complex. It take a square number between zero and 63 and returns the bitboard version. But, to my surprise, it doesn't work all of the time! I have some code which return the potential en-passant square as a bitboard:
board->ep_square = SQUARE64((from + to) >> 1);
This gave spurios result! The reason was to do with the precedence of operators. The corrected version simply encloses the "s" in brackets.
#define SQUARE64(s) ((t_bitboard)1 << (s))
This is most likely a newbie error and highlights my lack of deep experience with "C", but it also illustrate the subtleties required to simply get a chess engine up and running!