地図/気まぐれ/プロシージャル生成

CAで洞窟を彫る

ランダムに壁と床を撒いただけの盤面は砂嵐で、塊も通路もない。各セルで周り8マスの壁数を数えて、多数派に飲ませるルールを置く。周りに壁が一定数以上あれば自分も壁、なければ床。下は最初のランダム埋めで、外周だけ壁に固定し、内側は確率 0.46 で壁を立てている。

セルラーオートマトンで洞窟を彫るのは、生成アートの多数決平滑化(majority smoothing)をそのまま地形に流用したもの。各セルの次の状態は周り8マス(Moore 近傍)の壁数だけで決まる。壁が5以上で壁、自分がすでに壁なら4以上で壁、という閾値が、ばらけた点を多数派の塊へ均し、孤立点を消して連結した空洞を残す。最初の壁率と反復回数の二つで洞窟の開け具合が変わる。

壁が一面に散って、まだ塊になっていない。ここに多数決を一回かけると、周りが壁だらけのセルは壁へ寄り、まばらなセルは床へ落ちる。walls が周り8マスの壁数で、盤外は壁とみなす。読む面 grid と書く面 next を分けて、一世代ぶん全マスを更新してから入れ替える。

更新中に元の値を読み続けるため、読む面と書く面を別の配列に分ける。書きながら同じ配列を読むと、計算済みの隣のセルが次のセルの判定に混ざって結果が崩れる。読みと書きを分ける構え。ダブルバッファ(二重バッファ)。一世代を全マス計算し終えてから二枚を入れ替える。

世代が進むたびに、ばらけた壁が島へ集まり、角が丸まって連結した空洞が残る。0回だと砂嵐のまま、2回で島が見えはじめ、5、6回で境界が落ち着く。hold のあいだ最終形を見せてから盤面を撒き直して、同じ均しをまた回している。閾値の 54 を上げると壁が痩せて空洞が広がり、最初の壁率 0.46 を上げると洞窟が狭く入り組む。ルールを差し替えるだけで、生成アートの平滑化がダンジョンの掘削になる。