Exemple #1
0
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);
}
Exemple #2
0
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);
}
Exemple #3
0
/**
 * @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);
	}
}
Exemple #5
0
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);
}
Exemple #6
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;
}