0

私は3D配列を持っています。これは、基本的に100x100として定義された2D配列の9つのチャンクであり、3x3グリッドに並べられます。この3D配列を2D配列に変換したいと思います。

array [9][100][100]をarray[900][900]に変更する必要があります

私がこれについてどうやって行くかについてのアイデアはありますか?

[編集]

それで、私はそれをより扱いやすくするためにカウントを下げるつもりです。array [9][5][5]を使用します。

配列を初期化してファイルに出力すると、以下の答えを使用すると、期待したものが得られません。私がどのように初期化するかを考えると、私が期待し、望んでいるのは、次のようなファイルです。

000001111122222
000001111122222
000001111122222
000001111122222
000001111122222
333334444455555
333334444455555
333334444455555
333334444455555
333334444455555
666667777788888
666667777788888
666667777788888
666667777788888
666667777788888

そこで、値を最初の次元に結び付けました。2D配列の9つの象限が得られます。これが私が望むレイアウトです。したがって、最初の次元は、他の2つの次元を配置する必要がある象限を実際に定義しています。したがって、これのポイントは、各象限2D配列がマップを描画するためのタイルIDを保持することです。プレイヤーは中央(象限4)から開始するので、これを実行したいのですが、象限5と言うと、サーバー(mmo)は、中央の象限から右に移動したことを確認します。より多くのマップデータの右側の象限全体を送信する必要があります。

基本的に、マップデータの新しい2、5、および8象限を送信します。それに応じて3D配列をシフトし(この時点では簡単です。象限全体を移動するだけです)、クライアントで2D配列に変換して、この2Dマップのどのサブ部分を描画する必要があるかを簡単に見つけられるようにします。簡単な計算で、プレーヤーが2D配列にある正確なタイルを見つけることができるからです。これにより、サーバー上で大規模になる可能性のあるストリーミングマップが得られますが、必要なときにクライアントに送信されるのはチャンクのみです。

for (j = 0; j < 5; j++) 
{
        for (k = 0; k < 5; k++) 
        {
            a[0][j][k] = 0;
            a[1][j][k] = 1;
            a[2][j][k] = 2;

            a[3][j][k] = 3;
            a[4][j][k] = 4;
            a[5][j][k] = 5;

            a[6][j][k] = 6;
            a[7][j][k] = 7;
            a[8][j][k] = 8;
        }
}
4

1 に答える 1

1

があれば、任意のn次元配列をm次元配列として表すことができますm <= n; m > 0

タスクは、どこに何があり、どのように到達するかを追跡することです。

あなたの場合、array[9][100][100]2次元配列への変換は次のように行うことができます。

d1 = 0;
d2 = 0;

a = array[9][100][100];
b = array[2][9 * 100 * 100 / 2];

for (unsigned int i(0); i < 9; i++) {
    for (unsigned int j(0); j < 100; j++) {
        for (unsigned int k(0); k < 100; k++) {
            b[d1][d2] = a[i][j][k];
            d2++;
            d1 = (d2 == 9 * 100 * 100 / 2) ? 1 : 0;
            d2 = (d2 == 9 * 100 * 100 / 2) ? 0 : d2;
        }
    }
}

これ以外の場合は、値a[i][j][k]がどこに格納されるかを指定するために提供する必要がある特別なマッピングが必要になりますb[d1][d2]

あなたの答えを考えると、これがあなたが探しているものだと思います:

int d1 = 0;
int d2 = 0;

int a[9][100][100];
int b[300][300];

unsigned int i(0), j(0), k(0);
for (i = 0; i < 9; i++) {

    for (j = 0; j < 100; j++) {

        for (k = 0; k < 100; k++) {
            b[d1 + j][d2 + k] = a[i][j][k];
        }

    }

    d1 = (d1 + j == 300) ? 0 : d1 + j;
    d2 = (d2 + k == 300) ? 0 : d2 + k;

}

よろしく!

于 2012-12-14T00:08:05.180 に答える