標高+1m

Don't be rational.

ローグライクのマップ生成ちょっと調べた

coffeehackのマップ生成をもうちょっとちゃんとやりたいなと思っていろいろ調べてみたよ。
なんとなくBrogueみたいなマップがいいなあと思ってます。

☝Brogue

さてと。
一個目: セルオートマトンを使うの
http://roguebasin.roguelikedevelopment.org/index.php?title=Cellular_Automata_Method_for_Generating_Random_Cave-Like_Levels

http://pixelenvy.ca/wa/ca_cave.html

マップは、床と壁でできてるものとします。
全セル床で初期化したマップに、セル数の半分くらいの壁をランダムに散らします
□□□□□
□□□□□
□□□□□
□□□□□
□□□□□

□■■□□
□■■■□
■■■□■
□■□■□
□□■■■
そしたら、セルオートマトンの4-5ルールっていうのを適用します。
ライフゲームみたいな感じと思いましょう。
上記2つのページでそれぞれルールが微妙に違うけど、下のページのルールに従います。
マップを走査して、それぞれのセルの周り8セルをみます。

  • 周りの壁セルが3つ以下だったらそのマスは床に、
  • 周りの壁セルが6つ以上だったらそのマスは壁に、
  • 4つか5つだったらそのまま。

□□■□□
□■■■□
□■■□□
□□■■□
□□□□□
これを何度か繰り返して適用して、もしはぐれ部屋ができたら埋めるかつなぐ。
こんなかんじ。
うまく行くと洞窟っぽいマップができるみたい。

(じつはこのスクショはやりかたちょっと間違ってるんだけどコード消しちゃったからしょうがない)


2個目: パーツを用意しておいて、繋げてく方法
http://roguebasin.roguelikedevelopment.org/index.php?title=Dungeon-Building_Algorithm
まずいろんな部屋を作っておきます。
_ - 空セル
# - 壁
・ - 床
~ - 水

####
#・・#
#・・#
#・・#
####

__##__
_#・・#_
#・・・・#
_#・・#_
__##__

##################
#・・・・・・・・・・・・・・・・#
##################

部屋の真ん中に一部屋作ります。
ランダムなセルを選んで、それが壁に隣接した空セルだったら、
ランダムに部屋のタイプを選んで、それを追加できる空きがあったら追加します。
これを繰り返します。

空きがあるかの判定がちょっと面倒くさいので、
マップをクローンして、スタート座標を計算して、そこから実際に埋めて行って空セル以外のマスに突き当たっちゃったらreturnしちゃって、最後までいけたらマップをクローンしたマップで置き換える
みたいにやると楽でした。

けっこういいじゃん??

2個目が気に入ったので2個目を採用しました。
馬鹿正直にランダムなセルを選んでるとかなり無駄が出るので、そこは工夫しないといけない。

coffeehackのコードの該当部分
https://github.com/ympbyc/coffeehack/blob/master/featurelist.coffeehttps://github.com/ympbyc/coffeehack/blob/master/map.coffee