テキストベースのアドベンチャーゲームで部屋とそれに関連するアクションとインベントリを表すにはどうすればよいですか?


8

ゲームの作り方を学んでいます。ユーザーが部屋の間を歩き回り、各部屋のオブジェクトを操作できる単純なテキストベースのゲームを作成しました。しかし、私のアプローチが悪いスパゲッティコードの山につながったような気がします。このようなゲームを構築するための良い方法が何かはわかりません。

私のアプローチは、各部屋のメソッドを備えた1つのクラスと、その部屋で実行できるすべてのオブジェクトと相互作用を持つことでした。たとえば、これは調査の方法です。

public static void Study() 
{
    bool studyexited = false;

    while (!studyexited) {
        string usercommand = Console.ReadLine ();
        usercommand.ToLower ();

        switch (usercommand) {
        case "turn left":
            GameEventText.StudyLeft ();
            break;
        case "turn right":
            GameEventText.StudyRight ();
            break;
        case "go forward":
            Notes firstsetofclues = new Notes ("First Note");
            GameEventText.StudyFront ();
            string firststudycommand = Console.ReadLine ();
            firststudycommand.ToLower ();

            if (firststudycommand == "read note") {
                firstsetofclues.Firstnotereading ();
            }

            Console.WriteLine ("Picking up this note would prove valuable");
            string secondstudycommand = Console.ReadLine ();
            secondstudycommand.ToLower ();

            if (secondstudycommand == "pick up note") {
                if (MainClass.PlayerInventory.AddItem (firstsetofclues)) 
                {
                    Console.WriteLine ("The note has been added to your inventory");
                } else {
                    Console.WriteLine ("Your inventory is full");
                }

                MainClass.PlayerInventory.Inventorydisplay ();
            }
        }
    }
}

これは拡張可能なアプローチだとは思いません。つまり、すべての部屋でこのような関数を実際に作成することはできません。何らかの方法でファイルを使用することは、私が現在行っている「ハードコーディング」を回避するための良い戦略になると思います。しかし、どうすればそれを達成できるのかわかりません。


これは、ゲームループなどのビット(非常に広い)を除いて、実際には一般的なプログラミングトピックの詳細です。しかし、あなたの質問は書かれたように非常に不明確なので、言うのは難しいです。

説明するために最善を尽くしたので、それがどのようにはっきりしていないのか理解できません。多分あなたは私を助けることができますか?
Mohamed Serry 2014年

多くの場合、句読点、大文字、段落間の間隔が不足しているためです。基本的に、ゲーム内の部屋ごとに1つのクラスをハードコーディングする必要を回避する方法を尋ねているように見えます。あれは正しいですか?もしそうなら、私はあなたの質問の編集を手伝うことができます。

ある程度はい。基本的にすべてのゲームプレイをハードコーディングすることは避けたいです。
Mohamed Serry 2014年

回答:


10

ハードコード化された動作の量を軽減するためにファイルを使用するという考えで、あなたは正しい道を進んでいます。ゲームデータをできる限り活用したいと考えています。これは複雑な概念ではなく、まさにそのようなものです。コードから直接ではなく、データを介してゲームの動作を制御します。

データを介して一部のシステムを駆動する方法を決定する際にとるべき良い考え方は、一般性を探すことです。これらのシステムのすべてのインスタンスに共通するものは何ですか?共通点はシステムのプロパティになり、それらのプロパティの値はデータです。たとえば、部屋には通常、説明と出口のリストがあります。また、部屋にあるアイテムのリストである「在庫」がある場合もあります。

考えられる1つのオプションは、プレーンテキストまたはXMLファイル(どちらもC#で解析するのはかなり簡単です)を使用して、部屋のデータとコンテンツを格納することです。

次のようなXML構造化ファイルについて考えてみます。

<room name="Study">
  <description>
  You enter a well-furnished study. A heavy wooden desk sits in one corner, an ugly lamp illuminating its surface.
  </description>
  <exits>
    <exit command="north">Hallway</exit>
  </exits>
  <items>
    <item name="Pen">
  </items>
</room>

この単純な構造は、上記でリストしたものを正確に定義します。対応するRoomクラスには、出口のDescription、のプロパティがList<T>あります(これは他の部屋への参照であり、そこに到達するために使用される "go"コマンドです。上記の例では北に行くと、プレイヤーが廊下に移動します)。List<T>のアイテムもあります。

while各部屋の関数にループを配置するのではなく(Roomとにかくクラスが1つしかないため、これを行うことはできません)、より一般化されたメインループを作成します。

while(!done) {
  Console.WriteLine(currentRoom.Description);
  var command = Command.Parse(Console.ReadLine());
  switch(command.Verb) {
    case "go":
      nextRoom = allRooms[currentRoom.GetExitForDirection(command.Object)];
      if (nextRoom == null) {
        Console.WriteLine("You cannot go that way.");
      }
      else {
        currentRoom = nextRoom;
      }
      break;
    ...
  }
}

ことを注意Command.Parse関数はあなたのためのexcersizeとして残しますが、基本的には、解析、ユーザの入力が必要があり、(参照「動詞/オブジェクト」のペアまたは類似のいくつかの種類を返しているこの質問をそうすることで、キックスタートのために、それは少しあなたの範囲を超えています質問)。上記の例では、動詞は「go」であり、オブジェクトは「north」または「south」などです。

しかし、それ以上に、このループが行っていることは、部屋を一般的な方法で提示することです。毎回、部屋の説明を印刷し、ユーザーの入力を待ちます。ユーザー入力が「他の部屋に行く」である場合、ユーザーが入力した方向に対応する現在の部屋の出口を見つけます。その方向に出口がない場合はそのように言い、そうでない場合は現在の部屋をその新しい部屋に設定します。その後、繰り返します。

このアプローチをさらに洗練することができます(たとえば、上記はすべてのコマンドの後に部屋の説明を印刷します。最初に部屋に入ったときにのみ説明を印刷する方法を見ることができますか?さらに、「look "コマンド?)スケールアウトして、同様の方法でアイテムの処理を含めることもできます。


応援よろしくお願いします。私はこれを試み、できる限り進歩を遂げるように努めます
Mohamed Serry

1

HTMLを知っている場合、部屋はWebページ、出口はリンク、アクションはおそらくアンカー、ゲーム自体はブラウザーと考えることができます。ゲームが管理する必要がある唯一の追加事項は、インベントリとNPCです。これは基本的に、ゲーム内の各アイテムとキャラクターの状態を持つ静的クラスまたは2つです。破壊/敗北。

Joshが説明したのと同様の方法で、純粋なxmlの代わりにhtmlを使用する場合、少なくともナビゲーションが進む限り、ブラウザでデバッグできます。


ジョシュの答えはより技術的に完全で直接関連していますが、このアナロジーはかなり良く、全体的な概念を理解するのに役立つかもしれません
jhocking
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.