← Модуль 9/Flow и кривые сложности
EN
Модуль 9 · Теория геймдизайна

Flow и кривые сложности

Вовлечённость — это подвижный баланс вызова и навыка. Слишком трудно — тревога и выход; слишком легко — скука и выход; в меру — поток, где исчезает время. Навык растёт по ходу игры, поэтому сложность обязана расти вместе с ним — и не гладкой линией, а пилой: научил → дал попрактиковаться → поднял планку.
~16 мин🎲 дизайн + 🔬 контроль🏠 лаба
Суть за 30 секунд
Поток (Чиксентмихайи) — состояние полного погружения; нужны ясные цели, мгновенная обратная связь и вызов под навык. Отложи по осям вызов (y) и навык (x): выше диагонали — тревога (слишком трудно), ниже — скука (слишком легко), вдоль — flow-канал. Навык растёт со временем, поэтому фиксированная сложность выпадает из канала вниз (в скуку) — сложность должна расти с навыком. Две философии: DDA, подстраивающаяся под тебя (Mario Kart: резинка держит гонку близкой), и сложность-как-выбор (Dark Souls: перекачался/недокачался — твоё решение). Реальная кривая — не гладкая линия, а пила: ввёл механику (провал в лёгкое, ты снова новичок) → практика → пик → следующая механика → провал. Celeste — канонический учитель. Проектировать поток = управлять зазором «вызов − навык» во времени.

Механизм: канал, зазор и пила

Flow-канал

Поток требует трёх условий: ясные цели (знаешь, что делать), мгновенная обратная связь (знаешь, получилось ли), баланс вызов↔навык. На плоскости навык×вызов это диагональный коридор:

навык → вызов → ТРЕВОГАслишком трудно СКУКАслишком легко FLOW-КАНАЛ

Слишком легко — скука (не вовлечён). Слишком трудно — тревога (фрустрация, выход). В меру — поток (поглощён, время исчезает). Канал — это полоса, а не линия: есть допуск. Формально, если c — вызов, s — навык, а w — ширина допуска:

поток⇔|c−s|≤w

Тревога при c−s>w, скука при s−c>w. Пример (шкала 0–10): навык s=6, допуск w=2 → поток при вызове c∈[4,8]; c=9 — тревога, c=3 — скука.

Навык растёт → сложность обязана расти

Навык s(t) увеличивается с игрой. Фиксированный вызов c= const через час оказывается ниже канала → скука. Значит c(t) должен трекать s(t). Отсюда «оптимальная кривая сложности» — растущая. Но как растить — два подхода.

DDA vs сложность-как-выбор

DDA (dynamic difficulty adjustment) — игра сама подстраивает вызов под замеренный навык. Mario Kart, резинка: лидера чуть тормозят, последнего разгоняют → гонка всегда близка → игрок ощущает накал (поток). Риск: слишком явная резинка ощущается нечестной — «меня наказывают за то, что играю хорошо», убивает мотивацию. Сложность-как-выбор (Dark Souls — это не DDA): трудность определяет игрок через уровень/билд/призыв. Перекачался — босс тривиален; недокачался — жесток. Философия «сложность — это выбор»: одни гриндят до overlevel, другие сознательно идут underleveled. Оба валидны.

Реальная кривая — пила, а не прямая

Ввод новой механики сбрасывает воспринимаемую сложность: по этой механике ты снова новичок. Поэтому кривая — пила: локальный провал в лёгкое на каждом новом элементе, затем рампа вверх; общий тренд растёт. Celeste — эталон: учит механику (стена) → лёгкая практика в безопасной зоне → трудный челлендж → вводит рывок → снова провал-практика-пик. Плюс режим ассиста (скорость игры, инвула) — расширяет канал для доступности, не стыдя игрока.

Анти-паттерны: плоская сложность (скука); скачок без обучения (тревога, выход); фейковая сложность (просто +HP врагу вместо более интересного поведения — BG3 на высокой сложности добавляет врагов и тактику, а не только хиты).

🏠 Лаба — Flow-канал вживую
Интерактивная лаба без кода: задай рост навыка и ширину канала, выбери стратегию сложности (плоская / линейная / пила-Celeste / DDA-Mario Kart) — и смотри, сколько времени игрок проводит в потоке, тревоге и скуке. Пила держит в канале; плоская сползает в скуку; наивная DDA рискует осцилляцией. Открыть лабу →
Формализм канала (|вызов − навык| ≤ w) и DDA-как-регулятор — в хардкор-вкладках выше; здесь — покрутить руками.

🕹 Во что поиграть — и что заметить

Celeste пила + ассист

Учебник кривой: каждый экран вводит один приём, даёт безопасную практику, потом пик. Assist Mode (скорость, воздушные рывки, инвула) расширяет канал под любой навык, не убирая дизайн.

🎮 Сделай: пройди главу и отметь на каждом экране, что он вводит и где пик — увидишь зубцы пилы. Включи Assist Mode и почувствуй, как канал расширяется (провал в тревогу становится потоком) без «стыда за лёгкий режим».

Mario Kart DDA-резинка

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

