---
id: gameplay-acceptance
lang: ru
title: Проверка игрового поведения
description: >-
  Переводим фразу «механика готова» в воспроизводимые сценарии с условиями,
  действием и наблюдаемым результатом.
category: workflow
level: beginner
minutes: 6
updatedAt: '2026-10-20'
tags:
  - testing
  - acceptance
  - debugging
sources:
  - title: 'Cucumber: Gherkin reference'
    url: 'https://cucumber.io/docs/gherkin/reference/'
  - title: 'Godot: Overview of debugging tools'
    url: >-
      https://docs.godotengine.org/en/stable/tutorials/scripting/debug/overview_of_debugging_tools.html
url: 'https://gamemechanics.pro/ru/lessons/gameplay-acceptance/'
markdownUrl: 'https://gamemechanics.pro/content/ru/gameplay-acceptance.md'
license: CC-BY-4.0
codeLicense: MIT
attribution: gamemechanics.pro contributors
---

## Что нужно знать

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

## Принцип

Запишите начальное состояние, событие и ожидаемый наблюдаемый результат. Такая структура соответствует Given/When/Then из [справочника Gherkin](https://cucumber.io/docs/gherkin/reference/), но для ручной проверки не требуется устанавливать Cucumber.

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

<span id="пример-рывок-с-одним-зарядом"></span>

## Практический пример

### Рывок с одним зарядом

В учебном контракте рывок тратит один заряд и длится 0,2 секунды игрового времени. Пауза останавливает игровой таймер. Смерть отменяет движение рывка, но не возвращает заряд. Это выбранные правила примера, а не универсальные требования.

| Дано                  | Когда                    | Тогда                                      |
| --------------------- | ------------------------ | ------------------------------------------ |
| Персонаж жив, заряд 1 | Принят запрос рывка      | Заряд 0, состояние рывка активно           |
| Заряд 0               | Повторный запрос         | Новый рывок не начинается                  |
| Идёт рывок            | Игра поставлена на паузу | Длительность не расходуется во время паузы |
| Идёт рывок            | Получено событие смерти  | Движение отменено, заряд остаётся 0        |

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

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

## Частые ошибки

- Проверять только успешный случай с полным запасом ресурсов.
- Считать скриншот доказательством правильной длительности.
- Требовать тот же номер кадра при разной частоте отрисовки.
- Выдавать автоматическую проверку правила за проверку удобства управления.

## Проверка результата

1. Выполните каждый сценарий из указанного состояния и сохраните результат.
2. Повторите интеграционный проход при разных частотах отрисовки, сохраняя шаг симуляции.
3. Проверьте паузу, перезапуск и одновременные события.
4. Для сбоя запишите сборку, входные события, ожидаемое и фактическое поведение.

## Задание для ИИ-агента

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

Сверьте переходы с уроком [«Состояния и переходы»](/ru/lessons/state-machines/) и призмой [«Правила»](/ru/lenses/#schell-033).
