1

私は現在、Java ゲームの設計に取り組んでおり、クラス間の循環依存の問題に遭遇しました。これが私の現在の問題の(簡略化された)例です:

class Game
class Player
class Ability

ゲームにはプレイヤーがいて、プレイヤーは能力 (呪文や攻撃など) を持っています。アビリティには次のようなメソッドがあります。

public void perform(Player source, Game game);

問題は、そのアクションを実行するために、アビリティがゲーム (およびプレイヤー/ゲーム オブジェクト) の知識を必要とすることです。これを解決する方法はありますか?


更新: 返信ありがとうございます。アビリティは実際にはプレイヤーが所有すべきではないことがわかりました。プレイヤーとアビリティをリンクする方法がわかりません。たとえば、各クリーチャーが使用できる能力を持っているポケモンのようなゲームを考えてみましょう。または、各カードがゲームのあらゆる部分に影響を与える能力を持つことができる収集可能なカードゲームを利用してください. アビリティがプレイヤーによって直接所有されていない場合でも、どのプレイヤー (またはアビリティを使用するオブジェクト) がどのアビリティを使用できるかを判断する何らかの方法が必要です。

4

4 に答える 4

3

Ability クラスは、それがゲーム内にあることを知る必要はありません。ルールを表し、ゲームを構成するエンジンまたは環境クラスが必要です。これにより、プリメイド プレーヤーを無限に多くのゲーム エンジンにドロップできます。たとえば、LowGravityEngine と QuantumEngine を使用できます。これらのエンジンを使用すると、モデル (プレーヤー) をコントローラー (エンジンまたはゲーム) から分離するという点で、より優れた設計が可能になります。

エンジンがゲームをリファクタリングしたくない場合は、ゲームを取得するアビリティの代わりにプレイヤー オブジェクトを取得します。意味がありません。たとえば、モノポリーでは、犬の駒は不動産の購入方法を知りません。

于 2013-09-01T18:44:55.647 に答える
0

これを設計する 1 つの方法は、親子の依存関係を実装することです。

たとえば、あなたのPlayer分野では:

private Game parent; 

次に、Playerコンストラクターで次のようにします。

public Player(Game parent) {
    this.parent = parent;
}

そしてもちろん、次のようなパブリック メソッド:

public final Game getParent() {
    return parent;
}

次にperform、インスタンスのみPlayerを引数として呼び出しGame、メソッドの本体内のインスタンス フィールドをクエリできます。

Gameクラスが静的データ (「ルール」など) のみを提供する場合は、インスタンスClassの代わりに引数として渡すこともできます。Game

ただし、これは無数にある解決策の 1 つです。

Woot4Moo のソリューションは、私にとって完全に理にかなっています。

于 2013-09-01T18:45:08.030 に答える