我如何拆分此功能

时间:2019-07-16 20:17:56

标签: c algorithm

我有一个基本的Backtracking算法,它可以检查是否可以在地图上放置俄罗斯方块,所有功能都很简单,check_map可以检查地图上是否有地方,place_map可以在俄罗斯地图上放置俄罗斯方块,而delete_tetri可以删除俄罗斯方块在地图上。

按照惯例,我希望函数最多保留25行,因此我需要将此代码 split refactor 分解成多个较小的函数。

我很难做到这一点,因为很难跟踪所有变量。

int     fillit(char *map, char **tab, int map_size, int j)
{
 int map_index;
 int nb_block;
 int **tetri;
 int *hash_index;

 tetri = tetri_stock_hash(tab, j, map_size);
 map_index = 0;
 nb_block = 0;
 if (!(hash_index = (int *)ft_memalloc(sizeof(hash_index) * (j + 1))))
    return (-1);
 while (nb_block != j)
 {
     if (check_in_map(tetri, map, nb_block, map_index) == 1)
     {
        hash_index[nb_block] = map_index;
        place_in_map(tetri, map, &nb_block, &map_index);
     }
     else if (check_in_map(tetri, map, nb_block, map_index) == -1)
        map_index++;
     else if (check_in_map(tetri, map, nb_block, map_index) == 2)
     {
        if (nb_block == 0)
        {
            map_size++;
            map = map_generate(4 + map_size);
            fillit(map, tab, map_size, j);
            return (1);
        }
        nb_block--;
        delete_in_map(tetri, map, nb_block, hash_index[nb_block]);
        map_index = hash_index[nb_block] + 1;
     }
 }
 a_z(tetri, map, hash_index, j);
 map_print_color(map);
 return (0);
}

1 个答案:

答案 0 :(得分:0)

如果您的目的只是减少行数,那么您可以尝试以下方法:

int     fillit(char *map, char **tab, int map_size, int j) {
 int map_index = 0, nb_block = 0, **tetri, *hash_index;
 tetri = tetri_stock_hash(tab, j, map_size);
 if (!(hash_index = (int *)ft_memalloc(sizeof(hash_index) * (j + 1))))
    return (-1);
 while (nb_block != j) {
     switch (check_in_map(tetri, map, nb_block, map_index)) {
         case 1: hash_index[nb_block] = map_index;
        place_in_map(tetri, map, &nb_block, &map_index); break;
        case -1: map_index++; break;
        case 2: if (nb_block == 0) {
            map_size++;
            map = map_generate(4 + map_size);
            fillit(map, tab, map_size, j);
            return (1);
        }
        nb_block--;
        delete_in_map(tetri, map, nb_block, hash_index[nb_block]);
        map_index = hash_index[nb_block] + 1; break;
     }
 }
 a_z(tetri, map, hash_index, j);
 map_print_color(map);
 return (0);
}

这正是您编写的内容,我不了解其背后的算法或逻辑,只是删除了多余的行,并在此处和此处进行了一些修补。