-- / --
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

03 / 05
Wed

ワイエルシュトラス (Weierstrass) のカタカナ表記のブレが気になる Ziphil です。

いろいろあって、 自然物っぽいダンジョンの生成アルゴリズムが完成しました。 先日アルゴリズムの考察を投稿しましたが、 その中のどれとも違う方法で生成してます。 考察とは何だったのか・・・。

アルゴリズムの解説の前に、 完成品を見てもらいましょうか。 こんな感じの洞窟ができます。

773_製作過程A

ぐちゃぐちゃしてますね。 ちょっと荒れすぎな感じもしますが、 これ以上は私の力では無理でした。 全く違うアルゴリズムを考案する必要があるかもしれないですね。

では、 アルゴリズムの解説です。 ちょっと私のコードが煩雑になってしまったので、 今回はコードなしで、 概要だけ説明しますね。

まず、 2 点間を結ぶ通路を作るアルゴリズムを説明します。 この 2 点のうち、 片方を 「スタート地点」 と呼び、 もう片方を 「ゴール地点」 と呼ぶことにします。

マップのそれぞれのマスに、 状態とスコアの 2 つのデータをもたせます。 状態は 「open」 か 「closed」 のどちらかで、 スコアは 5 以下の整数とします。 スコアをもたないマスもあるとします。 初期状態は、 全て closed でスコアなしの状態です。

以下、 参考として図を乗せますが、 open なら明るい色、 closed なら暗い色でマス目を塗ることにしています。 マスの中の数字は、 そのマスのスコアを意味します。 また、 スタート地点を赤の枠で、 ゴール地点を緑の枠で示します。 したがって、 初期状態は以下のようになります。

773_ランダムダンジョン1

スタート地点を、 状態 open, スコア 5 とします。

773_ランダムダンジョン2

マップの中から状態が open であるマスを適当に選び出します。 そのマスの上下左右にあり、 スコアをまだもっていないマスをいくつか選び、 状態を open とします。 全方向を open でも良いですし、 1 個も open にしなくても構いません。 新たに open にしたマスのスコアは、 最初に選んだマスに比べてゴール地点に近づいたなら同じスコア、 遠ざかったなら 2~4 ほど減少させます。 その後、 最初に選んだマスの状態を closed にします。

773_ランダムダンジョン3

上の処理を繰り返します。 なお、 処理の途中でスコアが 0 以下になってしまったマスは、 強制的に状態を closed にします。 ゴール地点にスコアが与えられた時点で、 繰り返しを終了します。

さて、 運が悪いと、 ゴール地点にスコアが与えられる前に、 open のマスがなくなってしまう場合があります。 その場合は、 スコアが与えられているマスのうち、 ゴール地点から最も近いマスの 1 つを open にして、 繰り返しを続行します。

最終的に、 ゴール地点にスコアが与えられると、 マップ全体はこんな感じになります。

773_ランダムダンジョン4

最後に、 スコアが 0 以下のマスとスコアをもっていないマスを壁とし、 スコアが 1 以上のマスを通過可能領域とすれば、 2 点間を結ぶ通路が完成します。

773_ランダムダンジョン5

さて、 後は、 マップ全体に何ヶ所かチェックポイントをとり、 そのチェックポイント同士を結ぶ通路を、 上のアルゴリズムを用いて作成すれば、 ダンジョンの完成です。

さて、 このアルゴリズムのパラメータは、 新たに隣接するマスを open にするときの確率と、 ゴール地点から遠ざかったときに減少させるスコアの量の 2 つです。 この 2 つを適当に調整すれば、 それっぽいダンジョンが作れます。

・・・でもやっぱり、 ちょっと形が荒れすぎですよね。 輪郭を滑らかにできるアルゴリズムをまた考えないといけませんね。

スポンサーサイト

comment ×0
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。