Как сделать игру в excel

Обновлено: 08.07.2024

Вам бывает скучно на работе? Часто сидите два-три дня без единого намёка на трудовую деятельность и пытаетесь ее имитировать, а руководство так и ждет ошибки с вашей стороны?

Теперь этого можно будет избежать, ведь в разработке находится пошаговая RPG в стиле Dragon Quest на NES для офисного приложения Excel.

Конечно, идея не нова. В Excel и раньше делали разнообразные игры (даже полноценный шутер). Но если вы читали мои предыдущие статьи, то поймёте, что создавать троллейбусы из батонов белого (или чёрного) хлеба — мое небольшое хобби.

На данный момент готова альфа-версия графического движка и редактор карт. С вероятностью в 99% они будут дорабатываться в процессе разработки.

Сперва немного расскажу о некоторых технических характеристиках.

1. Скорее всего в игре будет использоваться событийная модель, а не циклическая, ведь для пошаговой стратегии цикл не так уж и важен. Это будет зависеть от того, как быстро Excel справится с рендером одного кадра. Минус такого подхода заключается в том, что написать какой-нибудь платформер на этой основе не получится. В любом случае я попробую оба варианта.

2. Все текстуры имеют размер 16*16 пикселей. Палитра состоит всего из 56 цветов (стандартный размер палитры Excel). В качестве основы я взял палитру NES.

3. Текстуры я рисую в программе Aseprite, а в Excel из. bmp перевожу с помощью небольшого, написанного на VBA софта, который нашел в интернете.

4. Бэкграунд состоит из тайлов, спрайты же привязаны к системе координат.

Карта уровня представляет собой двумерный массив с кодовым обозначением тайла в формате «XXXY», где XXX — номер текстуры по порядку, Y — значение, указывающее на то, можно ли пройти сквозь тайл. Вторая функция пока что не реализована.

Спрайты хранятся в отдельном массиве в формате: координата X, координата Y, порядковый номер спрайта, тип спрайта и тэг. Два последних значения пока не используются.

Для создания графического движка сперва необходимо инициализировать различные переменные. Часть из них хранится на отдельном листе, а в коде я сделал их публичными (знаю, что так нельзя):

- высота и ширина игрового экрана;

- диапазон игрового экрана;

- массив игрового экрана для рендеринга;

- размер одной текстуры;

- карта тайлов и координаты спрайтов;

- массив спрайтов, тайлов и спрайтов игрока.

Все текстуры хранятся на отдельном листе с отображением индексов цветов палитры.

Так как это только первая версия движка, нажатие на «Новую игру» тут же запускает метод fillWithTextures (процесс создания массива цифровых значений цвета).

Первым делом происходит поиск спрайтов, которые нужно отрисовать. Для этого программа проверяет каждый «пиксель» игрового экрана, считает смещение этого пикселя относительно стартовых координат камеры, а также смещение относительно всех спрайтов на уровне. Если смещение «пикселя» относительно спрайта по каждой оси равно от 0 до 15 (так как размер текстуры 16*16), берётся индекс нужного цвета из массива спрайтов.

Вторым пунктом программа на основе смещения относительно координат камеры высчитывает позицию «пикселей» на карте тайлов. Когда нужный тайл найден, программа с помощью функции getTextOffset возвращает индекс цвета пикселя из массива тайлов.

'Возвращает координату текстуры Function getTexOffset(dCoordinate As Double) As Integer getTexOffset = (dCoordinate - 1) Mod main.blockSize End Function

Почему сперва происходит проверка спрайтов, а затем тайлов?

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

P.S. На следующий день я понял, что проверка условия «закрашенности» спрайтами должна производиться в начале. Тогда это повлияет на производительность. Привет, оптимизация.

Вторая проблема — это проверка спрайтов для каждого пикселя экрана. Предположим, что на уровне находится 40 спрайтов. При размере экрана 96*64 = 6144 пикселей количество итераций цикла достигает 6144 * 40 = 245760. Если пойти другим путём и проверять спрайты не для каждого пикселя, а по условию нахождения в поле зрения камеры, то количество итераций не превысит 40*16*16 = 10240. Эта проблема решается быстро.

