弾性2次元配列で表される再帰的なダンジョンマップ


8

私は1つの部屋から始めて、それに隣接する新しい部屋をランダムに再帰的に接続することによって、単純なダンジョンマップを再帰的に生成する方法を思いつきました。

マップは、各セルに0〜15の値が含まれる2次元配列として表されます。0は部屋がないことを表し、各方向は北= 1、東= 2、南= 4、西= 8で表されます。

部屋以外の1つの部屋([[0]])から始めて、必要に応じて2D配列を拡張して、生成されたマップに合わせる必要がありました。再帰のようなこのツリーで直面する問題は、マップの左と上に行と列を追加するために配列のシフトを解除する必要がある場合、関数の現在の位置、行と列を調整する必要があることです。 。これにより、別のブランチは他のブランチからの配列インデックスの調整を認識せず、調整された位置が行と列の引数として渡されるため、子関数のみがそれを認識します。

これを行う方法はありますか?再帰の外で行と列のオフセット値を保存しようとしましたが、何らかの理由で機能しませんでした。

回答:


5

2D配列を使用する必要がある理由はありますか、それともハッシュテーブルや他の種類のマップが機能するのでしょうか?その後、x、yインデックスは負の空間に続くだけですが、それは問題ではありません。

メモリやCPUの速度が気になる場合は、1)心配しないでください。ハッシュテーブルは、密な整数のペアなどの点で非常に効率的です。2)ハッシュテーブルにレベルを作成し、それを後処理して最終的なサイズがわかったら、配列を作成します。


したがって、ハッシュ関数はxおよびay引数を受け入れ、これは基本的に1x1、-1x3などのキーを持つ連想配列にマップされますか?

うん。C ++では、std :: pair <int、int>;を使用します。Pythonでは、キーの(x、y)タプルを持つdict。どの言語を使っているかわかりません。

2

Pythonでも同様のことをしています。(または少なくとも弾性部分)。

セルにマッピングする(x、y)タプルの辞書があります。疑似コード:

map = dictionary( (0,0) : cell at (0,0), (1,0) : cell at (1,0) ... (2, 2) : cell at (2,2)
getCell(x,y):
    return map[(x,y)]
    catch error if out of bounds:
         map[(x,y)] = new cell and return

ハッシュテーブルは、このような場合に非常に適しています。


1

最小労力の解決策は、ダンジョンに到達させたい最大サイズ(XとYの範囲)を選択し、その中心に開始点を置き、それ以外での成長を許可しないことです。シフトする必要はありません。もちろん、許容される固定範囲に依存します。


-1

2D配列の代わりにグラフを使用する必要があります。

各部屋はグラフのノードであり、隣接する他の部屋を認識しています。

Room {
    long x;
    long y;
    List adjacentRooms;
}

これにより、マップの大きさを定義する必要がなくなります。

x、y座標はハッシュマップで一意のキーとして使用でき、各部屋にすばやくアクセスできます。新しい部屋を追加しても、近くにある部屋の隣接する部屋のリストにエントリが追加されるだけです。

グラフは、必要に応じて、経路探索アルゴリズムにも最適です。


これはパフォーマンスが低下し、ハッシュテーブルや配列よりもはるかに多くの簿記が必要になります。X、Yハッシュキー有向グラフの両方を持つ部屋にはメリットはありません。

有向グラフだけで部屋にすばやくアクセスするにはどうすればよいですか?X、Yハッシュキーのみでどのようにパス検索を実行しますか?これには、隣接する部屋を決定するための追加のロジックが必要になります。ハッシュキーは実際にはゲームの世界の別の見方です。グラフの処理はより面倒ですが、グラフを使用するアルゴリズムにはメリットがあります。パフォーマンスはゲームの世界の規模に依存します。したがって、これはプロトタイプにする必要があります。反対票のためのTHX。乾杯!
Stephen

パスファインディングでは、X、Yペアのハッシュの使用を妨げるものはありません。後継者状態は後継者状態です。クレイジーグラフを維持するか、ハッシュテーブルでルックアップするかは関係ありません。ただし、ハッシュテーブルの方が高速でメモリ使用量が少ない点が異なります。

ハッシュキーソリューションはそれほど抽象的ではありません。前に書いたように、パスファインダーは、どの部屋が隣接しているか、ターゲットの部屋までの距離を計算する方法などを知っている必要があります。パスファインディングアルゴリズムには、ゲームの世界に関する知識を入れます。ゲームワールドの設定が変更された場合、たとえば、互いに対角線である部屋からの移動が許可された場合や、3次元が追加された場合、ゲームワールドにアクセスするすべてのアルゴリズムを変更する必要があります。グラフはこれを抽象化します。それについて何もおかしくない。どのソリューションにも常に欠点があります。
Stephen

1
「グラフはこれを抽象化しています。」イテレータ、ジェネレータ、コルーチン、リスト作成メソッドも同様であり、O(n)構造の膨張やビルド時の簿記を必要としません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.