🎮 Заметь: едь то первым, то последним — увидишь, как игра тебя подстраивает (лидеру хуже предметы, последнему лучше). Поймай момент, когда резинка ощущается нечестной — это цена слишком заметной DDA.

Elden Ring / Dark Souls сложность-как-выбор

Никакой резинки: канал двигаешь ты сам — уровнем, билдом, призывом, порядком боссов. Overlevel → тривиально; underlevel → брутально; оба варианта — валидный опыт.

🎮 Заметь: застрял на боссе — попробуй сдвинуть свой навык-эквивалент (прокачка, другое оружие, помощь) вместо слайдера сложности. Почувствуй, что здесь регулятор — в руках игрока, а не автомата.

Хардкор · DDA как контур управленияможно пропустить

Регулятор с оценкой скрытой переменной

DDA — это feedback control: скрытая переменная — навык s(t) — не наблюдается напрямую; её оценивают по шумным сигналам (смерти, время прохождения, число ретраев, точность). Затем актуатор — сложность c(t) — двигают, чтобы держать ошибку e=c−s около нуля (центр канала). Это П-регулятор: c←s+kp·сигнал.

Почему наивная DDA осциллирует и «чувствуется»

Слишком большой gain kp → перерегулирование: игрок чуть выиграл — резко труднее, проиграл — резко легче, система колеблется, и игрок это замечает (резинка «палится»). Плюс оценка навыка шумная (одна смерть ≠ падение навыка), поэтому нужен фильтр/сглаживание и мёртвая зона (ширина канала w = не реагировать, пока в потоке). Лучшая DDA — невидимая: медленная, с гистерезисом, актуирует не голую сложность, а её мягкие каналы (спавн, дроп, интенсивность). Resident Evil 4 — хрестоматийный скрытый пример.

Хардкор · дизайн: пила, фейковая сложность, доступностьможно пропустить

Пила и Kishōtenketsu

Зубец пилы = один цикл ки-сё-тэн-кэцу: введение приёма (провал в лёгкое) → развитие (практика) → твист (пик) → примирение (комбо всех приёмов). Каждый новый приём временно делает игрока новичком — отсюда локальный сброс сложности при растущем тренде.

Настоящая vs фейковая сложность

Фейковая — та, что растит числа (HP, урон) без новых решений: игрок делает то же дольше. Настоящая — та, что требует новых решений (новые паттерны врагов, комбинации механик, тайминги). Хороший «hard mode» меняет поведение, а не только множители (BG3, Doom Eternal). Фейковая сложность выталкивает в тревогу без роста навыка — худшее из двух миров.

Доступность расширяет канал

Assist/accessibility-режимы (Celeste, TLOU2) расширяют w и двигают нижнюю границу: скорость игры, автоприцел, инвула, чек-пойнты. Это не «лёгкий режим-костыль», а признание, что навык у игроков разный, а поток нужен всем.

Аналогия
Поток — как персональный тренер, подбирающий вес. Слишком лёгкий — скучно, нет роста; слишком тяжёлый — срываешься и бросаешь; чуть выше твоего текущего максимума — растёшь и вовлечён. Становишься сильнее (навык растёт) — тренер добавляет вес (сложность растёт), удерживая в продуктивной зоне. DDA = автомат, который сам чувствует твои повторы и меняет вес на лету; Dark Souls = стойка, где ты сам вешаешь блины (и можешь выбрать жесть). Плохая резинка = машина, которая делает легче ровно в тот момент, когда ты стараешься, — демотивирует.
Почему это важно
Поток — базовая модель «вовлечённости» и самый полезный ракурс для пейсинга: как раскладывать вызов во времени, чтобы игрок не выпал ни в скуку, ни в тревогу. А инженерная рамка (оценить скрытый навык по шумным сигналам, держать ошибку «вызов − навык» у нуля, не свалиться в осцилляцию) — это настоящая задача управления с обратной связью, которая один в один переносится на адаптивные системы.
🔁 За пределами игр — куда это переносится
Урок — про адаптивный контур: держи сложность задачи у текущей способности, оценивая её по шумным сигналам.

ML / AI (твой домен): flow-канал — это дословно curriculum learning: подавай модели задачи под её текущую способность и поднимай планку по мере роста. Слишком трудно → нет обучающего сигнала/градиента (≈ тревога); слишком легко → нет новой информации (≈ скука); максимум обучения — на «трудно-но-решаемо». Автоматические curricula — self-play лиги (AlphaStar), PLR (prioritized level replay), teacher-student generation уровней — держат агента в его flow-канале. DDA как П-регулятор с оценкой скрытого навыка ⇄ adaptive testing / IRT (следующий вопрос — на уровне способности испытуемого, setpoint-контроль) и bandit-подбор сложности. Осцилляция наивной DDA (слишком большой gain, шумная оценка) ⇄ нестабильность обучения при большом LR / шумной оценке трудности — лечится сглаживанием, гистерезисом (мёртвая зона = ширина канала), медленной адаптацией. А «вызов под навык максимизирует обучение» ⇄ зона ближайшего развития и сэмплирование самых трудно-решаемых примеров ради максимального градиента.

