2010-11-23 7 views
4

私は現在、プレイヤーが異なる部屋間を移動し、アイテムを持ち上げて使用し、食べ物を食べることができる、単純なコンソールベースのゲームを作成しています。ゲームの現在の状態では、それについてです。私は助けを必要と何プログラムデザインに関するヘルプ

は次のとおりです。

は私のゲームのための良好な「イベント」クラスを作成します。私がそれを働かせたいのは、すべてのアイテムと部屋がイベントに関連付けることができるということです。

私はこれに慣れているので、この種の手順に関連する読書資料、またはの点については、以下の点を考慮して自分のクラスを設定するのが最善の方法この種の問題(クラスを設定する方法を決定することに問題がある)をどのように攻撃するかいくつかのテキスト

  • 出力して、プレイヤーに質問をする:

    私には、例えば、イベントの種類を作成することができるようにしたいです。プレイヤーが正しい答えを出した場合は、何かしてください。

  • テキストを出力し、プレイヤーの在庫からアイテムを取り出して、別の部屋に移動します。そのような責任駆動型設計、凝集やカップリングなどのものがあるので、ゲームの全体のポイントは、良いクラス設計を実践することである

    • :私は何を避けるためにしようとしている

    重要な側面。したがって、私はそれをできるだけシンプルで再利用可能で独立したものにしたいと思っています。

  • アイテムまたは部屋がイベントクラスの特定のメソッドを単に呼び出すように、すべてのイベントをハードコードする必要があります。

私は現時点では考えている何を:私は、例えば、新しいイベントを作成(およびそれらを関連付ける)ことができるように、いくつかのサブクラスの作成

使用: itemObject.setEvent(新イベント(新しい質問( "introText"、 "outroText"、 "correctAnswer")));

詳細情報が必要な場合はお知らせください。 ありがとう!

+0

あなたの質問は、 – jzd

+3

@jzd:公平で、これはかなり詳細な質問だと思います。 – Adamski

+0

@Adamski申し訳ありませんが、私は何とか彼の根本的な質問を持っている3番目の段落を誤解しているように見えます。 – jzd

答えて

2

ゲームプログラミングの宝石の本は素晴らしいです...少し高価ですが。

おそらく関連する記事やGameDev's Article list上の上の2つを見つけることができ、およびEventクラスについてはtheir forums

に埋もれて、いくつかの良いものはおそらくあります、あなたはほぼ確実にサブクラスのいくつかの数(MoveEventと基本クラスをしたいです、InventoryEventなど)。 実際にをハードコーディングしたくない場合は、ゲームをデータファイルで定義する必要があります。部屋、品物、出来事、そしてあなたが後で取り組むもの。物事を定義するために使用するフォーマットは、あなた次第です。私はこれが学習の練習であるため、実践的な体験を与えるものをお勧めします。例えば、あなたが使っていないXMLパーサーです。解析するのに最も効率的なフォーマットではありませんが、これはコンソールゲームです。そのような問題はありません。

イベントサブクラスには、他のイベントを連鎖させることができます。インターフェイスは変更されず、「これをプレイヤーの在庫に追加して持ち出し、ここに移動する」などの操作を行うことができます。

2

入力テキストの解析と出力テキストの生成を基本となるドメインモデルから分離することを検討します。あなたの質問は、プレゼンテーション層として問題のテキスト部分を考えているのに対し、2つを混在させるように見えます。

例えば、あなたのドメインは、次のインタフェースで構成できます。また

public enum Action { HIT, TALK_TO, EAT, USE }; 

public interface GameEntity { 
    /** 
    * Performs the specified action on this GameEntity, passing in zero or 
    * more other GameEntity instances as parameters. 
    */ 
    void applyAction(Action action, GameEntity... params);  
} 

public interface Item extends GameEntity { } 
public interface Person extends GameEntity { } 

を、あなたは、入力文字列を処理し、ドメイン層への呼び出しを結果になるだろうTextParserクラスを定義するか、他のデフォルトを返すことができます回答: "私は理解しません。"例えば、入力されたフレーズ「ドアに使用するキーは、」メソッド呼び出しにつながる:

key.applyAction(Action.USE, door); 
1

私は最近、あなたが記述しているものと同様のものを実装しました。私は、 "Publish"と "Subscribe"メソッドを持つEventManagerクラスを作成しました。システムが起動すると、それはIEventListenerインターフェイスを実装するクラスのためにロードされたすべてのアセンブリ(ライブラリ)をスキャン:

/// <summary> 
/// A class that intends to listen for specific events to be published by an 
/// event manager. 
/// <see cref="EventManager"/> 
/// </summary> 
public interface IEventListener 
{ 
    /// <summary> 
    /// Subscribes to the event types that this listener wishes to listen for. 
    /// </summary> 
    /// <param name="eventManager"></param> 
    void RegisterSubscriptions(EventManager eventManager); 
} 

を...し、それらのそれぞれにRegisterSubscriptionsメソッドを呼び出します。 (どこでも使用されるEventManagerのインスタンスは1つだけです;依存関係注入を使用してシングルトンインスタンスとしてバインドします)

RegisterSubscriptionsは、指定されたクラスが意図する各イベントタイプとハンドラのSubscribeメソッドを呼び出します処理する。 (私は.NETを使用していますので、イベントとハンドラーは少し使いやすくなりますが、匿名サブクラスを使用してJavaで同じことを行うことができます)。

典型的なイベントはRoomEnteredのようなものです。このイベントに関連付けられているルームIDと、おそらく部屋に関するいくつかの他のプロパティが含まれます。ゲームエンジンは、ユーザーがルームに入るとこのイベントをパブリッシュし、そのルームの適切なイベント引数を提供し、EventManagerクラスはそのイベントタイプを購読している各ハンドラーを呼び出す役割を担います。このイベントのハンドラは、 "HandleEnterRoomWithMonsters"とすることができます。これは、部屋にモンスターがあるかどうかを確認し、それに応じてアクションを実行します。

これは全体的に意味がありますか?このアプローチについてご質問がありますか?

2

イベントと言えば、observer patternが気になります。あなたのゲームは、いくつかの状態マシンによって内部的に提示されると考えることができます(Wikipediaでこれを見ることもできます。 1つのステージから別のステージへの各遷移は、そのイベントの登録済みオブザーバーに伝達されることができるイベントである。例を

:LOCK ON

USEキー:キー及びドアの開口部の除去をトリガします。追加のユーザーとのやりとり(ドアの開放)なしで次のイベントに暗黙的に「カスケード」する:追加の出口などを有する部屋をトリガーする

関連する問題