diff options
Diffstat (limited to 'src/search/knight_moves.c')
| -rw-r--r-- | src/search/knight_moves.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/search/knight_moves.c b/src/search/knight_moves.c new file mode 100644 index 0000000..55f8eec --- /dev/null +++ b/src/search/knight_moves.c @@ -0,0 +1,99 @@ +#include "../search.h" + +bitboard_t knight_moves[64] = { + 132096ULL, + 329728ULL, + 659712ULL, + 659712ULL >> 1, + 659712ULL >> 2, + 659712ULL >> 3, + 10489856ULL, + 4202496ULL, + + 33816580ULL, + 84410376ULL, + 168886289ULL, + 168886289ULL >> 1, + 168886289ULL >> 2, + 168886289ULL >> 3, + 2685403152ULL, + 1075839008ULL, + + 8657044482ULL, + 21609056261ULL, + 43234889994ULL, + 43234889994ULL >> 1, + 43234889994ULL >> 2, + 43234889994ULL >> 3, + 687463207072ULL, + 275414786112ULL, + + 8657044482ULL >> 8, + 21609056261ULL >> 8, + 43234889994ULL >> 8, + 43234889994ULL >> (8 + 1), + 43234889994ULL >> (8 + 2), + 43234889994ULL >> (8 + 3), + 687463207072ULL >> 8, + 275414786112ULL >> 8, + + 8657044482ULL >> 16, + 21609056261ULL >> 16, + 43234889994ULL >> 16, + 43234889994ULL >> (16 + 1), + 43234889994ULL >> (16 + 2), + 43234889994ULL >> (16 + 3), + 687463207072ULL >> 16, + 275414786112ULL >> 16, + + 8657044482ULL >> 24, + 21609056261ULL >> 24, + 43234889994ULL >> 24, + 43234889994ULL >> (24 + 1), + 43234889994ULL >> (24 + 2), + 43234889994ULL >> (24 + 3), + 687463207072ULL >> 24, + 275414786112ULL >> 24, + + 288234782788157440ULL, + 576469569871282176ULL, + 1224997833292120064ULL, + 1224997833292120064ULL >> 1, + 1224997833292120064ULL >> 2, + 1224997833292120064ULL >> 3, + 1152939783987658752ULL, + 2305878468463689728ULL, + + 1128098930098176ULL, + 2257297371824128ULL, + 4796069720358912ULL, + 4796069720358912ULL >> 1, + 4796069720358912ULL >> 2, + 4796069720358912ULL >> 3, + 4679521487814656ULL, + 9077567998918656ULL, +}; + +void get_knight_moves(moves_t* moves, position_t position) { + bitboard_t friendly_knights; + bitboard_t friendly_pieces; + if (position.turn == WHITE_TURN) { + friendly_pieces = whites(position); + friendly_knights = position.bitboards[WHITE_KNIGHT]; + } else { + friendly_pieces = blacks(position); + friendly_knights = position.bitboards[BLACK_KNIGHT]; + } + + while (friendly_knights) { + int from = __builtin_ctzll(friendly_knights); + friendly_knights &= friendly_knights - 1; + bitboard_t ATTACK_MASK = knight_moves[from]; + ATTACK_MASK &= ~friendly_pieces; + while (ATTACK_MASK) { + int to = __builtin_ctzll(ATTACK_MASK); + ATTACK_MASK &= ATTACK_MASK - 1; + add_move(moves, from, to); + } + } +} |
