Как сделать игру на vba

Пишем игры на. VBA (Pt. 1)

Все мы знакомы с 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) и считывает вхождение смещенной ячейки в диапазон игрового поля. Если условия выполнены, то программа просто меняет числа местами.

Создаём в рабочей книге второй лист и размещаем на нем победный вариант. Пример:

Далее пишем следующий код:

Данная программа с помощью цикла проверяет значение каждой ячейки игрового поля на соответствие аналогичной ячейке поля с победной расстановкой значений и закрашивает правильные варианты в зелёный цвет. И наоборот. Далее метод проверяет поле на наличие числа 16 (которое имитирует пустую «костяшку», не забываем) и устанавливает для шрифта белый цвет. Последний момент: проверка победы. При каждом совпадении каких-либо чисел с правильной позицией увеличивается переменная countRight, и когда ее значение станет равно 15, игра сообщит о победе.

В итоге должно получиться примерно следующее:

Вот таким нехитрым образом можно создать себе развлечение на случай скучных рабочих дней. А тем временем на ум приходит следующая картинка:

При желании в игру можно добавить подсчет ходов, рейтинговую таблицу или график динамики побед.

Сейчас же я считаю, что на этом можно остановиться.

Следующая статья выйдет When it’s done. Скорее всего в течение недели.

Источник

Маленькие игры в Excel на Visual Basic

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

Конечно же, я их сохранил и хочу ими поделиться с вами. В архиве всего 9 файлов, и одна папка, описание каждого из них даю ниже. Все программы написаны на VB, работают на 2003 и 2007 Excel. Сразу скажу, что я по профессии экономист, а не программист, игры писал для развлечения, и код там никакой 🙂 Вирусов быть не должно 🙂

Casino – планировался как сборник «четыре в одном». У вас имелось определенное количество бабла и можно было его потратить, играя в рулетку, очко, покер и джекпот. Однако мне на каком-то этапе уже не хватало времени и желания все прикрутить, так что в файле есть только рулетка и очко. Да и трата бабла реализована кривовато. В общем там все понятно, нажимаете кнопку на листе и играете 🙂

JackPot – вообще уже не помню че там за фигня, но смысл вроде в том, что после нажатия кнопки под каждым из чисел из верхней строки в каждый цикл формируется меньшее число, которое в очередной цикл опять уменьшается. Циклы идут до тех пор, пока одно из нижних чисел не станет равно 0 или отрицательным. После окончания каждого цикла ищется сумма всех чисел из второго ряда и проверяется на делимость на 10, 100 и 1000. Типа, если выпала такая редкая удача, то сумма умножается соответственно на 2, 4 и 10. Ну и после окончания всех циклов выдается общая сумма к выигрышу. Вот такой бредовый алгоритм у меня был в мозгах 10 лет назад 🙂

Poker – конечно, изначально мой юношеский задор хотел сделать полноценную игру с AI. Но получилось вот это. После нажатия кнопки вы видите 3 карты в своей руке и вам предлагается ставить (bet) или скинуть карты (fold). После вашего фолда или когда на столе появятся 5 карт, игра заканчивается и вы видите карты на руках противника и все комбинации ваши и противника.

Guess1000 – угадайка, простейшая игра, которую учили алгоритмизировать во времена моей юности. Вы с компом загадываете число от 1 до 1000 и угадываете их друг у друга, стремясь сделать это первым.

БыкиКоровы – аналогично, популярная игра в свое время. Комп загадывает 4-значное число, состоящее из разных цифр, а вы его угадываете, делая свои попытки. Когда я еще мог хорошо соображать, я мог угадывать числа максимум за 6 ходов. Сейчас сноровка уже далеко не та..

Слова – разновидность игры «Быки и коровы». Здесь комп загадывает не число, а 4-буквенное слово. Правила те же, что и в обычных Быках..

Девяточка – наверняка многие (бывшие) студенты потратили время не на одной паре, играя в эту игру. Правила простые. Изначально подряд записаны все числа от 1 до 19, кроме 10, по одной цифре в клетке. Можно зачеркивать либо рядом стоящие (только по вертикали или горизонтали) одинаковые цифры, либо две цифры, дающие в сумме 10. Когда все, что хотели, зачеркнули, переписываете оставшиеся цифры дальше, заполняя лист. Цель игры – сделать так, чтобы ВСЕ цифры оказались зачеркнуты. В файле роль ручки играет заливка ячейки черным цветом.

