В этом примере показано, как реализовать игру Tetris с помощью графика Stateflow ®. Эта модель является переработанной версией классического демо от Stateflow sf_tetris
. Новый проект включает в себя эти парадигмы программирования:
Параллельное разложение для отделения задач предварительной и последующей обработки от основной логики управления игрой.
Иерархия состояний и субдиаграмм для обеспечения семантических абстракций, которые упрощают проект графика.
Измените операторы обнаружения, чтобы запросить вход с клавиатуры.
В график TetrisLogic реализована логика игры. График состоит из трех параллельных состояний, которые выполняются в этом порядке:
WaitingArea
выполняет задачи предварительной обработки, такие как случайное генерирование следующего тетронимо (форма, состоящая из четырех квадратов). Во время симуляции меньший квадрат справа от пользовательского интерфейса игры отображает это тетронимо.
MainArea
реализует основную логику управления для игры. Чтобы представлять арену игры, это состояние использует массив 21 на 12 arena
. На каждом шаге симуляции график обновляет массив на основе состояния игры и входов игрока.
Draw
выполняет постобработку, например вызывает скрипт MATLAB ® sf_tetris_gui
. Этот скрипт отображает арену как изображение и захватывает нажатия клавиш от игрока.
При помощи иерархии состояний и субдиаграмм можно графически абстрагировать игровую логику, представить высокоуровневый обзор потока игры и скрыть внутреннюю сложность каждого этапа игры. Для примера каждое подсостояние параллельного состояния MainArea
представляет отдельный этап в потоке игры.
Игра начинается с генерации нового тетронимо (substate NewShape
).
Тетронимо движется вниз или сбоку, в зависимости от входа игрока (substate Moving
).
Когда тетронимо касается дна арены или более раннего тетронимо под ней, тетронимо перестает двигаться (substate Stopped
).
Если тетронимо останавливается в слишком высокой точке на арене, игра заканчивается (substate GameOver
). В противном случае график замораживает тетронимо (substate FreezeShape
), корректирует счет (subsate Score
), при необходимости переходит на следующий уровень (substate NextLevel
) и переходит к следующему тетронимо (substate NewShape
).
The Moving
субдиаграмма перемещает тетронимо на основе входов от игрока. По умолчанию subsate MoveSlowly
активно. Тетронимо медленно перемещается вниз по игровой арене, в то время как параллель подсоединяется к MoveSlowly
контролировать вход с клавиатуры. Если игрок нажимает пробел, subsate MoveFast
становится активным. Тетронимо быстро опускается на дно арены.
Чтобы собрать вход с клавиатуры, субдиаграмма использует оператор обнаружения изменений hasChanged
. Каждый раз, когда игрок нажимает клавишу, sf_tetris_gui
увеличивает вход на графике, что делает соответствующий hasChanged
оператор возвращает значение true
. Потому что MoveSlowly
имеет параллельное разложение, график может обрабатывать несколько нажатий клавиш каждый временной шаг.
Для взаимодействия с игровым пользовательским интерфейсом используйте следующие клавиши:
Движение налево: влево стрела или J
Перемещение вправо: Стрела вправо или L
Вращайте по часовой стрелке: Вверх стрела или я
Вращайте против часовой стрелки: Вниз стрела или K
Падение на дно: Пробел
Пауза и возобновление игры: P
К выходу: Q