Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
    }
}
Ejemplo n.º 3
0
static void advance_current_position(ChessGameIterator* iter, ChessMove move)
{
    ChessUnmove unmove = chess_position_make_move(&iter->position, move);
    chess_array_push(&iter->unmoves, &unmove);
}