void begin_game(t_env *e) { if (e->my_turn) { gnl_until("0123456"); populate_map(e); } else { e->my_turn = 1; gnl_until("01234"); populate_map(e); } malloc_piece(e); populate_piece(e); if (!make_move(e)) { print_move(0, 0); ft_freemap(e); exit(0); } free_piece(e); e->my_turn = 0; gnl_until("Plateau"); begin_game(e); }
int rm_elem(t_piece **list) { t_piece *tmp; t_piece *tmp2; int i; bool first; i = 0; while (*list != NULL && (*list)->valid == false) rm_first_elem(list, &i); if ((tmp = (*list)) == NULL) return (- 1); first = true; while (tmp != *list || first == true) if (tmp->next->valid == false) { tmp2 = tmp->next; tmp->next = tmp2->next; free_piece(tmp2); i++; } else { tmp = tmp->next; first = false; } return (i); }
/** * @brief Destroys a game. * @param game the game to destroy * @see new_game(), new_standard_game(), new_game_from_parameters(), new_game_copy() */ void free_game(Game *game) { int i; game->piece_configuration->nb_games--; if (game->piece_configuration->nb_games == 0) { /* free the piece configuration if it is not used anymore */ for (i = 0; i < game->piece_configuration->nb_pieces; i++) { free_piece(&game->piece_configuration->pieces[i]); } FREE(game->piece_configuration->pieces); FREE(game->piece_configuration); } free_board(game->board); FREE(game); }
void free_data(unsigned long pieces_r) { unsigned long i; if (tops) { FREE(tops); } if (nodes) { FREE(nodes); } if (row_nodes) { FREE(row_nodes); } if (pieces) { for (i = 0; i < pieces_r; i++) { free_piece(&pieces[i]); } FREE(pieces); } if (grid_cells) { FREE(grid_cells); } }
int rm_first_elem(t_piece **list, int *i) { t_piece *tmp; t_piece *tmp2; tmp = *list; tmp2 = *list; if ((*list)->next == *list) { tmp = NULL; } else { while (tmp->next != *list) tmp = tmp->next; tmp->next = tmp2->next; tmp = tmp->next; } free_piece(tmp2); *list = tmp; *i = *i + 1; return (0); }
void free_list(t_piece *list) { t_piece *tmp; t_piece *tmp2; int k; tmp = list->next; while (tmp != list) { k = - 1; tmp2 = tmp; tmp = tmp->next; free_piece(tmp2); } k = -1; if (tmp->shape != NULL) { free(tmp->name); while (++k < tmp->height) free(tmp->shape[k]); free(tmp->shape); } free(list); }
int main(void) { int r; unsigned long grid_cells_n2, pieces_n, pieces_max, column_nodes_n1, column_nodes_n2, row_nodes_n, pieces_r, piece_f, piece_l, nodes_n, i, j, k; scanf("%lu", &grid_rows); if (!grid_rows) { return EXIT_FAILURE; } scanf("%lu", &grid_columns1); if (!grid_columns1) { return EXIT_FAILURE; } grid_cells_n1 = grid_rows*grid_columns1; grid_columns2 = grid_columns1+1; grid_cells_n2 = grid_rows*grid_columns2; grid_cells = malloc(grid_cells_n2+1); if (!grid_cells) { free_data(0UL); return EXIT_FAILURE; } for (i = grid_columns1; i < grid_cells_n2; i += grid_columns2) { grid_cells[i] = '\n'; } grid_cells[grid_cells_n2] = 0; scanf("%lu", &pieces_n); if (!pieces_n) { return EXIT_FAILURE; } pieces_max = pieces_n*8; pieces = malloc(sizeof(piece_t)*pieces_max); if (!pieces) { return EXIT_FAILURE; } column_nodes_n1 = grid_cells_n1+pieces_n; column_nodes_n2 = column_nodes_n1+1; row_nodes_n = 0; pieces_r = 0; for (i = 0; i < pieces_n; i++) { if (!read_piece(&pieces[pieces_r], i)) { free_data(pieces_r); return EXIT_FAILURE; } piece_f = pieces_r; row_nodes_n += pieces[pieces_r].row_nodes_n; pieces_r++; j = 1; do { if (!rotate_piece(&pieces[pieces_r-1], &pieces[pieces_r])) { free_data(pieces_r); return EXIT_FAILURE; } r = compare_pieces(&pieces[piece_f], &pieces[pieces_r]); for (k = piece_f+1; k < pieces_r && !r; k++) { r = compare_pieces(&pieces[k], &pieces[pieces_r]); } if (!r) { row_nodes_n += pieces[pieces_r].row_nodes_n; pieces_r++; j++; } else { free_piece(&pieces[pieces_r]); } } while (j < 4 && !r); piece_l = pieces_r; j = piece_f; do { if (!flip_piece(&pieces[j], &pieces[pieces_r])) { free_data(pieces_r); return EXIT_FAILURE; } r = compare_pieces(&pieces[piece_f], &pieces[pieces_r]); for (k = piece_f+1; k < piece_l && !r; k++) { r = compare_pieces(&pieces[k], &pieces[pieces_r]); } if (!r) { row_nodes_n += pieces[pieces_r].row_nodes_n; pieces_r++; j++; } else { free_piece(&pieces[pieces_r]); } } while (j < piece_l && !r); } row_nodes = malloc(sizeof(row_node_t)*row_nodes_n); if (!row_nodes) { free_data(pieces_r); return EXIT_FAILURE; } nodes_n = column_nodes_n2+row_nodes_n; nodes = malloc(sizeof(node_t)*nodes_n); if (!nodes) { free_data(pieces_r); return EXIT_FAILURE; } for (i = column_nodes_n2; i < nodes_n; i++) { nodes[i].row_node = &row_nodes[i-column_nodes_n2]; } tops = malloc(sizeof(node_t *)*column_nodes_n1); if (!tops) { free_data(pieces_r); return EXIT_FAILURE; } header = &nodes[column_nodes_n1]; set_column_node(nodes, header); for (i = 0; i < column_nodes_n1; i++) { set_column_node(&nodes[i+1], &nodes[i]); tops[i] = &nodes[i]; } row_node = header+1; for (i = 0; i < pieces_r; i++) { print_piece(&pieces[i]); set_piece_row_nodes(&pieces[i]); } for (i = 0; i < column_nodes_n1; i++) { link_top(&nodes[i], tops[i]); } dlx_search(); printf("\nCost %lu\nSolutions %lu\n", cost, solutions); free_data(pieces_r); return EXIT_SUCCESS; }