Игры · 5 мин

Как из одного числа получается целый игровой мир

Что делает seed, чем случайность отличается от хаоса и почему генератору нужны правила. Создаём маленькую карту на Python.

Что разберём

Что делает seed, чем случайность отличается от хаоса и почему генератору нужны правила. Создаём маленькую карту на Python.

Число не хранит готовую карту

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

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

Псевдослучайность может быть повторяемой

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

В Python для учебного примера удобно создать отдельный объект random.Random. Тогда посторонний вызов общего генератора не вмешается в нашу последовательность. Это не инструмент для паролей или секретных кодов: задачи воспроизводимой игры и безопасной случайности различаются. Здесь повторяемость — достоинство, а при создании секрета предсказуемость была бы проблемой.

seed 42Совпадаютseed 42Совпадаютseed 43Другая карта
Одинаковые seed и правила дают одинаковую учебную карту; смена seed меняет расположение клеток. Схема не описывает внутренний алгоритм Minecraft.

Делаем маленькую карту

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

Запусти код два раза с seed 42, затем с 43. Сначала карты совпадут, затем изменятся. Для повторения важно не только число: переставь элементы tiles и сравни результат. Даже при прежнем seed соответствие случайных выборов типам клеток изменится. Так на маленьком примере видно, почему версия правил тоже часть описания мира.

Пример для практики
import random

def make_map(seed, width=10, height=6):
    rng = random.Random(seed)
    tiles = [".", ".", ".", "~", "#"]
    return ["".join(rng.choice(tiles) for _ in range(width))
            for _ in range(height)]

for row in make_map(42):
    print(row)

assert make_map(42) == make_map(42)

Почему независимых клеток недостаточно

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

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

Как появляются связные горы и области

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

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

Как проверить, что выход достижим

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

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

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

Что сохранять и как искать ошибки

Если игрок срубил дерево, одного seed для восстановления состояния уже недостаточно: он описывает исходную генерацию, но не действия игрока. Нужны сохранённые изменения или другое представление текущего мира. Полезно различать «создать начальный мир снова» и «продолжить с того места, где остановился».

Для тестирования записывай seed, версию генератора и параметры. Проверяй не только красивый пример, но и много разных карт: существует ли путь, не попал ли старт в воду, не перекрыт ли выход. Сначала сформулируй проверяемые правила, затем автоматизируй их. Самый впечатляющий результат процедурного подхода — не огромная случайная картинка, а множество разных миров, каждый из которых остаётся пригодным для игры.

Источники и дальнейшее чтение