Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

参考

関連するトピック