Блог Metlivi

Как создать игру с ИИ-ботом с четкими правилами, памятью и выбором игрока

Чтобы создать играбельную игру с ИИ-ботом, определите небольшой повторяемый цикл, храните состояние игры вне диалога и обеспечьте четкие последствия для каждого действия игрока. Позвольте боту интерпретировать запросы и описывать события; пусть явные правила определяют затраты, прогресс и концовки. Это руководство предназначено для разработчиков игр, создающих текстовую игру с персонажем или рассказчиком на базе ИИ. Задача состоит в том, чтобы создать одну короткую, пригодную для тестирования сессию, в которой игроки понимают свои возможности, видят значимость своих решений и достигают корректного финала. Приведенная ниже игра о доставке — это наглядный концепт, а не протестированный продукт или задокументированный кейс.

22 сентября 2026 г.Время чтения: 3 мин.Чтение, искусство и культураАвтор: Metlivi Editorial Team
Раздел 1

Начните с основного цикла, в который можно играть без ИИ

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

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

Рассмотрим небольшую игру под названием *Festival Parcel* («Фестивальная посылка»). У игрока есть пять единиц времени на доставку посылки. Он может выбрать прямой маршрут или дорогу через сад, а также при желании взять декоративную ленту перед выходом. Бот играет роль праздничного курьера, который объясняет маршруты и комментирует доставку.

Предложенные правила намеренно компактны:

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

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

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

Сделайте явное состояние источником истины для исходов

Относитесь к состоянию как к игровой записи фактов. Текст диалога может объяснять эту запись, но не должен незаметно ее менять.

Глава «State» («Состояние») Роберта Найстрома в книге *Game Programming Patterns* (https://gameprogrammingpatterns.com/state.html) описывает конечные автоматы через состояния, входные данные и разрешенные переходы. В ней также показано, как свободно скомбинированные булевы флаги могут приводить к недопустимым комбинациям. Примените этот принцип к жизненному циклу вашей игры: используйте один статус сессии, например active (активна), delivered (доставлено) или missed (сорвано), с четко определенными переходами.

Для прототипа доставки достаточно небольшой спецификации состояния:

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

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

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

Вы можете создать прототип этих условий с помощью существующих инструментов интерактивной литературы. В официальном руководстве по Inkle (https://www.inklestudios.com/ink/web-tutorial/) объясняются условные выборы, отслеживание ранее посещенного контента, переменные и явные концовки. Эти функции служат полезной основой для тестирования авторской игры перед добавлением повествования от ИИ.

Поле — Начальное значение — Правило
Статус сессии — active — Только активные сессии принимают игровые действия
Оставшееся время — 5 — Не может опускаться ниже нуля
Лента взята — false — Может измениться на true один раз
Выбранный маршрут — none — При доставке принимает значение direct или garden
Счетчик зафиксированных действий — 0 — Увеличивается на единицу за каждое принятое игровое действие
Раздел 3

Дайте игрокам выборы, которые они могут понять и на которые могут повлиять

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

В игре *Festival Parcel* выбор маршрута учитывает различные предпочтения игроков:

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

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

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

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

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

План — Общие затраты времени — Видимый результат
Прямая доставка — 3 — Обычная посылка доставлена, осталось 2 ед. времени
Взять ленту, затем прямая доставка — 4 — Украшенная посылка доставлена, осталась 1 ед. времени
Доставка через сад — 4 — Обычная посылка доставлена с открыткой с садом
Взять ленту, затем доставка через сад — 5 — Украшенная посылка доставлена с открыткой с садом
Раздел 4

Определите, что бот помнит и что он может знать

Разделите память на три уровня, каждый со своей целью.

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

Журнал событий сессии фиксирует совершенные действия и их последствия. Запись может гласить, что действие 2 добавило ленту и уменьшило время с пяти до четырех. Это помогает при отладке и формировании точных итогов. Сохраняйте идентификаторы действий, чтобы повторный запрос не мог применить одно и то же событие дважды.

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

В руководстве Anthropic по эффективному контекстному инжинирингу (https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents) рассматривается как суммаризация истории диалога, так и ведение постоянных заметок вне окна контекста. Там также содержится предупреждение, что чрезмерная суммаризация может привести к потере важных деталей. Вывод для геймдизайна: храните точные механические факты в структурированном хранилище, а сводки используйте для связности диалога.

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

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

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

Раздел 5

Спроектируйте раздельные реакции на игровой проигрыш и системный сбой

Недостигнутая цель — это часть игры. Сбой при генерации запроса — проблема реализации. У них должны быть разные последствия.

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

Для системных сбоев определите логику восстановления до добавления сложного повествования:

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

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

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

Ситуация — Обязательное поведение
Неоднозначный запрос игрока — Запросить уточнение; сохранить состояние
Недоступное действие — Объяснить невыполненное условие; сохранить состояние
Недопустимое действие, предложенное ИИ — Отклонить его и предложить допустимые действия
Сбой генерации текста после фиксации действия — Отобразить авторский результат из зафиксированного состояния
Дублирующийся запрос — Вернуть существующий результат без повторного списания ресурсов
Не удается загрузить сохраненное состояние — Сообщить о проблеме и предложить восстановление или явный перезапуск
Раздел 6

Протестируйте правила, затем интерпретацию бота

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

Пригласите репрезентативных игроков пройти доставку без подсказок. Попросите их объяснять свои ожидания перед выбором и то, что, по их мнению, изменилось после него. Руководство Nielsen Norman Group по юзабилити-тестированию методом «думай вслух» (https://www.nngroup.com/articles/thinking-aloud-the-1-usability-tool/) рекомендует подбирать репрезентативных участников и задачи, давая участникам возможность высказаться; оно также предупреждает, что подсказки ведущего могут влиять на поведение.

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

Краткий чек-лист плейтеста. Исправляйте ошибки в правилах и обработке состояния до расширения игрового мира. Если игроки понимают выбор, но находят его неинтересным, измените компромиссы. Если им нравятся решения, но они не могут предугадать затраты, улучшите подачу информации. Расширяйте прототип, когда его текущие выборы остаются понятными при различных формулировках, сохраненных сессиях и путях с ошибками.

Начало: может ли новый игрок определить цель, запас времени и завершающие действия?
Цикл: приводит ли каждое принятое действие к видимому последствию и корректному следующему шагу или финалу?
Выбор: могут ли игроки объяснить, почему они выбрали тот или иной маршрут либо вариант украшения?
Граничный случай: завершается ли взятие ленты с последующей доставкой через сад успехом ровно при нулевом остатке времени?
Валидация: сохраняют ли неоднозначные, повторные и недоступные запросы корректное состояние?
Память: сохраняет ли сохранение и загрузка ресурсы, сделанные выборы и доступные действия?
Игровой проигрыш: завершается ли ситуация с недоступной по времени доставкой четким финалом с возможностью перезапуска?
Восстановление: может ли игра продолжаться при сбое генерации текста без повторного списания ресурсов?
Согласованность: соответствует ли каждая концовка зафиксированному маршруту и статусу ленты?
Материалы по теме

Продолжить изучение темы