編集:あなたがこの巨大な質問を読むのを気にすることができないならば、私は一番下に要約を置きました。
私は現在、コーディングの演習として、C#で作成するテキストアドベンチャーの一種の「フレームワーク」に取り組んでいます。このフレームワークでは、可能なアクションは「Interaction」クラスによって定義されます。
潜在的な「アクション可能な」オブジェクトは、インベントリアイテム(スティック、ガン、ソード)、環境アイテム(壁、ドア、窓)、キャラクター(人、動物)です。これらのそれぞれには、相互作用のリストであるプロパティがあります。現時点では、インタラクションは基本的に「アクション/レスポンス」の名前と値のペアです。「スマッシュウィンドウ」と入力すると、プレーヤーが利用できる可能性のあるすべてのアクション可能なアイテムが調べられ、件名(この場合は「ウィンドウ」)と一致します。次に、アクションが「スマッシュ」であることがわかり、ウィンドウのインタラクションのリスト(環境アイテム)を検索してスマッシュアクションの応答を取得し、コンソールに書き込みます。
これですべて完了ですが、ここで私が立ち往生している点があります。
アクションには、潜在的な相互作用ごとに異なる、潜在的な結果がいくつもあります。これらは:
-おそらく2番目のサブジェクトとの相互作用を調べて、アクションの結果を説明する応答を返します
どちらか -アクションの主題(インベントリアイテム、環境アイテム、またはキャラクター)は、その説明EGを変更します。「パンチウォール」は、壁の説明を変更して壁のへこみを表すことができます。 または -アクションの対象が別のアイテムEGに置き換えられます。「ボトルを壊す」と「ボトル」が「壊れたボトル」に変わるか、「ジョンを殺す」と、ジョンのキャラクターが環境アイテム「ジョンの死体」に置き換えられます。
-先行する変更EGを説明する応答を返します。「ボトルの破片が床に散らばっています。」
-エリアの説明が変更されました。例えば。「スマッシュ電球」を使用すると、部屋の説明が真っ暗な部屋の説明に変わります。
-アイテムは、インベントリまたは環境EGに追加/削除されます。「ボトルを拾う」。これでインベントリにボトルがあり、ボトルは環境から削除されます。
-移動に利用できる方向とそれらがつながる領域が変更されますEG。「鍵でドアのロックを解除する」を使用すると、東に別の部屋に移動できます
-プレイヤーは新しいエリアEGに移動します。「北へ行く」はあなたを別のエリアに連れて行きます。
特定のインタラクションがこれらの結果のどれを呼び出す必要があるかを一般的な方法で何らかの方法で決定し、それらを呼び出す必要があります。アクションは、これらの結果の多く、または1つだけを使用する可能性があります。
たとえば、アイテムがボトルの場合:
「ボトルに水を入れる」は、最初に、ボトルに水を入れたことを示す応答を返します。次に、「ボトル」アイテムを「ボトル入り飲料水」アイテムに置き換えます。これは、応答を返すこととアイテムを置き換えることの2つの結果です。
次に、「窓にボトル入り飲料水を投げる」としましょう。これはもっと複雑です。それは最初に起こった出来事を説明する応答を返します、ボトルと窓は両方とも砕けて、水はいたるところに行きます。ボトルはプレイヤーのインベントリから削除されます。次に、「水のボトル」は「壊れたボトル」に置き換えられ、「窓」は「壊れた窓」に置き換えられます。エリアの説明もこれを反映して変更されます。これは5つの結果であり、応答を返し、在庫からアイテムを削除し、2つのアイテムを置き換え、現在のエリアの説明を更新します。
ご覧のとおり、「インタラクション」ごとに、そのアクションの結果がどうなるかを定義し、アイテム、プレーヤー(インベントリ用)、エリアなどの他のオブジェクトを適切に更新できる一般的な方法が必要です。
ご不明な点がございましたら、お詫び申し上げます。ご不明な点がございましたら、できる限り明確にさせていただきます。
編集:呼び出すためのいくつかのメソッド(およびそれらのパラメーター)を渡すことができるインタラクションのメソッドを定義する方法はありますか?返される最初の応答はデフォルトの必須の結果であり、指定されている場合は追加の応答が存在する可能性があります。
たとえば、上記の例では、最初のインタラクション「水で満たす」の場合、応答(「ボトルに水を入れました」)を返し、「水で満たす」を置き換えるReplaceItemメソッドを呼び出すように指示します。 「ボトル」の件名に「ボトル入り飲料水」を添えます。
2番目のインタラクションでは、応答を返すように指示し(「ボトルが空中を駆け抜けて...」)、アクションの件名でRemoveFromInventoryを呼び出し、ボトルでUpdateStatusを呼び出します(「ボトルが壊されました」)。ウィンドウ(「ウィンドウが壊された」)およびUpdateAreaDescriptionを呼び出して、現在の領域の説明を変更します(「あなたは単一のウィンドウのある部屋に立っており、ガラスが粉々に砕かれています」)。
それは実現可能ですか?考えられるさまざまな相互作用のために、これをできるだけ一般的にしようとしています。
編集2:さらに明確にし、問題を要約しようとする:
私のゲームには、アクション可能なオブジェクト(ボトル、壁、ジョン)があります。各Actionableオブジェクトには、プレーヤーがそれらと対話する方法を説明するインタラクションオブジェクトのリストがあります。現時点では、インタラクションには「Name」プロパティ(「throw」、「hit」、「break」)があり、Response(「Youthrow」)を返します。
私が解決しようとしている問題は、インタラクションが特定のインタラクションごとに異なる他の多くのことも実行する必要があるということです。ガラス瓶を例にとってみましょう。
「ガラス瓶を投げる」
-応答が返されます(「ガラス瓶を投げました。」)
-「瓶」はプレイヤーのインベントリから削除されます。
-変更を反映するために、は新しいものに置き換えられます。(「ボトル」は「壊れたボトル」に置き換えられました)。
-2番目の応答が返されます(「ガラス瓶の破片が床に散らばっています」)。
「窓にガラス瓶を投げる」
-応答が返されます(「窓にガラス瓶を投げました。」)
-オブジェクト「ボトル」は、プレイヤーのインベントリから削除されます。
-オブジェクトは、変更を反映するために新しいオブジェクトに置き換えられます。(「ボトル」は「壊れたボトル」に置き換えられました)。
-2番目のオプションのオブジェクトは、変更を反映するために新しいオブジェクトに置き換えられます。(「ウィンドウ」は「壊れたウィンドウ」に置き換えられました)。
-現在のエリアの「説明」プロパティが更新されます。(「あなたは、壊れた窓が1つある部屋に立っています。」)
インタラクションを作成するときに、サブジェクトのステータスの変更や現在のエリアの説明の変更など、インタラクションが実行する追加のアクションをどのように変更できますか?
上記のアクションの例がさらに必要な場合は、お知らせください。さらにいくつか実行します。