1

C++ で NDS のコーディングを行っています。決定木のように、イベントが順番に発生し、プレイヤーの選択に応じて変化するゲームを作成する予定です。例:

===場所===

  • 廊下: プレイヤーが通過できる 2 つのドア
  • バスルーム: 地下への秘密の入り口があります
  • 地下:廊下に戻る
  • ベッドルーム: バスルームにつながる

===シーケンス===

ここに画像の説明を入力

各部屋では、キーの押下が常にチェックされます。したがって、これは私が最初に考えたシーケンスをコーディングするための基本的で一般的に悪い方法です。

void drawText()
{
    //writes the specified text to the screen depending on the room
}
void playGame()
{  //This function gets called to play through the whole game
    drawText();
    while(1)
    {
        updateKeys();
        if (newPress()) //New key is pressed
        {
            if (getButtonInt()==BATHROOM_INT)
                bathroom(); //it will launch the basement function as a subroutine
            else //Bedroom
                bedroom(); //it will launch the bathroom function as a subroutine
            drawText();
        }
        //When returning from room function, the 
    }
}

この方法の多くの欠点のいくつかは次のとおりです。

  • すべてを常に更新する必要があるため、マルチプレイヤーを実装することはほぼ不可能です
  • 他の機能が更新されることはほぼ不可能 (フレーム/タイム トラッカーなど)
  • ルーム間を移動するオプションを追加すると、再帰が発生し、メモリ オーバーフローが発生する可能性があります

では、質問:これらの欠点を解決する最良の代替手段は何ですか?

はい、switch ステートメント内にすべてを記述し、playGame 関数の外側の変数で switch ステートメント内の場所を追跡することはできますが、その構造は読み取り可能または論理的ではないようです。

4

1 に答える 1

4

うーん、ステートマシンの匂いがします。あなたの状態は場所と呼ばれます。ドアは他の状態への遷移です。

ステート マシンを実装するには 、 switch& caseifラダー、ルックアップ テーブル (またはmaps) など、さまざまな方法があります。

最初の 1 つまたは 2 つの状態を展開するために、switchorifステートメントを使用します。ただし、2 番目の状態の後、通常はルックアップ テーブルに変換します。

ルックアップ テーブルを使用すると、状態ロジックや私がルックアップ エンジンと呼んでいるものを変更せずに、状態を追加できます。

ルックアップ テーブルは次のようになります。

+--------+--------------+--------------+-----+  
|Present | state for    | state for    | ... |  
| state  | transition 1 | transition 2 | ... |  
+--------+--------------+--------------+-----+  

1 つの実装は、構造体の定数配列です。現在の状態 ID を検索し、遷移 ID に応じて次の状態値を引き出します。単純。

さらに楽しくするために、「遷移の状態」ボックス (フィールド) を関数へのポインターまたは参照に置き換えることができます。これにより、トランジションに応じて関数を実行できます。

これを拡張すると、「ゲーム レベル」ごとに 1 つの状態テーブルなど、状態テーブルのコンテナーを持つことができます。

視点を実行指向からデータ駆動型に変えてみてください。ゲームテーブルのほとんどを駆動して、小さな「エンジン」を持つことができるかもしれません。うーん、これはストーリーボードを使用して拡張できそうです...

編集 1: マップとデータベース
のようなものを使用する場合は、ルックアップ テーブルをペアstd::mapに分割する必要があります。{key, value}1つのキーは現在の状態のように見えます。値はトランジション ボックスのように見えます。ちょっと待って、 ...

トランジションは、関係または関連付けのコンテナーのように見えます。遷移 IDは、状態 ID または状態関数に関連付けられています。別のテーブルまたはマップのようなにおいがします。

このすべてのデータは、多くの場合、データベースと呼ばれます。databasea を使用して状態を含めることができます。うわー、それはあなたのためにストレージとデータ型を処理します.

しかし、私は脱線します。一歩ずつ...

于 2014-09-12T23:51:22.013 に答える