Алгоритм Bubble Breaker - C (СИ)
Формулировка задачи:
Наверняка все знают игру Bubble Breaker (Clickermania еще вроде называется) - щелкать по шарикам одинакового цвета.
В общем, есть массив balls[i][j], элементы которого принимают значения от 0 до 7, 1-7 - цвета, 0 - пустая клетка.
i=14
j=14
2 5 3 6 2 4 4 3 2 4 3 6 7 5
7 1 4 2 3 3 4 1 6 3 3 6 6 7
2 6 6 1 4 6 4 3 2 1 3 3 2 5
6 1 7 4 7 3 3 2 4 6 1 2 2 3
5 5 2 4 3 7 5 6 4 6 6 5 4 1
6 4 3 4 4 3 5 1 3 1 1 4 6 1
5 5 1 3 2 2 6 5 6 1 1 2 5 7
5 1 5 1 4 1 2 6 1 7 4 1 7 2
5 3 7 7 1 7 7 2 6 4 4 5 4 5
4 6 2 6 5 4 6 6 2 1 2 2 5 6
1 4 5 5 4 5 4 4 4 4 4 3 5 5
5 6 7 6 5 1 5 2 3 1 7 4 1 7
6 3 5 4 4 2 1 1 4 2 4 1 3 5
1 7 3 3 6 2 1 3 1 5 2 3 4 6
При нажатии на одинаковые шарики, они удаляются (становятся равными 0), затем происходит сдвиг вниз.
Помогите, пожалуйста, реализовать
Решение задачи: «Алгоритм Bubble Breaker»
textual
Листинг программы
#include <stdio.h> #define WIDTH 14 #define HEIGHT 14 typedef int TMap[HEIGHT][WIDTH]; //----------------------------------------------------------------------------- int RecursiveRemove(TMap map, unsigned row, unsigned col, const int val) { if (map[row][col] != val) { return 0; } int count = 1; map[row][col] = 0; if (col > 0) { count += RecursiveRemove(map, row, col - 1, val); } if (row > 0) { count += RecursiveRemove(map, row - 1, col, val); } if (col < WIDTH - 1) { count += RecursiveRemove(map, row, col + 1, val); } if (row < HEIGHT - 1) { count += RecursiveRemove(map, row + 1, col, val); } return count; } //----------------------------------------------------------------------------- void Pack(TMap map) { int i, j; int step; for (j = 0; j < WIDTH; ++j) { step = 0; for (i = HEIGHT - 1; i >= 0; --i) { if (map[i][j] == 0) { step++; } else { map[i + step][j] = map[i][j]; } } for (i = 0; i < step; ++i) { map[i][j] = 0; } } } //----------------------------------------------------------------------------- int Remove(TMap map, unsigned row, unsigned col) { if ((col >= WIDTH) || (row >= HEIGHT) || (map[row][col] == 0)) { return 0; } int count = RecursiveRemove(map, row, col, map[row][col]); if (count) { Pack(map); } return count; } //----------------------------------------------------------------------------- void Print(TMap map) { int i, j; for (i = 0; i < HEIGHT; ++i) { for (j = 0; j < WIDTH; ++j) { printf("%d", map[i][j]); } printf("\n"); } printf("\n"); } //----------------------------------------------------------------------------- int main() { TMap map = {{2, 5, 3, 6, 2, 4, 4, 3, 2, 4, 3, 6, 7, 5}, {7, 1, 4, 2, 3, 3, 4, 1, 6, 3, 3, 6, 6, 7}, {2, 6, 6, 1, 4, 6, 4, 3, 2, 1, 3, 3, 2, 5}, {6, 1, 7, 4, 7, 3, 3, 2, 4, 6, 1, 2, 2, 3}, {5, 5, 2, 4, 3, 7, 5, 6, 4, 6, 6, 5, 4, 1}, {6, 4, 3, 4, 4, 3, 5, 1, 3, 1, 1, 4, 6, 1}, {5, 5, 1, 3, 2, 2, 6, 5, 6, 1, 1, 2, 5, 7}, {5, 1, 5, 1, 4, 1, 2, 6, 1, 7, 4, 1, 7, 2}, {5, 3, 7, 7, 1, 7, 7, 2, 6, 4, 4, 5, 4, 5}, {4, 6, 2, 6, 5, 4, 6, 6, 2, 1, 2, 2, 5, 6}, {1, 4, 5, 5, 4, 5, 4, 4, 4, 4, 4, 3, 5, 5}, {5, 6, 7, 6, 5, 1, 5, 2, 3, 1, 7, 4, 1, 7}, {6, 3, 5, 4, 4, 2, 1, 1, 4, 2, 4, 1, 3, 5}, {1, 7, 3, 3, 6, 2, 1, 3, 1, 5, 2, 3, 4, 6}}; unsigned col, row; int loop = 1; while (loop) { Print(map); printf("col and row: "); loop = (scanf("%u%u", &col, &row) == 2); if (loop) { printf("remove = %d\n", Remove(map, row - 1, col - 1)); } } return 0; }
Объяснение кода листинга программы
Этот код представляет собой реализацию игры Bubble Breaker
.
- #include
Включает файл стандартного ввода/вывода, который необходим для отправки сообщений в консоль. - #define WIDTH 14 Задает ширину игрового поля.
- #define HEIGHT 14 Задает высоту игрового поля.
- typedef int TMap[HEIGHT][WIDTH]; Определяет тип данных для двумерного массива, представляющего игровое поле.
- int RecursiveRemove(TMap map, unsigned row, unsigned col, const int val) Рекурсивная функция для удаления всех экземпляров указанного значения из массива.
- void Pack(TMap map) Упаковывает игровое поле, сдвигая пустые ячейки вправо.
- int Remove(TMap map, unsigned row, unsigned col) Удаляет указанное значение из массива, затем вызывает функцию Pack, если было сделано удаление.
- void Print(TMap map) Выводит содержимое игрового поля в консоль.
- int main() Главный цикл программы, который продолжает работу до тех пор, пока пользователь не введет некорректные данные. Пользователь вводит координаты для удаления, затем программа вызывает функцию Remove. Если было сделано удаление, программа вызывает функцию Pack. Каждое действие пользователя сопровождается выводом текущего состояния игрового поля. Введенные пользователем координаты всегда являются корректными, поскольку перед вызовом функции Remove выполняется проверка на корректность введенных данных.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д