0

友人と私はグースバンプススタイルのアドベンチャーゲームを作成しています。このゲームでは、各段階でユーザーに4つの選択肢の潜在的なセットが提示され、ユーザーの選択がストーリーの結果に影響を与えます。

これにはどのデータ構造を使用する必要がありますか?

これが私の主なアイデアです-オブジェクト

ゲームをこれらのカードの実際のアイデアにできるだけ近づけるために、1つの「カード」基本クラスを作成し、他の多くのカードにこれを継承させます-スーパークラスにはStringx5(x1story x4choiceStories)intx5(x1CardIDNumber x4CardIDChoices)が含まれます。

これにより、すでに持っている素材を使ってオブジェクトを簡単に送り出すことができ、ユーザーが選択するためのすべての処理を制御し、画面に情報を表示するシステムクラスができます。また、システムが整っていて、基本カードクラスがあれば、将来的にはさまざまなストーリーが可能になります。これを可能な限り再利用可能にし、可能な限り少ないコードを記述しようとしています(私は1000を超えるifステートメントを記述していません)。

私には明らかではないことの1つ(そして私が答えを見つけることができないという理由でこの質問を投稿している実際の理由):継承は、類似しているがわずかな違いがある他のクラス、たとえばマネージャーと従業員、私の考えを完全に間違って、大量のメモリを浪費していますか?

私は以下を調べました:

  • ハッシュテーブル:例は電話帳指向のようで、私のニーズには合わないと思います
  • ストーリータイプを定義するための抽象化:これも私のニーズに合わないようです
4

2 に答える 2

1

カードはまったく同じであるため、実際に継承する必要はありません。カードのデータだけが変更されます。他のすべてのカードとは異なる動作をする必要がある特別なカードがある場合は、継承を使用します。

この擬似コードのようなものであなたがやりたいことをすることができます:

class Card {
    Card getChoice(int i); // returns choices[i]
    string storyText;
    Card[] choices; // Use an stl collection rather than an array for ease of addition.
}

基本的に、他のすべてのカードにリンクするように各カードを作成します(ここでのトリックは、正しい順序でカードを作成することを確認することです-簡単な解決策:選択肢なしでカードを作成し、後で方法を使用してさまざまな選択肢を追加しaddChoice(Card)ます。

あなたのGameクラスは最初のカード(基本的にはすべてのカードに対する木の頭)から始まり、次のようなことをします。

Card runCard(Card card)
{
    Card nextCard = null;
    showStoryText(card);
    // Display a line for each choice in the card and get the user's response.
    // Convert the response to the correct index.
    int selection = promptForAction(card);
    if (selection >= 0 && selection < card.numChoices()) {
        nextCard = card.getChoice(selection);
    }
    return nextCard;
}

void run()
{
    Card card = firstCard;
    while(card != null) {
        card = runCard(card);
    }
}
于 2012-07-12T22:29:41.980 に答える
-1

これはそれほど悪くないはずです。基本的に、ツリー構造が必要です。

あなたのメインクラスは次のようになります(c ++の知識が不足していることを許してください)

class Node {

   Node option1;
   Node option2;
   Node option3;
   Node option4;   
}

したがって、Nodeインスタンスは。の他のインスタンスを指すことができますNode

ある種のノードインスタンスのコレクションを用意する方がおそらく良いでしょう。そうすれば、必要な数だけ持つことができます。ノードに、それがどのオプション(1、2など)であるかを示すフィールドを追加できます。

他に必要なのは、最初のノードへの参照だけです。

于 2012-07-12T22:29:11.377 に答える