解決すべき問題:すべての部屋が接続されているタイルベースのゲームのランダムな2Dダンジョンマップを生成します。
現在のソリューションよりも優れたソリューションを探しています。
私の現在の解決策は、2つのアルゴリズムを実行することです。最初の部屋ではダンジョンを生成します。2番目は、すべての部屋が接続されていることを確認します。私は他の解決策が存在するかもしれないと思っています。より高速および/または簡単など。速度は実際には問題ではありませんが、実際のコストをかけずに速度を上げることができれば、それは良いことです。さらに重要なことは、私と他の読者は、問題にアプローチして解決するさまざまな方法を学ぶことができるということです。
以下は私の現在の実装です。現在、部屋には出口がないか、2、3、または4方向に出口があります。
ダンジョンルームの生成
セットアップ:現在の部屋を左上の部屋に設定します。
- 部屋の有効な部屋タイプを取得します(有効な部屋タイプとは、ダンジョンの出口がなく、上の部屋と左の部屋の出口に一致する出口があるタイプです。以下の手順2のために残されました)。
- 部屋を置いて、x座標を1ステップ進めます。X座標がダンジョンの幅を超える場合、X座標を0に設定し、Y座標を1ステップ進めます。y座標がダンジョンの高さを超えている場合、完了です。
- #1から繰り返します。
次に、すべての部屋が接続されているかどうかを確認します。すべてが接続されていない場合は、2番目のアルゴリズムを実行します。接続されるまで。
すべての部屋が接続されているかどうかを確認する
セットアップ:パスを表す整数の2Dマップを作成し、エントリを「未処理」(まだ通過していない)-1に初期化します。現在のパスを追跡する開始パスインデックス整数を1に設定します。チェックする部屋のスタックに追加することにより、現在の部屋を左上の部屋に設定します。
- スタックにチェックするルームが含まれる場合、ポップしてルームのパスインデックスを現在のパスインデックスに設定します。スタックに部屋が含まれていない場合は、パスインデックスを増やし、まだ処理されていない部屋を取得するまで、列ごと、行ごとに進めて部屋を取得してください。部屋が見つからない場合は、完了です。
- 部屋の左側に出口があるかどうかを確認します。まだそこにない場合、スタックに左の部屋を追加している場合。
- 下方向、右方向、および上方向について手順2を繰り返します(部屋を上方向から時計回りに移動するスタックを使用しているため)。
- 手順1から繰り返します。
- パスインデックスのカウントが1より大きい場合、接続されていない部屋があります。
接続されていない部屋がある場合は、パスインデックスで部屋をグループ化し、最大のパスのインデックスを取得し、他のすべての部屋をそれらの部屋に接続します。これは進行中の作業ですが、私の(現在の、「強烈な」)計画は、部屋グループ(最初の部屋を除く)の各部屋を通過して、biggeset部屋グループへの水平または垂直パスがあるかどうかを確認することです。その場合、間に部屋を挿入/更新することにより、そこに水平/垂直パスを作成します。すすぎ、繰り返します。glyい、はい、しかしそれは視覚的なパターンの点で目立たないものなので、その意味で機能します。