Для того, чтобы поместить спрайт игрока в рендер-массив нужно посчитать смещение спрайта относительно координат камеры.

Sub renderPlayer(imagePose As Integer) Dim offsetX As Double, offsetY As Double, cntRow As Integer, _ cntCol As Integer 'Считаем смещение относительно координат камеры offsetX = main.playerX - main.cameraX offsetY = main.playerY - main.cameraY 'Если игрок не находится за пределами камеры If offsetX >= 0 And offsetY >= 0 And _ offsetX < main.cameraX + main.screenW And _ offsetY < main.cameraY + main.screenH Then For cntRow = 0 To main.blockSize - 1 For cntCol = 0 To main.blockSize - 1 'Если пиксель текстуры заполнен If main.arrPlayerSpr((cntRow + 1) + (imagePose * main.blockSize), cntCol + 1) <> 0 Then 'Если пиксель не заходит за пределы камеры If cntRow + main.playerY <= main.screenH + main.cameraY And cntCol + main.playerX <= main.screenW + main.cameraX Then arrRender(offsetY + cntRow, offsetX + cntCol) = main.arrPlayerSpr((cntRow + 1) + (imagePose * main.blockSize), cntCol + 1) End If End If Next Next End If End Sub

Аргумент imagePose будет использоваться для имитации поворота игрока при движении.

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

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

Вот, что получается в итоге:

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

В любом случае жду критику и советы. Всегда интересно послушать, что скажут люди.

Я создал паблик ВКонтакте, куда буду выкладывать свои мысли, алгоритмы, код, ссылки на эти статьи и конечно мемасики:) Если вам интересно наблюдать за разработкой игр и разных странных вещей, добро пожаловать.

Если вы уже имели какой-то опыт программирования в прошлой жизни (привет, Basic, Pascal и т.д.), то, скорее всего, уже прошли этап "игрописательства". Однако, тряхнуть стариной и размять мозги вполне можно. Если же вы никогда не программировали игр, то никогда не поздно начать этот весьма увлекательный процесс. Всё, что нам потребуется - это Excel (любой версии) и 15-20 минут времени для начала.

Тренироваться будем на известной в узких кругах программистов игре "Жизнь" (Life). Её придумал британский математик Джон Конвей еще в 1970 году на основе работ легендарного Джона фон Неймана - прадедушки всех современных компьютеров. Если вы не сталкивались с ней раньше - не проблема, правила можно объяснить за полминуты:

Игра идет на большом (иногда даже бесконечном) поле в клеточку ("вселенной"). Как вы понимаете, Excel для такого подходит идеально :)

В один момент времени каждая клетка может быть в двух состояниях - живой (обозначим её каким-нибудь значком или просто единичкой) или же мертвой (пустой). Начальное состояние всех клеток в игре называют первым поколением.

Если брать блок клеток 3х3 с текущей клеткой в середине, то вокруг неё оказывается 8 клеток-соседей. Дальнейшая судьба клетки зависит от того, сколько именно живых клеток (N) окажется в этой окружающей области. Вариантов несколько:

  • Если клетка была пустая (мертвая), но у нее есть ровно 3 живых соседа, то в ней зарождается жизнь.
  • Если клетка живая, но у неё меньше 2 соседей, то она умирает от одиночества.
  • Если клетка живая, но у неё больше 3 соседей, то она умирает от перенаселения.
  • Если клетка живая и у нее 2-3 соседа, то клетка продолжает жить.

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

Однако, не стоит недооценивать обманчивую простоту этой логики - количество комбинаций, сценариев игры и многообразие фигур в такой игровой вселенной поражает своим разнообразием и поистине бесконечно. В математике подобные модели называют клеточными автоматами. А самое интересное, что реализовать подобную модель можно в любой версии Excel буквально на 20 строчках кода.

Шаг 1. Готовим игровое пространство

