Пошаговое создание игры «Same Game». Урок №5

  Дмитрий Бушуев  | 

    | 

  Обновл. 19 Авг 2019  | 

 242

В этом уроке мы продолжим разработку игры SameGame и рассмотрим алгоритм удаления блоков.

Алгоритм

Алгоритм удаления блоков очень простой: нужно начать с конкретного блока и затем убедиться, что есть соседний блок с тем же цветом. Если это так, то изменяем значение цвета этого блока на цвет фона. Затем проходимся в каждом направлении и удаляем соседний блок, если он имеет тот же цвет. Этот процесс рекурсивно повторяется с каждым блоком. Ниже приведена функция DeleteBlocks() в полном объёме в файле SameGameBoard.cpp:

Сначала мы должны проверить корректность индексов строки и столбца. Затем проверить, что выбранный блок не является частью фона. Далее следует проверить, есть ли хотя бы один соседний блок с таким же цветом, что у нас, но выше/ниже/слева/справа от выбранного блока. Если есть, то для выбранного блока устанавливается цвет фона (0), а для счётчика уничтоженных блоков устанавливается значение 1.

Это достигается несколькими вызовами метода DeleteNeighborBlocks(). При первом вызове функции мы поднимаемся выше по текущему столбцу. С помощью DIRECTION_DOWN мы даём понять нашей рекурсивной функции, что пришли снизу (тем самым, пропуская это направление обхода, не выполняя лишних действий). После проверки всех четырёх направлений наша игровая доска «уплотняется» и количество блоков, которые были удалены, вычитаются из общего количества оставшихся блоков.

Функция DeleteNeighborBlocks() очень похожа на функцию DeleteBlocks(). Мы также сначала проверяем корректность значений строки и столбца и сравниваем цвет текущего блока с цветом исходного блока. После этого мы делаем три рекурсивных вызова функции для удаления соседних блоков. При этом используем аргумент-направление, чтобы не возвращаться туда, откуда мы пришли.

Файл SameGameBoard.cpp:

К этому моменту все смежные блоки одного цвета были удалены и заменены на цвет фона, так что всё, что нам осталось сделать — это выполнить «сжатие» доски, сдвинув все вышестоящие блоки вниз, а столбцы — влево.

Файл SameGameBoard.cpp:

Сначала мы проходим столбец за столбцом, перемещая блоки вниз. Затем мы ищем пустую строку. Как только мы её нашли, то запускается другой цикл, который ищет занятую строку. После этого, пустая строка заполняется занятой строкой. Этот процесс повторяется до тех пор, пока не останется блоков, которые мы должны переместить вниз.

Вторая часть функции почти идентична первой, за исключением цикла for. Причина, по которой мы можем убрать внешний цикл, заключается в том, что нам нужно смотреть всего лишь на нижнюю строку в каждом столбце, и, если она будет пустой, то и весь столбец пуст и мы можем переместить на его место что-то другое.

Финальные штрихи


В данный момент мы находимся буквально в одном шаге от того, чтобы завершить нашу задачу по созданию «работоспособного» прототипа игры. Для этого нам нужно реализовать функцию IsGameOver(). Данная функция проверяет, возможно ли вообще переместить блок, т.е. пересматривает каждый блок, чтобы определить, есть ли у него соседи с тем же цветом или нет. Когда первый из этих блоков найден, то функция прекращает своё выполнение, возвращая false. Дальше проверку можно не продолжать. Единственный способ определить, что игра на самом деле закончена — это сделать проход по всем блокам и убедиться, что не осталось никаких возможных ходов.

Файл SameGameBoard.cpp:

Два цикла for позволяют нам проходить столбец за столбцом и строку за строкой в поисках допустимых ходов. Поскольку мы выполняем проход слева-направо, то нам не нужно слева проверять смежные блоки схожего цвета. Поиск снизу-вверх исключает необходимость проверять возможные ходы по направлению вниз. Этот порядок поиска также позволяет нам немного оптимизировать функцию IsGameOver(). Как только цвет блока станет фоновым, то мы сможем пропустить остальную часть столбца, потому что всё, что выше него, также будет пустым (благодаря функции CompactBoard()).

Теперь у нас появилась возможность попробовать нашу игру в действии:

Заключение

В этом уроке мы продолжили создание игры. Начав с заготовки, в которой, кроме отрисовки игрового поля больше ничего не было, мы плавно подошли к созданию «работоспособной» версии SameGame. По ходу дела обсудили вопрос программирования на основе событий, а также способы решения подобной задачи с использованием технологии MFC-классов. Создали обработчик событий для щелчка левой кнопкой мыши и связали его с основным алгоритмом игры.

В следующих уроках мы рассмотрим возможность расширения функционала меню нашей программы для реализации функций выбора уровня сложности, размера блоков, их цвета и т.д.

Урок №5. Исходный код игры «SameGame» на С++


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (1 оценок, среднее: 5,00 из 5)
Загрузка...

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *