0

私は現在マルチプレイヤー システムを構築していますが、多くのオブジェクト間でデータの多くの小さなバリエーションを管理する方法について設計上の質問があります。

例から始めましょう。A、B、C の 3 人のプレイヤーがいるとします。A は B と友好的であり、C とは敵です。つまり、A が敵であることを C に示し、A が友好的であることを B に示す必要があります。現在、同じデータの 2 つの異なる (しかし小さい) バリエーションがあります。これはほんの一例です。別のバリエーションとして、A がステルス状態になり、B は A を見ることができますが、C は A を見ることができません。前述のとおり、これらは単なる例です。各オブジェクト間で主に変化する、より多くのさまざまなプレイヤー データの状態を持つことが計画されています。

これをどのように管理すればよいですか?大量の if ブロック、または私が見落としている明白な設計パターンはありますか? これはマルチプレイヤー ゲームであるため、3 人以上のプレイヤー/オブジェクトまたは状態が存在します。

4

3 に答える 3

1

オブジェクト指向プログラミングの概念に苦労している場合は、オブジェクト指向プログラミングをしっかりと把握することをお勧めします。保存する必要がある状態データの明確なモデルがないようです。ゲームの「状態」を図示してみてください。特定の時点でゲーム内に存在するオブジェクトと、それらがどのように編成されているかについての最小限のスナップショットと考えてください。player.canSee(otherPlayer) のようなものは計算でき、必ずしも保存する必要はありません。

おそらくデータベースをまったく使用することはないでしょうが、リレーショナル データベースの設計を読んだり練習したりすることは役に立つかもしれません。リレーショナル デザインの概念は、考えを整理し、明確で一貫した方法で情報を保存するのに役立ちます。

于 2009-12-28T21:58:51.613 に答える
1

あなたの問題は、状態を、人々が見ることができるすべての順列であると考えることです。一般に、状態を状況の事実として考え、必要に応じてそれらの事実の個々のビューを計算する必要があります。

// pseudocode - make it properly object oriented for best results
struct player
{
    int teamNumber;
    bool hidden;
};

bool is_friend(player other_guy)
{
    return me.teamNumber == other_guy.teamNumber;
}

bool can_see(player other_guy)
{
    return (is_friend(other_guy) || !other_guy.hidden);
}

あるプレイヤー (例: A) が別のプレイヤー (例: B) を見ることができない場合、状況が変わるまでプレイヤー B の情報をプレイヤー A に送信しないでください。

于 2009-12-31T23:49:54.560 に答える
1

さて、プレイヤーのクラスで、その中には友達のリストと敵のリストがあります。

これは非常に単純な質問か、非常に複雑な質問です。本当に複雑な場合は、続行するのに十分な情報が得られていません。

于 2009-12-28T21:25:23.897 に答える