Вы устали от навязчивой рекламы, лутбоксов и монетизации в мобильных играх?
Тогда я расскажу вам, как создать игру "3 в 1" на рабочем листе Excel. Бесплатно, без регистрации и СМС.
Предыдущая статья, в которой я рассказал, как сделать простейшие пятнашки с использованием VBA.
Технически получилось у меня не совсем "3 в 1", и дворецкий не станет вымогать у вас звёздочки, чтобы поменять сломанный комод. Игра больше похожа на Toon Blast (есть на обеих мобильных платформах).
Поле наполнено квадратиками разного цвета. Если рядом стоят 2 или больше квадратов, то их можно удалить. Верхние квадраты падают на освободившиеся места. Когда образовываются пустые колонки, то блоки смещаются влево. Чем больше массив блоков, который вы уберете за один раз, тем больше очков заработаете.
Создание игрового поля
Сперва организуем органы управления. Выставляем на странице три переключателя, которые будут отвечать за уровни сложности, и слайдер, который меняет размер игрового поля.
Путем нехитрых проб и ошибок я придумал такое разделение.
1. Лёгкий уровень: 3 вида блоков, средний - 4, сложный - 5.
2. Малое поле: 10х10 клеток, среднее - 14х14 клеток, большое - 18х18.
Переключатели и слайдер необходимо соединить с какими-либо ячейками рабочего стола. В моем случае это "А2" и "А6" соответственно.
Далее в режиме редактирования кода создаем модуль "createModule", инициализируем публичные переменные:
Первая отвечает за игровое поле на листе, вторая - за размер поля, третья - за количество типов блоков, четвертая содержит в себе данные для декорирования блоков, пятая - это массив, который дублирует игровое поле (необходим для быстродействия программы).
Я понимаю, что публичные переменные - зло, но в этот раз мы идем простым путем.
Создаем метод:
Эта программа определяет размер игрового поля и уровень сложности, а потом вызывает метод, который создает это самое поле.
Я решил, что игровые блоки будут декорированы разными символами. Для этого я использовал функцию ChrW(), которая позволяет показать символ Unicode по его индексу. Через цикл я вывел все символы на рабочую страницу Excel и приступил к поиску.
Когда я нашел самые удачные символы, то поместил их на отдельный лист. Ячейки покрасил в цвета, которые подошли больше всего, и написал в новом модуле (stuffModule) небольшую функцию. Она находит цвет ячейки и возвращает его индекс. Эту функцию я использовал на рабочем листе.
Код функции:
ОТСТУПЛЕНИЕ
Excel выполняет все действия в массиве быстрее, чем аналогичные действия на рабочем листе. Поэтому использовать массивы в такой игре жизненно необходимо.
Советую использовать параметр Option Base 1, который приводит нижнюю границу массивов к единице. Это немного расходится с общепринятой практикой, но в Excel часто приходится совмещать массивы и диапазоны. Ссылки на диапазоны начинаются с единицы.
Следующая процедура использует массив для формирования игрового поля:
Этот метод инициализирует отдельный массив, который содержит данные символов и их цвет (получены со второго листа).
Далее в зависимости от уровня сложности он наполняет массив игрового поля случайными символами из первого массива и выводит диапазон на экран.
И, наконец, пишем процедуру, которая декорирует игровое поле, используя индекс цвета определенного символа:
Примеры того, что получается:
Игровой процесс
Сперва необходимо, как и в случае с пятнашками, создать процедуру, которая реагирует на выбор какой-либо ячейки.
Для этого в модуле листа, на котором находится игровое поле, пишем следующее (об отдельных, еще не описанных процедурах я расскажу позже):
Создаем модуль "playModule", инициализируем публичную переменную cellValue (int) (для прошлого блока). Создаем новый метод и описываем в нем процедуру нажатия на ячейку:
В данном случае используем рекурсию. Если программа выявила, что не все одинаковые ячейки убраны, она вызывает сама себя.
Далее пишем код, который проверяет поле на наличие пустых ячеек. Если над такой ячейкой есть заполненный блок, то он "падает" вниз.
Тут все просто. Запускается счетчик, который проверяет количество упавших блоков. Если счетчик больше нуля, то подпрограмма запускает сама себя и снова проверяет поле на наличие висящих элементов, пока не окажется, что все кубики уже "упали".
Следующий шаг - смещение блоков влево при наличии пустых колонок:
Метод checkColumns() сперва проверяет, есть ли на игровом поле пустые столбцы. Если он их находит, то уже в массиве игрового поля смещает колонки влево, а потом переносит полученный диапазон на рабочий лист.
Конец игры
Сперва надо определиться с методом подсчета очков. Я придумал следующее:
Количество очков = (Количество убранных блоков ^ 2) / 2
Создаем две публичные переменные: sumBlank(int) и globScore(long)
В процедуре clearCells() прописываем следующее условие, которое выполняется при удалении одного блока:
Создаем метод подсчета очков countScore():
На листе выставляются два лейбла, в которые каждый ход записываются текущий и глобальный счет.
Важный момент! Не забывайте в процедуре создания игрового поля initializeField() обнулять переменные и значения лейблов:
Наконец, пишем программу, которая проверяет условия поражения (если отсутствуют ячейки, к которым по горизонтали и вертикали примыкают ячейки с таким же символом) и выводит на экран сообщение с количеством заработанных очков:
Немного скриншотов того, что вышло:
Вот и все. Конечно, создание такой игры заняло больше времени, чем создание пятнашек, но результат вышел неплохим (ХАХАХАХАХА).
Мораль: изучайте более полезные в реальной жизни языки программирования, а VBA оставьте для всяких ненормальных :)
Право запостить картинку с буханкой-троллейбусом оставляю за вами:)
Комментарий недоступен
С подрядчиками и сотрудниками вместо NPC
Сделал все по туториалу, начал играть и вот такая картинка вылезла. Походу жанр проклятый.
Номинация на коммент дня)
Ничего непонятно, но очень интересно
Комментарий недоступен
Такие приложения писали когда смартфоны еще не стали мейнстримом