Stateflow を使用したゲームの設計
この例では、Stateflow® チャートを使用してテトリス ゲームを実装する方法を説明します。このモデルは Stateflow の古典的なデモ sf_tetris を再設計したバージョンです。新しい設計には次のプログラミング パラダイムが組み込まれています。
パラレル構造。前処理と後処理のタスクをメインのゲーム制御ロジックから分離します。
ステートの階層とサブチャート。チャートの設計を簡略化するセマンティクスの概念化を提供します。
変化検出演算子。キーボードからの入力をクエリします。

パラレル構造を使用したサブコンポーネントの分離
チャート TetrisLogic は、ゲームの背後にあるロジックを実装します。チャートは 3 つのパラレル ステートで構成され、次の順序で実行されます。
WaitingAreaは次の "テトロニモ" (4 つの正方形からなる形状) をランダムに作成するなどの前処理タスクを実行します。シミュレーション時、ゲーム UI の右側にある小さな正方形にこのテトロニモが表示されます。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 はパラレル構造をもつため、チャートは各タイム ステップで複数のキーストロークを処理できます。

キー マッピング
ゲーム UI を操作するには、次のキーを使用します。
左へ移動: 左矢印または J
右へ移動: 右矢印または L
時計回りに回転: 上矢印または I
反時計回りに回転: 下矢印または K
底へ落とす: スペース バー
プレイの一時停止と再開: P
終了: Q