Создадим в новой книге три листа:

  • game - это будет основной листы игры, где мы будем наблюдать за развитием нашей "колонии"
  • next - этот лист будет формировать следующее поколение, которое затем придет на смену текущему
  • start - на этом листе мы будем задавать начальную конфигурацию, т.е. первое поколение в нашей игре

Игровое пространство

На листе start разметим с помощью единичек первое поколение любым желаемым образом:

Первое поколение

Шаг 2. Пишем макрос

Теперь пришла пора расчехлить наш VBA и написать макрос, который и будет делать всю работу, а именно:

  1. Копировать первое поколение с листа start на лист game.
  2. Проходить по ячейкам игрового поля на листе game и проверять окружающих соседей (блок 3х3) для каждой из них.
  3. В зависимости от результатов проверки помечать на листе следующего поколения next ту же ячейку как живую (1) или мертвую (пусто).
  4. Копировать получившееся новое поколение с листа next вместо текущего на листы игры game.
  5. Повторять пункты 2-4 несколько раз, сменяя одно поколение другим и отображая на экране изменения в нашей "колонии".

Для начала откроем редактор Visual Basic на вкладке Разработчик (Developer) . Если такой вкладки не видно, то её нужно будет сначала отобразить через Файл - Параметры - Настройка ленты (File - Options - Customize Ribbon) , включив соответствующий флажок.

В открывшемся окне редактора создадим новый модуль с помощью команды меню Insert - Module, а затем скопируем и вставим туда код нашего макроса:

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

Поскольку в коде нам придется несколько раз ссылаться и много раз работать с диапазонами игрового пространства (B2:AE31) на каждом из трёх листов книги, то имеет смысл сразу оформить их как переменные. Это делается в блоке:

Заодно мы создаем ещё и переменную wNext, которая ссылается на весь лист next целиком - это нам тоже пригодится в будущем:

Затем, перед началом игры, мы должны перенести первое поколение с листа start на лист game. Это выполяется командой прямого копирования с использованием уже созданных переменных:

Поскольку мы хотим прокрутить в нашей игре не одно, а несколько (например, 50 для начала) поколений, то дальнейшие действия заключены в цикл:

А внутри этого цикла мы, во-первых, сначала очищаем рабочее пространство на листе next для формирования следующего поколения:

А, во-вторых, запускаем вложенный цикл прохода по всем ячейкам игровой вселенной на листе game, чтобы проверить каждую из них - это реализовано циклом прохода по коллекции:

Ссылка на очередную проверяемую ячейку будет храниться в переменной cell. Для этой ячейки нам нужно сначала построить окрестность 3х3 с ней в середине. Это выполняется с помощью конструкции:

Здесь метод Offset(-1,-1) виртуально сдвигает текущую проверяемую ячейку на одну строку вверх и на один столбец влево, а потом метод Resize(3,3) опять же виртуально растягивает эту одну ячейку до новых размеров 3 на 3:

Offset и Resize

Чтобы посчитать количество заполненных ячеек в полученной окрестности применяется функция рабочего листа СЧЁТЗ (COUNTA) , которую в VBA можно вызвать с помощью объекта WorksheetFunction . Таким образом количество живых соседей в окружающей текущую ячейку области 3 на 3 мы получаем выражением (не забыв вычесть из полученного количества текущую ячейку):

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

Когда цикл прохода по ячейкам будет завершен, то сформированное следующее поколение с листа next нужно скопировать на место текущего на листе game - делаем это уже знакомой конструкцией:

Вот, собственно, и вся логика.

Осталось вернуться в Excel на лист game, запустить нашу игру через вкладку Разработчик - Макросы (Developer - Macro) и насладиться процессом развития нашей колонии:


Пятнашки в Excel
Разбор создания игры в Excel

При создании игры мы преследовали две цели:

  1. Продемонстрировать возможности программирования и визуализации в Excel. На примере научить вас некоторым приемам создания пользовательской формы и макросов, которые с ней взаимодействуют.
  2. Разнообразить досуг после плодотворной работы в Excel. Игра также встроена в нашу надстройку VBA-Excel чтобы она всегда была под рукой.

