四方八方に無限に広がる世界でゲームを作っています。X:50
これは、位置、Y:50
またはX:-50
、にいることができることを意味しますY:-50
。しかし...私は通常のC#リストではそれを実際に行うことはできません...
私が思いついたすべてのアイデアは、複雑すぎて非効率的で機能しないようです...
無限グリッドを実装する最も簡単な方法は、x、y ペアをキーとし、格納するデータを値として持つディクショナリを含むスパース マトリックスを使用することです。グリッドがまばらな場合、これは高速で実装が簡単で、メモリ フレンドリーです。
もう 1 つの方法は、リンクされたグリッド (リンクされたリストに似ていますが、4 つの方向へのポインターを持つ)、またはリンクされたグリッドのオーバーヘッドを削減するためのタイル ベースのアプローチです (タイルは NxN 配列のリンクされたグリッドです)。タイルの実装は非常に複雑ですが、非常に高密度のグリッドの場合、メモリとパフォーマンスの間の適切なトレードオフになります。
しかし、私の個人的なお気に入りのアプローチは、偶奇変換を使用することです。したがって、奇数のインデックスは正であり、偶数のインデックスは負です。仮想インデックスから物理インデックスにp = abs(v * 2) - (v > 0 ? 1 : 0)
変換するには、式を使用し、物理インデックスを仮想インデックスに変換します v = (p % 2 == 1 ? +1 : -1) * ((2*p + 3) / 4)
。この関係が生じるのは、自然数と整数の間に 1 対 1 と 1 対 1 の関係 (全単射) があるから(0 <-> 0), (1 <-> 1), (2 <-> -1), (3 <-> 2), (4 <-> -2), (5 <-> 3), (6 <-> -3), ...
です。このアプローチは高速でシンプルでエレガントですが、中心線から非常に離れたアイテムで非常にまばらなグリッドがある場合、メモリに関してはあまり優れていません。
トン (はい、ビットのトン...) のセルがない限り、辞書を使用できます。これをキーとしてa と組み合わせるとSystem.Drawing.Point
、うまくいきます。
Dictionary<Point,YourGridObject> myMap = new Dictionary<Point,YourGridObject>();
編集:辞書に加えて、各セルは隣接するセルへの参照を持つことができます. その方法を使用して、16 進グリッドに A* 経路探索アルゴリズムを実装しました。
編集 2: たとえば、特定の座標にアクセスする場合は、単純に
var myTile = myMap[new Point(25, -25)];
East
次に、タイルを取得したい場合は、次のことができます
var eastTile = myTile.East;
グリッド オブジェクトはオフセット メソッドを実装することもできるため、次の方法で「西 2、北 5」タイルを取得できます。
var otherTile = myTile.Offset(-2, 5);
コンピュータは無限配列を格納できません。配列には境界が必要です。コードのどこかで、配列の初期化中に特定のサイズを宣言したことを思い出してください。おそらくどこかでサイズを変更しますが、それでも 0.. から.. max までの数値範囲が残ります。
したがって、あなたがすべきことは、そのようなマップでの相対的な配置を可能にする関数を作成することです。したがって、現在のマップ[x、y]を位置として保存します。そして、現在の位置から相対的に加算/減算する関数を使用することで、上に行くことができます。これにより、コードも理解しやすくなります。
ゲームマップではなく数値範囲を扱っている場合は、n 個のポイントのリストまたは 2d 辞書を作成できるベクトルとしましょう。
ここに投稿しています。問題が原因で、人々が間違ったコードを書く可能性があるためです。
また、マップの周りに境界線がある状況で他の人のために追加します (ゲームのシナリオや画像操作で一般的です。データが [-1..width+1] から [0,width+2] のように寸法を記入するだけです)。次に、「for (int x = 1; x < Width+1; x++)」からループします。
I'm not certain if this is more complicated than you want to deal with, but have you considered using polar coordinates instead of cartesian? There are no negative numbers in that coordinate system. I realize that the coversion is difficult at first, but once you wrap your head around it, it becomes second nature.
明らかに負のインデックスを除いて、配列のすべての機能を備えた Dictionary を使用できます。
2 つの異なる方向に展開するために、下に 2 つの List を使用するのはどうですか?