Наживка: игру можно закончить за один цикл 🙂 (граница цикла помечена пурпурными клетками)

Наконец, 2 игры, где от вас практически ничего не зависит, а все зависит почти целиком и полностью от великого и ужасного рандома 🙂

Гонки – имитация автогонок, когда машинки ездят по кругу. До нажатия на кнопку «Погнали» вы можете поменять 3 параметра игры (они помечены комментарием «можно менять») – длина круга, сколько кругов длится гонка и предельное количество поломок, после которого машина выбывает из гонки.

После нажатия кнопки вас спросят о количестве участников от 1 до 10. Чем большее число вы введете, тем больше данных придется заносить. По каждому участнику нужно будет ввести имя, выбор шин на гонку, тип двигателя, тип коробки передач, тип бензина и тип дизеля (даже если двигатель бензиновый)) ). Все остальные места до десяти заполняются компами с рандомным выбором.

Все эти настройки магическим образом (не буду писать как именно 🙂 ) влияют на прохождение машиной всей гонки с учетом, внимание, типа трассы и погоды, которые будут присутствовать во время гонки. Тип трассы и погода генерируются прямо перед началом гонок и являются еще одним элементом рандома для игроков 🙂

Итак, после того, как вы ввели все данные, гонка начнется, и вам предстоит лишь сидеть и наблюдать за перемещением вашей машины в топе гонки 🙂 Чем больше ваши введенные параметры подходят под тип трассы и погоду, тем меньше количество поломок будет получать ваша машина и выше будет ее скорость. При получении машиной в течение одного круга предельного количества поломок она выбывает из гонок, если же она смогла добраться до пит-стопа, то потратит там время в секундах, равное количеству поломок. Вот и все правила 🙂

ЧМ – имитатор футбольных матчей :). Сами понимаете, создать в Excel фифу-2015 довольно сложно, поэтому не судите строго. Программа написана и проверялась в работе только в Excel 2007.

На листе «команды» список команд, участвующих в турнире, с перечнем характеристик команд. Числовые параметры можно менять как угодно, главное чтоб они были положительными. Добавление новых команд невозможно. Названия команд можно менять. После изменений идете на лист «game», выбираете из выпадающих списков 2 команды и нажимаете «play». При выборе команд характеристики не меняются, уж извиняйте 🙂 Только после нажатия кнопки запуска игры. На листе полно служебной информации, но нас будет интересовать только количество пройденного времени и счет игры. У меня в те времена было полно свободного времени, так что я даже устраивал виртуальные чемпионаты, используя сетки на листах «сетка» и «сетка 2й тур».

В игре, по сути, вы только определяете характеристики команд. Все остальное на себя берет его величество случай. В зависимости от характеристик команд, каждая из них имеет свой шанс забить или пропустить гол, коэффициент усталости и боевого духа, которые меняются на протяжении всей игры. Игра реализуется 10-минутными циклами, после которого происходит расчет всех показателей, меняется счет и запускается следующий цикл. И так, пока не пройдут все 90 минут матча. Время, конечно же, виртуальное 🙂 Реально одна игра займет 5-10 секунд.

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

Бонус: в качестве бесплатного бонуса в папке FTW находится 2 файла. Работают они под 2007 Excel. Файл FTW нужен для того, чтобы вы могли передохнуть от работы, пока системщики и ваш босс делают недоуменные глаза от того, что все навигационные клавиши в Excel перестали работать и вы с чистой совестью можете испить чашку кофе или выйти на перекур. Ну а когда решитесь вновь вернуться на свое рабочее место, нажмите на кнопку в другом файле и все восстановится 🙂

Источник

Создание игр на VB: использование графики и звуков

Меня заинтересовала тема создания своих игр, поэтому у меня сразу возникли вопросы:

1. Возможно ли на VB 6.0 создать игру с неплохой графикой и физикой, как например в том же Counter-Strike 1.6 (потому что простые 2D игры типа тетриса и сапёра не интересуют)? А если нет, то какой язык мне выбрать? (C++, C#, Delphi).

2. Есть ли где подробные какие-либо руководства для новичков (прямо совсем чайников!) в этом направлении, например по OpenGL, DivX, структура движков, как их создавать, как использовать спрайты и т.д., поскольку у меня в этом вопросе знания базовые.

3. И в довершении к этому такой вопрос: как сделать так, чтобы после определённого события проигрывался звук?

Как сделать игру на vba. Смотреть фото Как сделать игру на vba. Смотреть картинку Как сделать игру на vba. Картинка про Как сделать игру на vba. Фото Как сделать игру на vbaСоздание звуков для игр
Здравствуйте! Не знаю тот ли это раздел форума, но у меня вопрос: в какой программе лучше всего.

Использование одновременно двух звуков
Не могли бы вы попонятнее объяснить как можно использовать одновременно две звуковые дорожки? Это.

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

Создание звуков/музыки на SoundForge с нуля
Можна на SoundForge создать музыку как DJ? Если можна то как.

Меня умиляют такие советчики! Люди по 5 лет под руководством опытных преподавателей изучают С++, и то не всякий после этого игру напишет. Вряд ли топикстартеру этот совет подойдет.
Есть же для игроделов простые и эффективные ЯП типа ДаркБейсик, BlitzMax, Blitz3D и т.п. продукты, специально предназначенные для быстрого создания 3D игр. Их можно изучить в течении пары недель и уже начать писать свою игру.

Добавлено через 20 минут
Небольшой обзор игродела
3D Game Maker
Рано или поздно даже самая лучшая компьютерная игра может надоесть. Надо идти за новой? Вовсе нет!
С помощью программы «Конструктор 3D игр» вы сможете создать неограниченное количество собственных неповторимых игр, даже если вы не знакомы с программированием.
Никогда прежде создание компьютерной игры не было таким увлекательным и простым занятием.
Всего за несколько минут ваша идея воплотится в настоящую трехмерную игру, а количество таких игр может быть ограничено только вашей фантазией. Несколько щелчков мыши, и задуманная вами игра становится реальной!

3D Rad Rus
Весьма и весьма интересный конструктор трехмерных игр. Этот конструктор является одним из самых легких в плане программирования трехмерных игр: здесь набор кода почти отсутствует, а если что вам и придётся набирать, так это координаты объектов или путь к текстуре. Отныне вы можете запускать свои игры, сделанные в 3D Rad, на своих веб-страницах! Это стало возможным благодаря плагину OSAKit! В компилятор внесены функции относительно создания файлов для просмотра в браузере (.osa формат). Насчет OSAKit читайте подробности на официальной странице.

GameMaker: Studio
Создание игр в нем достаточно простое и не требует предварительного знакомства с каким либо из языков программирования. Игра в GameMaker строится как набор игровых объектов, поведение которых задаётся путём программирования реакции на события. Программировать можно, используя графическое представление программ. Это представление отличается от обычного, например, тем, что для того чтобы начать условный оператор, нужно перетащить на панель действия восьмиугольник с иконкой, обозначающей тип проверки, а затем, возможно, ввести какие-либо значения в появившуюся форму. Имеется в нём и скриптовый язык GML. Рассчитан в основном он на создание 2D игр любых жанров. Также подойдёт для создания различных презентаций и т. п. Начиная с 6-й версии появилась ограниченная возможность работать с 3D. Может быть рекомендован для изучения программирования детьми.

3D Мастер
Программа для визуального создания 3D игр, на русском языке, без единой строчки программного кода или инструкций.

3D Rad
Весьма и весьма интересный конструктор трехмерных игр. Этот конструктор является одним из самых легких в плане программирования трехмерных игр: здесь набор кода почти отсутствует, а если что вам и придётся набирать, так это координаты объектов или путь к текстуре.

Источник

Пошаговая RPG в Excel (Начало)

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

Теперь этого можно будет избежать, ведь в разработке находится пошаговая 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 возвращает индекс цвета пикселя из массива тайлов.

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

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