В этом примере показано, как реализовать игру Тетрис с помощью диаграммы Stateflow ®. Эта модель является переработанной версией классической демонстрации Stateflowsf_tetris. Новая конструкция включает в себя следующие парадигмы программирования:
Параллельное разложение для отделения задач предварительной и последующей обработки от основной логики управления игрой.
Иерархия состояний и подчасти для обеспечения семантических абстракций, упрощающих дизайн диаграммы.
Изменение операторов обнаружения для запроса ввода с клавиатуры.

Диаграмма TetrisLogic реализует логику, лежащую в основе игры. Диаграмма состоит из трех параллельных состояний, которые выполняются в следующем порядке:
WaitingArea выполняет задачи предварительной обработки, такие как случайное создание следующего тетронимо (формы, состоящей из четырех квадратов). Во время моделирования меньший квадрат справа от пользовательского интерфейса игры отображает это тетронимо.
MainArea реализует основную логику управления игрой. Для представления игровой арены в этом состоянии используется массив 21 на 12 arena. На каждом этапе моделирования диаграмма обновляет массив на основе состояния игры и входных данных от игрока.
Draw выполняет задачи постобработки, такие как вызов сценария MATLAB ®sf_tetris_gui. Этот сценарий отображает арену в виде изображения и захватывает нажатия клавиш от игрока.

Используя иерархию состояний и подшарты, можно графически абстрагировать логику игры, представить высокоуровневый обзор хода игры и скрыть внутреннюю сложность каждого этапа игры. Например, каждое подсостояние параллельного состояния MainArea представляет отдельный этап в потоке игры.
Игра начинается с генерации нового тетронимо (подсостояния NewShape).
Тетронимо движется вниз или вбок, в зависимости от ввода от игрока (подсостояние Moving).
Когда тетронимо касается дна арены или более раннего тетронимо под ней, тетронимо прекращает движение (подсостояние Stopped).
Если тетронимо останавливается в слишком высокой точке на арене, игра заканчивается (подсостояние GameOver). В противном случае диаграмма замораживает тетронимо (подсостояние FreezeShape), корректирует оценку (подсостояние Score), при необходимости переходит на следующий уровень (подсостояние NextLevel) и переходит к следующему тетронимо (подсостояние NewShape).
Moving Подкадр перемещает тетронимо на основе входных данных проигрывателя. По умолчанию подсостояние MoveSlowly активен. Тетронимо медленно движется вниз по игровой арене, в то время как параллельные подстанции в MoveSlowly контролировать ввод с клавиатуры. Если игрок нажимает пробел, подсостояние MoveFast становится активным. Тетронимо быстро опускается на дно арены.
Для сбора входных данных с клавиатуры в подшарте используется оператор обнаружения изменений hasChanged. Каждый раз, когда игрок нажимает клавишу, sf_tetris_gui увеличивает ввод в диаграмму, что делает соответствующий hasChanged оператор возвращает значение true. Поскольку MoveSlowly имеет параллельную декомпозицию, диаграмма может обрабатывать несколько нажатий клавиш каждый шаг времени.

Для взаимодействия с пользовательским интерфейсом игры используйте следующие клавиши:
Переместить влево: стрелка влево или J
Переместить вправо: стрелка вправо или L
Повернуть по часовой стрелке: Стрелка вверх или I
Повернуть против часовой стрелки: Стрелка вниз или К
Опустить вниз: Пробел
Чтобы приостановить и возобновить воспроизведение: P
Выход: Q
