«Куда посадить игрока» на бесконечной карте— минизарисовка из продакшна геймдева
Пока все обсуждают, как глушат мобильную связь и GPS, моя голова занята навигацией, но совсем другой... Хотя при том не менее интересной. Сегодня хотел бы поделиться, как игра адаптирует свою карту с увеличением числа игроков. Конечно, можно было бы предусмотреть разбивку на "сервера", "комнаты". Но изначально хотелось общую единую карту.
Проблема единой карты в том, что если она будет фиксированного размера, то в зависимости от числа игроков она будет либо слишком просторной и скучной, либо слишком тесной.
На мой взгляд, те алгоритмы, которые опытным путем были реализованы и допилены, подобраны коэффициенты, достаточно хорошо работают. Игрок после спавна видит рандомного "соседа" буквально после первых же нескольких шагов.
1. Стартовый «квадрат»
Координаты карты бесконечны (можно уйти в –12 000, 10 348 — не вопрос).
Первый игрок рождается в центре (0;0).
Далее берём квадрат N × N вокруг нуля, куда и бросаем новичков случайно.
N растёт: каждые 500 новых аккаунтов мы увеличиваем половину стороны ещё на 100 тайлов.
1–500 игроков → диапазон ±50
501–1000 → ±150
дальше по формуле: spawn_radius = 50 + ⌈players/500⌉ * 100
Так мы поддерживаем плотность: пока людей мало — все рядом, позже прямиком в пустыню не улетают, но столпотворения тоже нет.
Да, скажете вы - при таком алгоритме у нас всегда попадает что-то центральное в эту зону чаще, и максимальная плотность будет около центральных координат. С одной стороны, вы будете правы - с другой, после спавна игроки расползаются :)) как тараканы.
Вот как выглядела эволюция карты при увеличении числа игроков:




стадии роста масштабов расползания игроков, белые квадраты - это купленные игроками земли
2. Баланс ресурсов
Карта пустая без кристаллов скучна, но «засыпать» её нельзя. Поэтому:
кристаллы_за_час = base_rate * online_players
base_rate ≈ 0,04 (подбирали эмпирически).
Респавн равномерный, но со случайным смещением, чтобы рядом не появлялись две одинаковые жилы подряд.
Если онлайн падает — генерация тоже замедляется: сервер не забит «мертвыми» ресурсами.
3. Диагональное движение
Поначалу был только крест: N/S/E/W. Пара тестеров застряли в симпатичном, но безысходном каньоне (координаты ‑23; ‑17). Добавили шаги NE, NW, SE, SW.
Результат:
плотность «тупиковых жалоб» упала < 0,1%
средняя длина пути до первой жилы сократилась примерно на треть (игроки теперь режут угол).
Вывод: растущий квадрат + пропорциональный респавн + диагонали держат карту живой и игрока — в движении, а сервер — без лишних процедур расчистки.
Тестовый чат-ботик в Telegram: https://t.me/terry_game_bot?start=4
С большим вниманием изучу комментарии, идеи и предложения. Конструктивная критика тоже приветствуется. После обкатки в боте всех механик будем переносить в приложение все наработки. Заранее спасибо всем, кто предложит ценные дополнения, идеи и алгоритмы!
Лига Разработчиков Видеоигр
8K постов22.8K подписчиков
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"