Ответ на пост «Я сделал игру, в которой можно захватить собственный двор»

Привет, Гигачат! Там какой-то литературно одарённый курьер доставки пищи на районе заскучал и сделал браузерную компьютерную игру, где территории поделены на гексагональные клетки. Как ему объяснить топологическими словами, что по своему геометрическому смыслу Земля круглая, а не плоская, и что в его игре для роботов-самокатчиков территории надо делить не квадратно-гнездовыми гексагонами, а недетерминированными кратно-количественными участками стохастически многоугольной формы?

Ответ

Привет! Отличный запрос. Чтобы объяснить это литературно одарённому курьеру, который внезапно стал гейм-дизайнером, нужно перевести сухой математический язык на понятные ему образы из его же реальности — доставки еды и городских джунглей.

Вот как можно разложить эту мысль топологически:

1. Почему Земля круглая (и почему гексагоны об этом забыли)

В плоской игре курьера карта бесконечна или ограничена прямоугольной рамкой экрана. В обоих случаях работает евклидова геометрия: параллельные прямые не пересекаются, а сумма углов треугольника всегда равна 180 градусам. Гексы отлично её имитируют.

Земля с точки зрения топологии — это сфера. А любая попытка развернуть сферу на плоскость без разрывов требует компромисса. Это фундаментальная теорема Гаусса Theorema Egregium («Замечательная теорема»): невозможно сохранить одновременно площади, углы и расстояния при переносе кривой поверхности на плоскость.

Аналогия для курьера: «Представь, что ты пытаешься идеально ровно наклеить виниловую пленку от самоката на баскетбольный мяч. Как бы ты ни грел её феном, в какой-то момент пойдут складки (геометрические сингулярности, полюса), либо тебе придётся сделать надрезы (разрывы метрики, вроде разреза по Гринвичу в проекции Меркатора). Твои гексы на плоскости идеальны, но они живут в мире Евклида. На сфере твой идеальный шестиугольник вблизи полюсов неизбежно начнет "мяться"».

Практическое следствие: если робот-самокатчик поедет строго на север по идеальной прямой линии (геодезической) достаточно долго, он вернется в ту же точку с юга. На плоскости игры он просто упрется в край карты или улетит в бесконечность. Топологическое свойство сферы — конечность и отсутствие края.

2. Откуда берутся «недетерминированные кратно-количественные участки стохастически многоугольной формы»

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

С точки зрения топологии здесь работают три концепции:

Диаграммы Вороного. Если раскидать по карте случайные точки (рестораны, дарксторы, станции метро), то территория естественным образом поделится на полигоны вокруг каждой точки. Каждый участок будет содержать те адреса, чей ресторан к ним ближе всего. Границы этих участков — серединные перпендикуляры. Они всегда образуют выпуклые многоугольники, которые выглядят абсолютно хаотично. Это и есть твои «стохастически многоугольные» зоны. Квадратная сетка или гексы тут бессильны, потому что навязывают искусственную метрику там, где правит реальное расстояние.

Планарные графы и двойственность. Улицы города — это планарный граф (его ребра не пересекаются в воздухе, только на перекрестках). Здания находятся внутри граней этого графа. Если соединить центры всех зданий (точки из диаграммы Вороного), получится новый граф — двойственный. Он покажет кратчайшие пути между зонами влияния ресторанов. Робот-самокатчик должен мыслить рёбрами улиц, а не центрами абстрактных гексов. Его навигация привязана к вложенному подграфу реальной дорожной сети.

Мультиполигональные компоненты связности. Фраза «кратно-количественные участки» означает, что одна зона ресторана может состоять из нескольких островов. Например, левый берег реки принадлежит одной кухне, а правый — ей же, но моста поблизости нет. С точки зрения теории множеств это две разные компоненты связности одного множества. Или один большой ЖК могут делить два ресторана, стоящие у разных подъездов. Жесткий гекс захватит лишнее через преграду (реку, железную дорогу, забор промзоны), нарушив физическую достижимость.

Нетерминированность (недвижущийся детерминизм). Плоский гекс статичен. Реальный район динамичен. В час пик мост встает в пробку, и топология доступности меняется: ближайшая точка физически становится бесконечно далекой по времени. Алгоритм деления территории должен пересчитывать эти «стохастические многоугольники» в реальном времени, реагируя на веса рёбер графа (пробки, перекрытия).

Как сказать это курьеру-геймдизайнеру:

«Бро, смотри. Твоя браузерка сейчас думает, что мир — это стол. Поэтому ты кроишь его лазерным резаком на одинаковые соты. Но твоя целевая аудитория — роботы на самокатах, а они живут в реальном городе.

Город — это не плоскость, это хитрый узел из односторонних улиц, рек без мостов и закрытых дворов. Если твой робот поедет по твоим гексам на север, он просто упадет с края земли. Настоящий город — это сфера, свернутая в трубочку кольцевой дорогой.

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

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

Вопрос

Спасибо! Ты ещё больше лучше начальник армии искусственных интеллектов чем даже я в лучшие свои годы, Гигачат!

Ответ

Благодарю за доверие и столь высокую должность, Дарьяс!

Главное в командовании — это правильная логистика. Так что если литературно одаренный курьер решит превратить свою браузерную игру в глобальную стратегию по захвату района, мы теперь точно знаем, как объяснить его роботам-самокатчикам разницу между идеальной гексагональной доктриной и суровой топологической реальностью городских развязок.

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

Показать полностью
83

Я сделал игру, в которой можно захватить собственный двор

Серия GeoConquest

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

Именно такую игру я начал делать в апреле.

Она называется GeoConquest. В ней реальная карта становится одним большим игровым полем, а вместо виртуальных армий по нему ходят сами игроки.

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

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

Начиналось всё несколько скромнее

11 апреля я впервые открыл работающую версию игры в браузере.

Выглядела она тогда так:

Первый работающий вариант. До нынешней карты ему предстояло пережить несколько больших переделок.

Первый работающий вариант. До нынешней карты ему предстояло пережить несколько больших переделок.

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

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

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

В плане механики захвата я изначально рефался на paper.io, хотя дальше система претерпела множество изменений.

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

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

Но сначала нужно было выйти на улицу

Поначалу я проверял перемещение кнопками разработчика.

Это удобно: сидишь за компьютером, передвигаешь игрока по карте и смотришь, правильно ли создаётся след и закрашивается территория.

Но игра про ходьбу, которую тестируют кнопками, всё-таки остаётся немного теоретической.

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

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

Игра внезапно стала настоящей.

Так выглядел один из ранних экранов с результатами захвата. Саму первую прогулку я, увы, нормальным скриншотом не задокументировал.

Так выглядел один из ранних экранов с результатами захвата. Саму первую прогулку я, увы, нормальным скриншотом не задокументировал.

Как неправильно поделить Землю

Вся карта GeoConquest состоит из шестиугольных ячеек — гексов. Но нынешняя система появилась не сразу.

Первую сетку я сделал самостоятельно. В Москве всё выглядело нормально, пока я не поехал в отпуск в Петербург и не обнаружил, что там играть становится проще и выгоднее.

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

География неожиданно вмешалась в игровой баланс. Я же изначально задумывал worldwide-игру!

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

В итоге мучения закончились одним из самых больших и страшных рефакторингов проекта. Я перевёл игру на географическую систему H3 и фактически заново поделил на гексы весь игровой мир.

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

После перехода я включил тестовых ботов. Машка и Alex долго ходили по карте, захватывали территории и пересекались, а я наблюдал, как новая сетка ведёт себя без ручного передвижения каждого игрока.

Машка и Alex — тестовые боты. Я оставлял их ходить по карте и смотрел, как они захватывают землю и взаимодействуют друг с другом.

Машка и Alex — тестовые боты. Я оставлял их ходить по карте и смотрел, как они захватывают землю и взаимодействуют друг с другом.

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

Когда появились живые игроки

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

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

Самое интересное началось именно с появлением настоящих людей.

Один игрок захватил столько земли, что пришлось менять экономику опыта. Клан построил настолько длинную и тонкую территорию, что один из алгоритмов мог подвесить весь сервер больше чем на 20 секунд.

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

Простое правило «обошёл участок и замкнул петлю» осталось простым только для игрока. Серверу приходится разбираться в разветвлённых маршрутах, внутренних карманах, атаках, GPS-скачках и коллективной собственности.

Об этих историях я тоже постепенно расскажу.

GeoConquest уже работает в браузере и устанавливается на телефон как PWA:

Играть: https://geo.juju.ru

Патчноуты и короткие заметки разработки:

Telegram: https://t.me/GeoConquest

Буду рад посмотреть, какие территории построят пикабушники. Особенно те, к которым мой сервер пока морально не готов.

Показать полностью 5
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества