特定のタイル タイプが文字列で表されるタイル ベースの RPG システムがあります (つまり、Grass = "g"、Dirt = "d")。問題は、各タイルに x/y 座標で効率的にアクセスできる方法でマップ (特定の順序で収集されたタイルのグループ) を表す方法がわからないことです。マップを配列形式で表す必要があります:
map[0].coords[x][y] = "g";
それとも他の方法で?
特定のタイル タイプが文字列で表されるタイル ベースの RPG システムがあります (つまり、Grass = "g"、Dirt = "d")。問題は、各タイルに x/y 座標で効率的にアクセスできる方法でマップ (特定の順序で収集されたタイルのグループ) を表す方法がわからないことです。マップを配列形式で表す必要があります:
map[0].coords[x][y] = "g";
それとも他の方法で?
使用している言語によって異なりますが、通常は 2 次元配列が効率的な方法です。
配列内の要素へのアクセスは、他の要素を反復処理することなく、指定された配列インデックスに基づいてメモリ内の特定の要素の位置を計算できるため、通常は高速です。他のデータ構造 (リンクされたリストなど) は、このタイプの検索では非常に遅くなります。
言語に応じて、いくつかのことがあります。
1:可能であれば、地形タイプに定数整数を設定します。定数は、文字列上の整数と同じように、使用するメモリが少なく、参照/取得が高速です。
2:2次元は、おそらくそれを行うための最も効果的な方法です。
例
CONST(INT) GRASS = 1;
CONST(INT) DIRT = 2;
CONST(INT) SNOW = 3;
// assuming map is an array containing objects, and coords is a 2d
// array of said object:
map[0].coords[x,y] = GRASS;
二次元配列でもいいです。
1 次元配列を使用することもできます。ここに私が横たわっているJavaコードのスニペットがあります:
char [] cells = new char[WORLD_WIDTH * WORLD_HEIGHT];
public char get(int x, int y) {
return cells[x + y * WORLD_WIDTH];
}
public void set(int x, int y, char c) {
cells[x + y * WORLD_WIDTH] = c;
}
世界が 10 x 10 のタイルであると仮定すると、最初の行は にcells[0]
、cells[9]
最後の行はcells[90]
にcells[99]
、というようになります。
もちろん、x
およびy
パラメータが有効であることを確認するために追加のチェックを追加することもできます。