0

私はゲームに取り組んでおり、特定の数値高さマップで閉じたパスを確認する必要があります。サーバーとクライアントは、この高さマップを使用して、移動するための正しい座標を設定します...今、ユーザーが歩いているとき「特別な」タイル、点灯...私の問題は次のとおりです。ユーザーがこれらのタイルを歩いていると、空のタイルが含まれる閉じたパスが作成され、サーバーはこのパスのタイルを自動的に埋める必要があります...

次のようにする必要があります: http://www.youtube.com/watch?v=kAVUNE2NTUQ - 1:32

あちこちで数学を使用する必要があると確信していますが、方法がわかりません...「for」サイクルを実行できますが、長すぎます。問題は、サーバーがサイクルを実行する必要があることですユーザーが歩くたびに...答えてくれてありがとう、誰かが私を助けてくれることを願っています。

PS: 私は C# を使用しています

編集: ユーザーがタイルの上を歩くと、サーバーは自動的に heightmap[X, Y] をユーザーの色を表す整数に置き換えます

4

3 に答える 3

0

「問題は、ユーザーが歩くたびにサーバーがサイクルを実行する必要があることです」...

ゲーム内の各タイルに一意の整数を割り当て、タイル数の配列を持ち、各ステップで配列内のこのタイルをマークすることで、ウォーク タイルの循環をなくすことができます。もちろん、タイルが以前に歩いたことがあるかどうか (つまり、配列内でマークされているかどうか) も確認し、そうであれば、ループ (おそらくゼロ領域) があります。このアプローチには、歩いたタイルなどの循環はありませんが、各ステップのルックアップは 1 回だけです。

于 2010-09-28T02:49:25.050 に答える
0

左上隅が (0, 0) で右下が (M, N) の長方形のフィールドがあるとします。次に、次の疑似コード フィル アルゴリズムを使用できます。

find the upper and bottom cells of the path (yTop, yBottom)

for (int y = yTop; y != yBottom; ++y)
{
    find leftmost and rightmost path cells (xLeft, xRight) for that y
    bool isInside = true;
    for (int x = xLeft+1; x<xRight; ++x)
    {
        if ((x, y) is path cell)
            isInside = !isInside;
        if (isInside)
            fill(x, y);
    }
}
于 2010-09-28T12:27:49.337 に答える
0

問題は次の 2 つの部分に分けることができます。

  1. パスが閉じられたことを検出します。これを行う 1 つの方法は、パス内の連続したタイル間にリンクを作成することです。ステップを踏むときに、新しい隣人のいずれかが以前に訪れたことがあり、現在の隣人の間でパスをたどることができない場合は、そのパスを閉じたことになります。パス (パスに沿って戻る場合に対処するために、追加のリンクを確立する必要がある場合があります)。これにより、パスのどちら側 (左または右) に内部領域があるかがわかります。方眼紙でこれをいじってみると、はっきりするはずです。これは、各ステップで O(1) です。
  2. 囲まれた領域を埋める。領域内にある 1 つのタイルを見つけたら、その隣のタイル、次にその隣のタイル、というように反復します。領域 n の領域の場合、これは時間的には O(n)、ジオメトリに応じてメモリ内で平均 O(sqrt(n)) になります (最悪でも O(n))。
于 2010-09-28T12:09:56.093 に答える