ランダムダンジョン生成テスト(for RDGC 0.2)
RDGC - Ruby(Random) Dungeon Game Core 0.1をリリースして以来、
0.2に向けてRSpecとGitを駆使しつつリファクタリングを進めていたのですが、
ついにダンジョン生成部分のリファクタリングが(ほぼ)完了しまして
まだRSpecでカバーできてない部分があるので、
公開にはもうちょっと*1 かかりますが、
とりあえず動作サンプルを作ってみました
リファクタリングのついでに、
Ver0.2向けにチケットを発行していた、
「パラメータ指定生成」を実装してます
これで問題がなさそうなら、この生成ロジックの部分だけ、
「rdgc-dm」というgemとしてリリースする予定です
(ロジック部分だけなので、DXRubyに依存せず、どのOSでも使えます)
具体的な生成ロジックは後日書くつもりですが、
パラメータ指定のために大雑把な説明をしておくと・・・
- 指定された縦横サイズのBlockを生成
- Blockを縦か横に分割
- 分割された2つのBlockをまた分割(ただし、両方とは限らない)
- これを再帰的に繰り返す
- 分割されたBlockにRoomか交差点を作る
- 各Blockをできるだけ道でつなぐ
- どうしてもつながらなかったBlockは破棄
- 最後にBlockの配列から一つのBoardを生成
- 描画
・・・こんな感じです
デバッグモードにチェックを入れてもらうと、
Blockがどう並んでるかなんとなくわかると思います
この課程でできる限り各パラメータを考慮はしますが、
絶対に要求を満たせるとは限りません
(例:最小Room数が6なのに、生成されたBlockが5)
パラメータの大雑把な優先順位を書いておくと・・・
- min_block_size
- max_block_count
- max_depth
- min_room_count
- max_room_count
- cross_road_ratio
- max_room_size
- min_room_size
・・・こんな感じ・・・だと思いますΣ(・ω・ノ)ノ
とりあえず、いろいろパラメータを指定して試してみて、
変だと思ったらコメントをいただければ幸いです
これってバグじゃないの?(随時更新)
max_room_count=1なのに部屋が2個できる
min_room_countのデフォルト値が2なので、
上記の優先順位に従い、部屋が2個できます
(デフォルトが2個なのは、スタート地点とゴール地点を作るためです)
明示的にmin_room_count=1をあわせて指定すると、
一つだけできるはずです
道に(部屋でない)行き止まりができる
仕様です
それで片付けるのもあれなので補足すると、
つなげられそうな交差点を、できるだけつなぐようにしているものの、
周囲にもうBlockがない等、どうしようもない場合に行き止まりができます
あまりたくさんできると問題ですが、
たまにあるくらいはゲームとしていいんじゃないかと
最大分割深度(max_depth)って何?
前述の通り、このロジックは最初のBlockを起点にして、
再帰的な分割をしようとします
この分割回数の最大値がmax_depthの指定で、
これを小さくすることで、小さいBlockだらけになるのを防げます
max_depth=nの時、作られるBlockの最大値は2^nです
イベントやBOSS用に、広い部屋が1つだけ欲しい
min_room_sizeをx/y以上にしたうえで、
min_block_sizeをx/y以上にするか、max_block_count=1を指定してください
全体が1Blockになり、限界までRoomを大きくしようとします
前のテストスクリプトにあった階段がない
http://www.parrot-studio.com/cgi-bin/d_test/tester.rb
※そのうち消すのでリンク無し
「階段」は静的に存在するものではなく、
複数あったり、後から追加されたりしてもいいものだからです*2
RDGCではこれを「Article」というクラス*3で表現しますが、
これはrdgc-dmの範囲ではない(=リファクタリング中)ので、
今回のテストからは除外してます
できあがったBoardのサイズが、指定サイズより小さいことがある
先ほどのロジックにあったように、全体を指定サイズで作った後、
無駄なBlockをクリアし、残ったBlockでBoardクラスのオブジェクトを作っています
(デバッグモードなのに壁として表示される部分がクリアされたBlockの座標)
Boardは渡されたBlockの配列から改めて自己の範囲を定義し直すため、
サイズが小さくなることがあります
(詳細は近日公開のソースにて)