{"schemaVersion":1,"record":{"key":"lesson/gameplay-acceptance","type":"lesson","id":"gameplay-acceptance","lang":"ru","title":"Проверка игрового поведения","summary":"Переводим фразу «механика готова» в воспроизводимые сценарии с условиями, действием и наблюдаемым результатом.","updatedAt":"2026-10-20","status":"active","url":"https://gamemechanics.pro/ru/lessons/gameplay-acceptance/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lesson/gameplay-acceptance.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lesson/gameplay-acceptance.md","aliases":["тестирование","testing","acceptance"],"tags":["testing","acceptance","debugging"],"sourceIds":["source-ee9efb6934cc6681","source-e882a929b35f2ca0"],"sources":[{"id":"source-ee9efb6934cc6681","title":"Cucumber: Gherkin reference","url":"https://cucumber.io/docs/gherkin/reference/","verifiedAt":null},{"id":"source-e882a929b35f2ca0","title":"Godot: Overview of debugging tools","url":"https://docs.godotengine.org/en/stable/tutorials/scripting/debug/overview_of_debugging_tools.html","verifiedAt":null}],"sections":[{"id":"prerequisites","title":"Что нужно знать","body":"Игра запускается, кнопка нажимается, а механика всё ещё может нарушать правило. Проверяйте обещанное поведение в известных условиях, а затем отдельно проверяйте, как оно воспринимается игроком."},{"id":"principle","title":"Принцип","body":"Запишите начальное состояние, событие и ожидаемый наблюдаемый результат. Такая структура соответствует Given/When/Then из [справочника Gherkin](https://cucumber.io/docs/gherkin/reference/), но для ручной проверки не требуется устанавливать Cucumber.\n\nРазделите чистое правило и его интеграцию. Расход заряда можно проверить на модели; столкновение с дверью, звук и восстановление после паузы требуют проверки в игре. Отладочные инструменты движка помогают увидеть причину, но отсутствие ошибок в консоли не означает правильность механики.\n\n<span id=\"пример-рывок-с-одним-зарядом\"></span>"},{"id":"example","title":"Практический пример","body":"### Рывок с одним зарядом\n\nВ учебном контракте рывок тратит один заряд и длится 0,2 секунды игрового времени. Пауза останавливает игровой таймер. Смерть отменяет движение рывка, но не возвращает заряд. Это выбранные правила примера, а не универсальные требования.\n\n| Дано                  | Когда                    | Тогда                                      |\n| --------------------- | ------------------------ | ------------------------------------------ |\n| Персонаж жив, заряд 1 | Принят запрос рывка      | Заряд 0, состояние рывка активно           |\n| Заряд 0               | Повторный запрос         | Новый рывок не начинается                  |\n| Идёт рывок            | Игра поставлена на паузу | Длительность не расходуется во время паузы |\n| Идёт рывок            | Получено событие смерти  | Движение отменено, заряд остаётся 0        |\n\nДля одновременного запроса и смерти заранее задайте приоритет: в этой модели сначала обрабатывается смерть, рывок не начинается. На каждом прогоне восстанавливайте начальное состояние, иначе предыдущий тест исчерпает заряд следующего.\n\nВ модели с фиксированным шагом завершение проверяйте на первом тике, где накопленное игровое время достигло 0,2 секунды. Для ручного наблюдения укажите допустимую погрешность и используйте журнал, а не оценку на глаз."},{"id":"mistakes","title":"Частые ошибки","body":"- Проверять только успешный случай с полным запасом ресурсов.\n- Считать скриншот доказательством правильной длительности.\n- Требовать тот же номер кадра при разной частоте отрисовки.\n- Выдавать автоматическую проверку правила за проверку удобства управления."},{"id":"checks","title":"Проверка результата","body":"1. Выполните каждый сценарий из указанного состояния и сохраните результат.\n2. Повторите интеграционный проход при разных частотах отрисовки, сохраняя шаг симуляции.\n3. Проверьте паузу, перезапуск и одновременные события.\n4. Для сбоя запишите сборку, входные события, ожидаемое и фактическое поведение."},{"id":"agent-task","title":"Задание для ИИ-агента","body":"> Реализуй контракт рывка и таблицу сценариев. Автоматизируй чистые переходы, остальные проверки опиши для целевого устройства. В отчёте раздели выполненное, не выполненное и найденные расхождения. Не выдумывай успешный запуск.\n\nСверьте переходы с уроком [«Состояния и переходы»](/ru/lessons/state-machines/) и призмой [«Правила»](/ru/lenses/#schell-033)."}],"relations":[{"type":"requires","direction":"outgoing","label":"Перед началом","key":"lesson/agent-workflow","title":"Разработка игры с ИИ-агентом","url":"https://gamemechanics.pro/ru/lessons/agent-workflow/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lesson/agent-workflow.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lesson/agent-workflow.md"},{"type":"requires","direction":"outgoing","label":"Перед началом","key":"lesson/state-machines","title":"Состояния и переходы","url":"https://gamemechanics.pro/ru/lessons/state-machines/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lesson/state-machines.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lesson/state-machines.md"},{"type":"related","direction":"incoming","label":"Связанные материалы","key":"lesson/performance-budget","title":"Бюджет производительности","url":"https://gamemechanics.pro/ru/lessons/performance-budget/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lesson/performance-budget.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lesson/performance-budget.md"},{"type":"related","direction":"outgoing","label":"Связанные материалы","key":"lesson/state-machines","title":"Состояния и переходы","url":"https://gamemechanics.pro/ru/lessons/state-machines/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lesson/state-machines.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lesson/state-machines.md"},{"type":"reviews","direction":"outgoing","label":"Проверить через призму","key":"lens/schell-033","title":"Правила","url":"https://gamemechanics.pro/ru/knowledge/lens/schell-033/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/lens/schell-033.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/lens/schell-033.md"},{"type":"contains","direction":"incoming","label":"Учебные маршруты","key":"path/first-prototype","title":"Первый проверяемый прототип","url":"https://gamemechanics.pro/ru/learn/first-prototype/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/path/first-prototype.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/path/first-prototype.md"},{"type":"contains","direction":"incoming","label":"Учебные маршруты","key":"path/game-verification","title":"Проверка игры","url":"https://gamemechanics.pro/ru/learn/game-verification/","jsonUrl":"https://gamemechanics.pro/api/v1/knowledge/ru/path/game-verification.json","markdownUrl":"https://gamemechanics.pro/content/knowledge/ru/path/game-verification.md"}],"placements":[],"supersededBy":[],"attributes":{"category":"workflow","level":"beginner","minutes":6},"endsAt":null,"provenance":"Авторский материал gamemechanics.pro. Учебные примеры требуют проверки в своём проекте.","license":"CC-BY-4.0","codeLicense":"MIT","attribution":"gamemechanics.pro contributors"}}