Вступление
Все мы знакомы с Excel. Вот и я, душный банковский служащий, что-то да слышал об этом инструменте.
Одни люди умеют лишь форматировать ячейки, другие создают клоны Doom, используя встроенный в Microsoft Office язык программирования.
Я не претендую на второй тип, но и к первым себя не отношу. Для меня Visual Basic for Applications, или VBA, стал тем первым ЯП, который заинтересовал и позволил уверовать в свои силы. Путешествие в этот интересный мир началось с автоматической записи макросов и разбора созданного программой кода.
Как начинающему программисту-самоучке, мне приходилось активно шерстить интернет в поисках решения возникающих проблем. Огромное коммьюнити, большое количество тематических сайтов и, на крайний случай, справка Microsoft помогали в решении практически любой проблемы.
Однако наступил такой момент, когда все рабочие задачи оказались решены и автоматизированы, а внутреннему программисту (ха-ха) все ещё хотелось чего-то большего.
Тогда меня осенило! В Excel ведь можно делать игры. Первая же найденная статья от программиста, который в армии клепал на основе VBA разные вещи, подтвердила мою теорию.
Эта серия статей не была задумана как обучающая (ведь я сам ещё учусь), но если что-нибудь изложенное будет полезно начинающим программистам, которые только погружаются в мир Visual Basic, то считайте, что я пополнил интернет одной полезной ссылкой.
Вторая цель создания цикла заключается в самообразовании и развитии навыков. Я буду ставить себе определенную цель, а потом исполнять ее наиболее приближенной к задумке.
К тому же где, как не в комментариях, мне доходчиво и культурным языком укажут на допущенные ошибки?
Я постараюсь объяснять все подробно, но без углубления в простейшие истины. Не буду рассказывать, что такое переменные, циклы или массивы. Всю эту информацию, изложенную доступным языком, можно найти в интернете.
В этих статьях я буду описывать процесс создания игр в Excel, начиная с простейших пятнашек и заканчивая глобальной RPG. Это позволит мне больше углубиться в тему, а вам поглумиться над неумехой-программистом. Или, в лучшем случае, забрать готовое решение на работу и скрывать безделье за мнимой подготовкой отчета. Ссылки на все исходные материалы будут в свободном доступе.
Темы первых статей цикла уже определены. В этой статье я расскажу, как сделать пятнашки в Excel. В следующий раз разберу создание игры в стиле Toon Blast.
Если вам, к моему удивлению, будет интересен такой формат, то пишите в комментариях, какого типа игры вы бы хотели, чтобы я реализовал на базе Excel.
Итак, хватит грофомании! ПЯТНАШКИ.
Первым делом...
Необходимо определиться с игровым полем. В данном случае все просто. Что есть пятнашки? Диапазон размером 4 на 4 ячейки, что в сумме даёт 16 ячеек. Переименовываем первый лист (по желанию), приводим нужные ячейки к квадратной форме и декорируем, как душе угодно. Получается примерно следующее:
Формирование игрового поля
На этом этапе необходимо в случайном порядке расположить числа от 1 до 15, а также пустое поле на выбранном диапазоне. Для этого открываем окно редактирования кода (Alt + F11), добавляем простой модуль (при желании и его можно переименовать для красоты).
Создаем публичную переменную rngPlayField, которая будет хранить координаты нашего игрового поля, и в методе initializeField() пишем следующий код:
Сперва метод создаёт коллекцию чисел от 1 до 16.
Я заметил особенность, что в VBA в большинстве случаев удобнее пользоваться коллекциями элементов, чем одномерными массивами. В моей практике были и такие случаи, когда приходилось использовать коллекции массивов (возможно, из-за моей некомпетентности).
InitializeField() запускает цикл For Each, который распространяется на каждую ячейку нашего диапазона. На первом этапе цикла программа рассчитывает случайное число от 1 до значения размера нашей коллекции (в настоящий момент 16) и помещает в первую ячейку диапазона число, хранящееся в коллекции под полученным случайным индексом.
Далее цикл удаляет из коллекции использованное число и переходит к следующей ячейке.
На последующих этапах происходит то же самое, за тем исключением, что размер коллекции постепенно уменьшается, пока в ней не останется ни одного числа, а все ячейки окажутся заполненными.
UPD. Уже в процессе написания статьи я выяснил, что не все комбинации, полученные таким образом, изначально решаемы. Тогда мной в ускоренном темпе был написан код, который сперва формирует правильное поле от 1 до 16, а затем в стиле песков времени разбирает пятнашки в течении 300 ходов (что мы собственно и делаем в реальной жизни, когда хотим "рестартнуть" игру). Направление движения "костяшки" рассчитывается случайным образом.
Имитация движения "костяшек" по игровому полю
Сперва создаём обработчик события нажатия на определенную ячейку. Для этого в модуле листа, на котором расположено игровое поле, формируем метод Worksheet_SelectionChange и пишем в нем следующий код. Переменная Target при этом содержит адрес выбранной ячейки.
При выборе диапазона ячеек (больше одной), а также если выбранная ячейка не относится к игровому полю, программа завершает работу.
В ином случае запускается метод имитации движения цифр, принимающий адрес выбранной ячейки в качестве аргумента.
В основном модуле в методе moveCells(byVal rngCell as range) пишем следующее:
Цикл проверяет, есть ли слева, справа, снизу или сверху от нажатой ячейки пустое поле (его имитирует число 16) и считывает вхождение смещенной ячейки в диапазон игрового поля. Если условия выполнены, то программа просто меняет числа местами.
Декорирование игрового поля и проверка победы в методе decorateField()
Создаём в рабочей книге второй лист и размещаем на нем победный вариант. Пример:
Далее пишем следующий код:
Данная программа с помощью цикла проверяет значение каждой ячейки игрового поля на соответствие аналогичной ячейке поля с победной расстановкой значений и закрашивает правильные варианты в зелёный цвет. И наоборот. Далее метод проверяет поле на наличие числа 16 (которое имитирует пустую "костяшку", не забываем) и устанавливает для шрифта белый цвет. Последний момент: проверка победы. При каждом совпадении каких-либо чисел с правильной позицией увеличивается переменная countRight, и когда ее значение станет равно 15, игра сообщит о победе.
ЭПИЛОГ
В итоге должно получиться примерно следующее:
Вот таким нехитрым образом можно создать себе развлечение на случай скучных рабочих дней. А тем временем на ум приходит следующая картинка:
При желании в игру можно добавить подсчет ходов, рейтинговую таблицу или график динамики побед.
Сейчас же я считаю, что на этом можно остановиться.
Следующая статья выйдет When it's done. Скорее всего в течение недели.
А в редакторе VBA ошибки всё ещё выводятся отдельным диалоговым окном? Жутко бесило это: вырезал кусок строки для переноса его в другую часть, и тебе в лицо лезет окно "СИНТАКСИЧЕСКАЯ ОШИБКА!!!111", которое нужно закрыть перед тем, как работать дальше.
И спасибо за оформление кода в специальные блоки. Не то чтобы я хочу пятнашки в Экселе, но на статью приятно взглянуть.
Абстрагируясь от вопросов «зачем», комменты можно (я бы сказал, нужно) писать перед кодом, к которому коммент предназначается. А длинные условия переносить на новую строку.
Помню, когда учился в техникуме, обрадовался что у нас оказывается будет программирование, несся туда вперед всех(уже ковырял Джаву на тот момент), как увидел что такое VBA, больше ни разу на парах не появлялся.
Думал вкатиться, но лапки и времени жалко. Овчина стоит выделки в контексте написания в нем диссертации на магистерскую?
Ага! Нас уже много, похоже, кто занимается этим буханко-моддингом. Я вот только месяц назад тетрис написал
Комментарии