ぱろっと・すたじお

技術メモなどをまったりと / my site : http://parrot-studio.com/

ランダムダンジョン生成テスト(for RDGC 0.2)

RDGC - Ruby(Random) Dungeon Game Core 0.1をリリースして以来、
0.2に向けてRSpecとGitを駆使しつつリファクタリングを進めていたのですが、
ついにダンジョン生成部分のリファクタリングが(ほぼ)完了しまして


まだRSpecでカバーできてない部分があるので、
公開にはもうちょっと*1 かかりますが、
とりあえず動作サンプルを作ってみました


404 Not Found
f:id:parrot_studio:20100325230756j:image


リファクタリングのついでに、
Ver0.2向けにチケットを発行していた、
「パラメータ指定生成」を実装してます


これで問題がなさそうなら、この生成ロジックの部分だけ、
「rdgc-dm」というgemとしてリリースする予定です
(ロジック部分だけなので、DXRubyに依存せず、どのOSでも使えます)


具体的な生成ロジックは後日書くつもりですが、
パラメータ指定のために大雑把な説明をしておくと・・・

  1. 指定された縦横サイズのBlockを生成
  2. Blockを縦か横に分割
  3. 分割された2つのBlockをまた分割(ただし、両方とは限らない)
  4. これを再帰的に繰り返す
  5. 分割されたBlockにRoomか交差点を作る
  6. 各Blockをできるだけ道でつなぐ
  7. どうしてもつながらなかったBlockは破棄
  8. 最後にBlockの配列から一つのBoardを生成
  9. 描画

・・・こんな感じです
デバッグモードにチェックを入れてもらうと、
Blockがどう並んでるかなんとなくわかると思います


この課程でできる限り各パラメータを考慮はしますが、
絶対に要求を満たせるとは限りません
(例:最小Room数が6なのに、生成されたBlockが5)


パラメータの大雑把な優先順位を書いておくと・・・

  1. min_block_size
  2. max_block_count
  3. max_depth
  4. min_room_count
  5. max_room_count
  6. cross_road_ratio
  7. max_room_size
  8. 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の配列から改めて自己の範囲を定義し直すため、
サイズが小さくなることがあります
(詳細は近日公開のソースにて)

*1:とはいえ4月中旬くらいまでにはどうにか・・・したいな(´・ω・`)

*2:実際、"RO"gue0.1のBOSSフロアには下り階段がないため、先に進めません

*3:実際にはArticleを継承したStepクラス