I'm now creating a bitboard chess engine in C youtube series and here's an issue I'm now encountering -
I've just implemented MVV LVA/killer/history move ordering and obviously it reduces the number of traversed nodes significantly
BUT the problem I'm now facing is an UGLY debugging, now please let me explain.
If it wasn't a youtube tutorial I would get satisfied with what I have now, but my goal is to SHOW beginners HOW exactly the moves are GETTING ORDERED along the way.
I'm trying to print all the moves and corresponding scores at ply == 0, literally only ROOT MOVES
and with CAPTURES it works pefectly well BUT when it comes to killers/history moves we need
to print the moves at a ply where either beta cutoff occurs storing killer or alpha increases storing history move
Obviously we need to go deeper in order to get history moves sorted and even deeper to get killer moves,
e.g. I'm getting killer initialized starting at ply 3
Here's how my current debugging output looks like:
Code: Select all
8 ♜ . . ♛ . ♜ . ♚
7 ♟︎ ♟︎ ♟︎ . . ♟︎ ♟︎ ♟︎
6 . . ♞ . ♝ ♞ . .
5 . . ♝ . ♟︎ . . .
4 . . . ♘ ♙ . . .
3 . . . ♙ . ♘ ♙ ♙
2 ♙ ♙ ♙ . . ♙ ♗ .
1 ♖ . ♗ ♕ . ♖ ♔ .
a b c d e f g h
Side: black
Enpassant: no
Castling: ----
move: e5d4 score: 10205
move: c6d4 score: 10204
move: c5d4 score: 10203
move: d8d4 score: 10201
move: f6e4 score: 10104
move: e6h3 score: 10103
move: e6a2 score: 10103
move: f8e8 score: 7167
move: f6g4 score: 7098
move: a7a5 score: 7055
move: e6d7 score: 7049
move: f6d7 score: 7049
move: d8c8 score: 7015
move: f6d5 score: 7010
move: b7b5 score: 7008
move: g7g6 score: 7004
move: e6g4 score: 7004
move: b7b6 score: 7003
move: c5b4 score: 7003
move: a7a6 score: 7002
move: e6b3 score: 7002
move: c6b4 score: 7002
move: d8b8 score: 7002
move: e6c4 score: 7002
move: d8d7 score: 7002
move: c5b6 score: 7002
move: c5e7 score: 7001
move: e6f5 score: 7001
move: c5d6 score: 7001
move: e6c8 score: 7001
move: d8d6 score: 7001
move: c6e7 score: 7001
move: e6d5 score: 7000
move: f6g8 score: 7000
move: c6b8 score: 7000
move: c5a3 score: 7000
move: a8b8 score: 7000
move: a8c8 score: 7000
move: h7h6 score: 7000
move: f8g8 score: 7000
move: f6h5 score: 7000
move: c6a5 score: 7000
move: d8e8 score: 7000
move: h7h5 score: 7000
move: d8e7 score: 7000
move: g7g5 score: 7000
move: d8d5 score: 7000
move: f6e8 score: 7000
move: h8g8 score: 7000
8 ♜ . . ♛ . ♜ . ♚
7 ♟︎ ♟︎ ♟︎ . . ♟︎ ♟︎ ♟︎
6 . . ♞ . ♝ ♞ . .
5 . . ♝ . ♟︎ . . .
4 . . . ♟︎ ♙ . ♙ .
3 . . . ♙ . ♘ . ♙
2 ♙ ♙ ♙ . ♘ ♙ ♗ .
1 ♖ . ♗ ♕ . ♖ ♔ .
a b c d e f g h
Side: black
Enpassant: no
Castling: ----
move: f6e4 score: 10104
move: f6g4 score: 10104
move: e6g4 score: 10103
move: e6a2 score: 10103
move: f8e8 score: 7167
move: a7a5 score: 7055
move: e6d7 score: 7049
move: f6d7 score: 7049
move: d8c8 score: 7015
move: f6d5 score: 7010
move: b7b5 score: 7008
move: g7g6 score: 7004
move: b7b6 score: 7003
move: c5b4 score: 7003
move: a7a6 score: 7002
move: c5b6 score: 7002
move: e6c4 score: 7002
move: c6b4 score: 7002
move: d8b8 score: 7002
move: e6b3 score: 7002
move: d8d7 score: 7002
move: e6f5 score: 7001
move: e6c8 score: 7001
move: c5e7 score: 7001
move: c6e7 score: 7001
move: c5d6 score: 7001
move: d8d6 score: 7001
move: c6a5 score: 7000
move: h7h6 score: 7000
move: f6e8 score: 7000
move: e6d5 score: 7000
move: c5a3 score: 7000
move: a8b8 score: 7000
move: a8c8 score: 7000
move: f6g8 score: 7000
move: f8g8 score: 7000
move: h7h5 score: 7000
move: c6b8 score: 7000
move: d8e8 score: 7000
move: f6h5 score: 7000
move: d8e7 score: 7000
move: g7g5 score: 7000
move: d8d5 score: 7000
move: h8g8 score: 7000
Code: Select all
// debug move ordering
void debug_move_ordering(moves *move_list, int count, int print_ply)
{
if (ply == print_ply)
{
if (count == 0)
print_board();
// print move
printf(" move: %s%s%c score: %d\n", square_to_coordinates[get_move_source(move_list->moves[count])],
square_to_coordinates[get_move_target(move_list->moves[count])],
get_move_promoted(move_list->moves[count]) ? promoted_pieces[get_move_promoted(move_list->moves[count])] : ' ',
score_move(move_list->moves[count]));
}
}
Code: Select all
// negamax serach with alpha-beta pruning
int negamax(int alpha, int beta, int depth)
{
// escape condition
if (!depth)
// evaluate position
return quiescence(alpha, beta);
...
// move ordering
sort_moves(move_list);
// loop over move list
for (int count = 0; count < move_list->count; count++)
{
// debug move ordering at PLY 2
debug_move_ordering(move_list, count, 2);
ply++;
...
ply--;
}
IS THERE A BETTER WAY OF WHAT I'M TRYING TO DO?
Thanks in advance!