Обучение/EdTech: адаптивные платформы (Duolingo, Khan) держат ученика в зоне ближайшего развития — тот же setpoint между скукой и тревогой.

Управление: любой автоскейлер/термостат/PID — оценка состояния + актуатор + борьба с перерегулированием и шумом датчика.

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

🔧 Запусти и поковыряй
🏠 Лаба «Flow-канал» в браузере
Открой lab-flow.html: покрути рост навыка и ширину канала, сравни 4 стратегии сложности по доле времени в потоке. Доведи пилу до >80% потока; сломай DDA большим gain'ом и увидь осцилляцию.
🎮 Разбор кривой ~25 мин
Пройди первую главу Celeste (или любого платформера) и нарисуй фактическую кривую сложности по экранам: где вводится приём (провал), где пик. Наложи на свой Новгород: где у него обучающие «зубцы» и где риск плоской скуки или спайка без обучения.
Чеклист: в лабе довёл пилу до высокого % потока и поймал осцилляцию DDA; на реальной игре разметил зубцы пилы; связал flow-канал с curriculum learning.
Связи
основа
MDA и core loop — core-петля должна лежать в flow-канале: вызов под навык на каждом обороте.
дальше
Level design — ки-сё-тэн-кэцу и есть зубец пилы: как учить и дозировать сложность уровнем.
смежное
Game feel — «мгновенная обратная связь» — одно из трёх условий потока.
смежное
Телеметрия — сигналы для оценки навыка (смерти/время/воронки) и замер, где игроки выпадают.
Вопросы пытливого ума
Почему канал — полоса, а не линия? Разве не нужен точный баланс?
Точная линия c=s недостижима и не нужна. Во-первых, навык шумит: игрок то соберётся, то ошибётся, и мгновенное s прыгает — гоняться за ним точной сложностью значит дёргать её каждую секунду (осцилляция). Во-вторых, лёгкое отклонение вверх дарит всплеск при победе (радость превозмогания), вниз — момент передышки/мастерства. Полоса ширины w — это мёртвая зона регулятора: пока игрок внутри, ничего не трогаем. Поэтому дизайнеры целятся не в линию, а в чуть выше навыка (лёгкий положительный зазор — «стретч»), оставаясь в полосе. Слишком узкий w = нервная, «палящаяся» подстройка; слишком широкий = игрок успевает заскучать/испугаться прежде, чем система среагирует.
Когда DDA хорошая, а когда ощущается дешёвой?
DDA хороша, когда невидима и актуирует мягкие каналы: интенсивность спавнов, дроп патронов/аптечек, агрессия ИИ, подсказки — так, что игрок чувствует «повезло/справился», а не «мне поддались». RE4 так прячет подстройку под капотом. Плохой она становится, когда заметна и наказывает навык: играешь хорошо → игра резко жёстче или отбирает победу (слишком явная резинка Mario Kart на первом месте), играешь плохо → всё внезапно тривиально. Причины «дешевизны»: большой gain (резкая реакция), актуирование прямой сложности вместо мягких каналов, отсутствие гистерезиса. Правило: подстраивай медленно, скрыто, через непрямые рычаги, и никогда не отменяй заслуженный успех — иначе рушится competence (ощущение мастерства).
Чем настоящая сложность отличается от фейковой?
Фейковая сложность растит числа, не требуя новых решений: у врага вдвое больше HP — ты делаешь то же самое дважды дольше. Скучно и утомительно, а не трудно-интересно. Настоящая сложность требует новых решений: новые паттерны атак, комбинации механик, тайминги, ресурс-менеджмент под давлением. Тест простой: «hard mode меняет, как я играю, или только сколько?». Doom Eternal и BG3 на высокой сложности меняют поведение врагов и тактику (новые решения) — это растит навык. «Губки для урона» — фейк: выталкивают в тревогу/скуку без обучения. В терминах канала: настоящая сложность двигает и c, и (через обучение) s; фейковая двигает только c вверх, оставляя s на месте.
Как это связано с curriculum learning в ML?
Один в один. Обучение максимально, когда задача на грани текущей способности модели: слишком лёгкие примеры не дают нового сигнала (модель уже права — «скука», нулевой градиент по смыслу), слишком трудные не дают обучающего сигнала (модель всегда неправа, нет градиента к решению — «тревога»). Curriculum learning явно подаёт задачи по возрастанию трудности; автоматические curricula (PLR, self-play лиги AlphaStar, teacher-student генерация уровней) оценивают текущую способность и подбирают задачи в «flow-канал» агента — это ровно DDA, только ученик — нейросеть. Adaptive testing (IRT) делает то же для людей: следующий вопрос выбирается у порога способности, чтобы максимизировать информацию. И патологии общие: слишком агрессивная адаптация трудности (или learning rate) → нестабильность/осцилляция; лечится сглаживанием, гистерезисом и медленным темпом. Освоив flow-канал в дизайне, ты уже понимаешь, почему «трудно-но-решаемо» — оптимум обучения.
Что почитать