
2026/10/20 1:06
NetHack の gnome ミーンでのダンジョン生成
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
NetHack は、ノームの地下坑道(Gnomish Mines)レベルに対して独自の細胞自动機システムを実装しており、正方形の部屋の中に有機的な洞窟を生成します。このプロセスは、グリッドの 40% をランダムに床として指定することから始まり、セルは床または岩の 2 つの状態のみを持ちます。直近の 8 方向隣接タイル数を基準とした細胞自动機処理を 4 パス適用します。第 1 パスはバッファなし(in-place で更新)とし、タイルを集約して広大な開口部を形成する一方、第 2–4 パスはバッファ付きの更新を使用します。特に第 2 パスは、正確に 5 つの床隣接セルを持つセルを岩に変換し、遷移を滑らかにします。第 3 および第 4 パスは侵食ルーチンとして機能し、条件に応じて角を滑らかにしたり、小さな孤立した島を削除したりします(例:6 つから 8 つの岩隣接セルがある場合など)。この 4 パスの处理后、離断した洞窟セクションは追加の廊下を追加することによって修復されます。この手続き的アプローチは、ゲーム特有の正方形部屋レイアウトとは対照的に、有機的な地下鍾乳洞のような独特な雰囲気を生み出し、多様な探検を可能にしながら構造の完全性を保つことができます。
本文
NetHack のセルラ・オータマトによる洞窟生成仕組み
NetHack のレベル生成において、セルラ・オータマトを採用したノーマン(グノー)の鉱山は、正方形の部屋を主としながらも、有機的な洞窟のような質感を実現しています。
基本的な処理フロー
- 初期化: ランダムに 40% のセル を「床」として選択し残りを岩とする
- 処理実行: セルラ・オータマトのルールを合計 4 パス 適用する
- 補完: 繋がりのない洞窟部分を後続の回廊生成で補う
セルラ・オータマトの詳細ルール
各セルは「床」か「岩」の 2 状態のみを持ち、処理では周囲 8 の隣接セルにある「床」の数(カウント値)に基づいて状態変化を決定する。
| パス | カウント値 (隣接床) | 状態遷移 |
|---|---|---|
| パス 1 | 0〜2 | 岩 へ変化 |
| 3〜4 | 変化なし | |
| 5〜8 | 床 へ変化 | |
| パス 2 | 0〜4 | 変化なし |
| 5 | 岩 へ変化 | |
| 6〜8 | 変化なし | |
| パス 3 | 0〜2 | 岩 へ変化 |
| 3〜8 | 変化なし | |
| パス 4 | パス 3 と同様 | 侵食処理 |
更新方式の違いと役割
パス 1:クラスタリング(非バッファ更新)
- 更新方式: 非バッファ(in-place)更新
各セルの更新は、次のセルへ移る前に即座に反映される。 - 効果:
- ランダム配置されたセルをより広範囲なエリアへと集約させる。
- 床の近傍に新たな床、岩の近傍に新たな岩を生み出し、クラスタリングを起こす。
- 理由:
- バッファ更新如果使用すると、「岩→床」に変化するセルと「床→岩」に変化するセルが隣り合う際、フラップ・フラップ現象(不自然な入れ替わり)が発生してしまうため。
パス 2:不明確な意図
- ルール: 隣接する床が正確に 5 つ の場合のみ、「岩」へ変化させる。
- 現状の理解: この処理の具体的な意図はまだ解明されていない。
パス 3 とパス 4:侵食(エロージョン)
- 更新方式: バッファ更新
すべてのセルに対して新しい値を計算後、グリッド全体を同時に更新する。 - ルール: 周囲の岩が 6〜8 つ の場合、「床」を「岩」へ変化させる(カウント 0〜5 の場合は変化なし)。
- 効果:
- 洞窟の角を滑らかにする。
- 小さな島のような孤立した領域を削除し、全体を統合する。