Разработка игрового поля

Игровое поле пятнашек состоит по сути из 16 фишек, можно также добавить кнопкой перемешать (начать с начала) и отображением количества шагов. В качестве фишек мы будем использовать обычные кнопки CommandButton - 16 штук.

Расположим их в виде поля 4x4. Уберем стандартное название кнопок (а свойство Caption) сделаем их квадратными в форме фишек. Вообще тут можно дать волю фантазии наложить тени, выбрать цвет и так далее, углубляться не будем. На игровое поле мы добавили также кнопку перемешать. Она будет служить для сброса и начала новой игры.

Игровое поле пятнашек

Добавили текстовые поля Label , в которые будем записывать количество потраченных шагов и лучший счет. Что получилось видно на картинке.

Еще один момент, чтобы кнопки не "нажимались" (т.е., чтобы по клику не происходила анимация нажатия на кнопку), установим свойство Locked в положение True.

Механика игры

Управление перемещением фишек будем реализовывать путем нажатия на стрелки вверх, вниз, влево и вправо. При нажатии на стрелки будем менять текст кнопок (свойство Caption) в зависимости от направления. С анимацией не будем мудрить, сами фишки не будем перемещать, будем просто мгновенно менять текст фишки с одного на другой, визуально будет казаться, что фишка переместилась по полю.

Старт игры

Инициализация формы вызываем процедуру создания поля.

Функция проверки заряженного числа на четность

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

В конце делаем проверку поля и проверяем правильно ли игрок расставил фишки.

Осталось "отловить" нажатие стрелок на клавиатуре и запускать нужное движение. Для этого воспользуемся событием формы UserForm_KeyDown.

Программа Microsoft Excel может пригодиться во многих ситуациях. Формулы, функции, справочники и учебные пособия, обработка бизнес-информации — всё это может делать Excel. Однако, что если вы хотите просто расслабиться? Excel может помочь и в этом.

В этой статье мы рассмотрим 8 игр, которые запускаются в Microsoft Excel.

2048

Однопользовательская головоломка популярна на Android и iOS. Данная игра создана на основе предыдущих, таких как Threes и 1024. Всего за одну неделю её создал 19-летний Габриэль Сирулли. Не желая зарабатывать на том, что он не изобретал, Сирулли загрузил бесплатные версии игры 2048 на Android и iOS.

Есть версия игры для Excel, позволяющая играть в таблицах. Предлагается режим просмотра 2D и 3D, звуковые эффекты, отслеживание движений и история, некоторые другие трюки.

2048 Stealth Mode в Excel

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

Scrabble

Scrabble

Продолжая разговор о головоломках, поговорим о Scrabble. Tom_Jobim с Reddit создал игру, которая открывает отдельное окно в Excel, так что она не совсем в таблице. Применяется язык VBA.

Реализация игры на высоком уровне. Вы противостоите искусственному интеллекту с различными уровнями навыка, от 1 до 100. Имеется инструмент анаграмм, встроенный словарь, разные тематические планы, таймеры и многое другое.

Arena.Xlsm

Arena

Не хотите головоломки? Arena.Xlsm даст вам возможность противостоять более 2000 потенциальных противников с искусственным интеллектом. Когда они появляются на экране, вы должны сразить их.

Имеется 8 боссов, 12 запрограммированных боевых арен, более 30 заклинаний, 20 уникальных предметов и даже системы достижений.

Arena.Xlsm также доступна на Itch.io, если вы предпочитаете отслеживать игры на определённых платформах.

Candy Crunch Number Saga

Candy Crunch Number Saga

Candy Number Crunch Saga предлагает более 35 новостных событий, которые влияют на стоимость акций. Отображается курс акций в реальном времени. Игра стала результатом четырёх дней работы канадского бухгалтера Кари Уолкина. Он же является автором Arena.Xlsm. Игра также доступна на Itch.io.

Championship Manager For Microsoft Excel

Championship Manager For Microsoft ExcelChampionship Manager For Microsoft Excel

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

Читайте также: