Офтоп Michael Kechinov
1 455

Кроме работы я делаю браузерную игру для нердов

История создания аналога игры «Змеиные бои» Snek Fite с режимом «королевская битва».

В закладки

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

Меня зовут Михаил, в рабочее время я руковожу веб-студией и управляю развитием tech-продукта для ecommerce-компании. В нерабочее время — делаю то же самое. Всё как у всех. Но, как вы поняли, рассказ будет не про работу.

Начну из-за угла

Свою первую игру я сделал в одиннадцатом классе. Мы поспорили на деньги с одноклассником, смогу ли я сделать за лето текстовую адвенчуру. У меня не было компьютера, но я знал QBasic и немного TASM, и у меня был друг с компом, а также 2,5 месяца свободного времени.

Если кто помнит, что такое текстовые адвенчуры, тот знает, как они строятся. Это карта-лабиринт с локациями и переходами между ними. В локациях встречаются разные персонажи, квесты и мобы. Игрок управляет героем, вводя текстовые команды вроде «пойти на сервер» или «вломить орку булавой».

Раньше это было круто и здорово развивало воображение — оно работало вместо графического движка. Такие игры теперь ещё застенчиво называют Interactive fiction.

Спор есть спор, нужно было его выиграть.

Каждый день я ходил к товарищу, занимал его комп на два часа и фигачил на «Бейсике». После этого бэкапил всё на 3.5" дискету и уносил с собой.

Я придумал предысторию персонажа, самого персонажа, чем всё должно закончиться. Населил локации гоблинами, орками и другими NPC. Накидал таверн, магазинов и оружейных. Создал систему текстовых команд. Сделал карту на 2000 локаций.

Как оказалось, c картой вышел перебор. Мир был огромный. Для каждой локации пришлось придумывать описание местности. Больше моего мира был только The Worm in Paradise на «Спектруме» — там было 20 тысяч локаций.

После двухсот моя фантазия сдалась, и на помощь пришёл писатель Пришвин из школьной программы, у него как раз детализированные описания природы. Пришвина хватило ещё на 900 локаций. Толкина, как ни печально, всего на тридцать. Остальное пришлось описать по-чеховски: «луг», «густой лес», «дорога».

Как это водится, перед дедлайном я решил добавить фичу — каждый враг перед нападением кричал что-нибудь воинственное в зависимости от своей расы. Что-то вроде: «Огр закричал "буэерхгляяя!", нанёс удар бревном, но промахнулся». Это-то меня и подвело.

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

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

Прошло, получается, уже почти 20 лет. И я надумал сделать ещё одну игрушку. Просто так, для себя. Мышки плакали, кололись, но продолжали жрать кактусы.

Идея

Дано:

  • Полное отсутствие свободного времени (20 минут в день в метро).
  • Непонимание законов геймдева как индустрии.
  • Технологический перфекционизм (это добавляет изюма в процесс).
  • Желание сделать игру.

Я подумал, что логичнее всего делать игру в том жанре, в котором сам разбираешься. Это вообще ко всему относится, хоть ты книгу пиши — если читаешь преимущественно эпическое фэнтези, то и получится у тебя эпическое фэнтези.

Поэтому я взялся за хардкор. В начале девяностых была такая компания Gamos — они в своё время выпустили множество винрарной классики вроде Lines и «Балды». То, что сейчас назвали бы казуальными играми. Среди продуктов компании была игрушка Snake Battle (или «Змеиные бои»).

На вид — обычная «змейка» с PvP на четверых. На самом деле — симулятор программирования. Свою змею нужно было обучать во встроенном редакторе, расставляя объекты по клетчатому полю. Вот так выглядела настройка — поле, объекты, логические операторы.

Процентов девяносто новых игроков отваливались на этапе «я увидел экран настройки». Зато те, кто смогли пройти дальше, — залипали надолго. В общем, игра была достойной, а механика чуть ли не уникальной.

В детстве я играл в бесплатную версию Snake Battle — полную в моём регионе купить было практически невозможно (да и кто тогда покупал лицензионные игры, сознайтесь?). Единственное, чего сильно не хватало, — возможности поиграть с другом и выяснить, у кого змея длиннее.

Чем я и решил заняться — сделать свою Snake Battle с онлайном, турнирами, таблицей лидеров, разными режимами и всем таким.

Скриншот концепции. Препятствия на поле — пока что в планах, в текущей версии стены есть только по периметру

Snek Fite. Origins

Что нужно инди-игре для успеха? Мемное название.

Ну нет, конечно. Нужна команда. Сначала я так и хотел поступить: в России набирали популярность хакатоны, мы даже стали проводить свой HackDay. Думал так: приду с концепцией, наберу людей, по-быстрому за 48 часов запустим прототип, а дальше видно будет.

Но команда как-то всё не собиралась. В конечном счёте решил сделать Snek Fite сам и между делом проверить книгу про customer development — сделать прототип, нащупать целевую аудиторию, расставить фичам правильные приоритеты.

Стал искать путь создания проекта. Всего нашёл три модели:

  1. Стартаперская. Сделать лендинг, форму лидогенерации. Полить трафиком и посмотреть, сколько народу наберётся. Если нормально, то делать MVP.
  2. Олдскульная. Игра рассчитана на программистов и тех, кто около. Объяснить её на лендинге в виде двух картинок и трёх абзацев текста будет сложновато. Поэтому можно просто сделать MVP (минимальную жизнеспособную версию) игры и опубликовать её, а потом уже полить трафик.
  3. Краудфандинговая. Судя по всему, игра укладывается в категорию «инди». А значит, можно создать проект на Indiegogo и проверить, будет ли спрос. Такой способ я ещё не пробовал. В целях образования — интересно, но запуск отодвинется.

Устроил опрос в Telegram-канале, где большинством голосов (их было три) было решено: делаем по старой доброй модели — сначала первая версия игры, потом все маркетинговые пляски. В мае нашёл несколько часов подряд и засел за код. За ночь развернул рельсы, установил админку, сделал регистрацию и прикрутил GA.

Визуально игра была страшноватой, но это ведь первые два часа разработки МЖП. первая версия игры могла регистрировать змей, программировать их с помощью BPI (basic programming interface) и запускать бой на четыре змеи.

Актуальная версия Snek Fite: 9 змей на одном поле в режиме «Боевой рояль»

Игру сделал браузерной, чтобы не привязываться к какой-то платформе и собственноручно ограничивать базу игроков. На бэкенде — Ruby-on-Rails и PostgreSQL.

Не удержался и купил красивый домен Snek.app — совсем лоукостером остаться не получилось.

Игровой процесс

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

Потом нужно настроить логику поведения — примерно то же самое, что в игре-прародителе.

После настройки можно запускать змею в бой. Есть три игровых режима, каждый длится 1000 ходов, выигрывает самая длинная змея.

Дуэль. Тут просто, один на один.

Стандарт. Четыре змеи на одном большом поле. Намного веселее и динамичнее.

Батл-рояль. Deathmatch на девять змей на одной карте. Настоящее змеиное спагетти, исход матча предсказать невозможно — лидер в первых двух третях игры может быть ловко съеденным ближе к финалу каким-нибудь выскочкой.

Онлайновая часть игры — это асинхронный мультиплеер. После того как ты создал змею, она попадает в общую базу. Из неё и «вытягиваются» змеи для матча, выбираются случайным образом.

Долгое время игрок Undefined был нашим королём, к этому даже все привыкли. Он даже написал своё руководство по игре. Государственный переворот произошёл буквально на днях, короля с шипением стащили с трона

Рейтингов в игре, кстати, сейчас три — по эффективности, активности и национальный (показывает топ стран с наибольшим количеством очков).

В общем, я постоянно что-то допиливаю. И как порядочная игровая компания из одного человека, прислушиваюсь к фанбазе — через опросы в Telegram, Facebook, Twitter и «ВКонтакте». Там же у нас есть чатик для дискуссионного клуба. Сообщество живое и активное, что есть плюс.

Присоединяйтесь. Чем больше игроков, тем веселее. И обновления тестировать лучше.

Ну и рассказывайте, какие у вас сайд-проекты, чтобы не зацикливаться на работе.

#игры

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Michael Kechinov", "author_type": "self", "tags": ["\u0438\u0433\u0440\u044b"], "comments": 8, "likes": 20, "favorites": 1, "is_advertisement": false, "subsite_label": "flood", "id": 43330, "is_wide": false, "is_ugc": true, "date": "Wed, 08 Aug 2018 10:52:06 +0300" }
{ "id": 43330, "author_id": 132549, "diff_limit": 1000, "urls": {"diff":"\/comments\/43330\/get","add":"\/comments\/43330\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/43330"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199791, "possessions": [] }

8 комментариев 8 комм.

Популярные

По порядку

Написать комментарий...
3

О, я хотел сделать батл рояль со змейками, у которых головы в виде аваторов из ВК, но пока передумал из-за отсутствия киллер-фич

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

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

Удачи, продолжай!

Ответить
1

Спасибо.
Да, доделаю фичи, приведу внешний вид в порядок и пойду на steam. Нагрузка там пока небольшая, несмотря на 40000 проведённых баттлов.

Ответить
0

Такие игры надо на Python писать, символично получится.

Ответить
0

Отдельный модуль будет на питоне. Про ML.

Ответить
0

А можно было написать в заголовке статьи не “нердов», а «задротов»?

Ответить
0

Модераторы не пропустят.

Ответить
0

а "задронердов"?

Ответить
0

Если за-дрон-ярд, то может и прокатит.

Ответить
0
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Команда калифорнийского проекта
оказалась нейронной сетью
Подписаться на push-уведомления
{ "page_type": "default" }