From 9ae40bfa6e1fbc180392d60dd86cc01ccc67dd26 Mon Sep 17 00:00:00 2001 From: Kolomiets Yaroslav Date: Thu, 15 Dec 2016 00:54:57 +0200 Subject: [PATCH] shift implementation --- src/fillit.c | 77 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 27 deletions(-) diff --git a/src/fillit.c b/src/fillit.c index bcb668f..ca680c3 100644 --- a/src/fillit.c +++ b/src/fillit.c @@ -5,7 +5,6 @@ unsigned int ft_sqrt_ceil(unsigned int num) unsigned int i; i = 1; - // int and unsigned int comparsion while (i * i < num) i++; return (i); @@ -57,6 +56,8 @@ void map_initialization(char **tetramino_table, t_map *map) convert_tetramino(*tetramino_table++, map, i++); map->figure_amount = i; map->size = ft_sqrt_ceil(i * 4); + map->mask = 1; + map->mask <<= 16 - map->size; clear_map(map); } @@ -66,9 +67,9 @@ void insert_tetramino(t_map *map, int index) int k; t_tetrominoes *temp; - temp = map->figure[index]; + temp = &map->figure[index]; i = temp->offset_y; - k = i + 4; + k = i + temp->height; while (i < k) { map->line[i] |= temp->line[i]; @@ -83,37 +84,59 @@ void erase_tetramino(t_map *map, int index) int k; t_tetrominoes *temp; - temp = map->figure[index]; + temp = &map->figure[index]; i = temp->offset_y; k = 0; - while (k < 4) + while (k < temp->height) { map->line[i + k] ^= temp->line[i + k]; k++; } } -// void shift_tetramino(t_map *map, int index) -// { -// //сделаю сдвиг фигуры вправо, если дошли до границы, то перемещу в начало следующего ряд и т.д. -// } +int can_insert(t_map *map, int index) +{ + int i; + int k; + t_tetrominoes *temp; -// void algorithm(t_map *map) -// { -// //тут у меня сейчас трабл с рекурсией -// //не могу пока написать что-то годное -// } + temp = &map->figure[index]; + i = temp->offset_y; + k = i + temp->height; + while (i < k) + { + if (map->line[i] & temp->line[i]) + return (0); + i++; + } + return (1); +} +int shift_tetramino(t_map *map, int index) +{ + int left_shift; + int i; + int k; + t_tetrominoes *temp; -// мейн в отдельный файл кину, знаю что ты не любишь когда много файлов) - -// int main() -// { -// t_map map; -// char** table; - -// table = read_from_file(); -// map_initialization(table, &map); -// algoritm(&map); -// print_result(&map); -// return (0); -// } + temp = &map->figure[index]; + i = temp->offset_y; + k = i + temp->height; + left_shift = 1; + while (i < k) + if (temp->line[i++] & map->mask) + left_shift = 0; + i = temp->offset_y; + if (left_shift) + while (i < k) + temp->line[i++] >>= 1; + else if (k < map->size) + while(k-- > i) + { + while (!(temp->line[k] & 0x8000)) + temp->line[k] <<= 1; + temp->line[k + 1] = temp->line[k]; + } + else + return (0); + return (1); +}