void chess_game_iterator_step_to_move(ChessGameIterator* iter, ChessVariation* variation) { ChessArray moves; ChessMove move; assert(variation->root == iter->game->root_variation); chess_array_init(&moves, sizeof(ChessMove)); while (variation != iter->game->root_variation) { move = variation->move; chess_array_push(&moves, &move); variation = variation->parent; } chess_game_iterator_step_to_start(iter); while (chess_array_size(&moves) > 0) { chess_array_pop(&moves, &move); advance_current_position(iter, move); variation = chess_variation_add_child(variation, move); } iter->variation = variation; chess_array_cleanup(&moves); }
void chess_generate_moves(const ChessPosition* position, ChessArray* moves) { ChessMoveGenerator generator; ChessMove move; chess_move_generator_init(&generator, position); while ((move = chess_move_generator_next(&generator))) { if (!move_is_legal(position, move)) continue; chess_array_push(moves, &move); } }
static void advance_current_position(ChessGameIterator* iter, ChessMove move) { ChessUnmove unmove = chess_position_make_move(&iter->position, move); chess_array_push(&iter->unmoves, &unmove); }