[過去ログ] ダンジョン自動生成 (1001レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
190: 04/06/14 16:11 ID:5+/Otxjs(2/2) AAS
そうして、他人のソースを読まずに突き進んできた奴があwqせdrftgyふじこlp;
191: 04/06/14 17:06 ID:rnOPv/om(1) AAS
せっかくだから斬新な自動生成段ジョンを開発しようぜ
192: 04/06/14 19:04 ID:HxZhdP5q(5/19) AAS
ダラダラと別のことしながらローグIIのソース読んでる。
部屋生成について補足。make_level()から呼び出される、make_room()は以下の通り。

画面を3x3に分割して、その分割された領域内に矩形を作ることで部屋にしている。
サイズはランダムで、領域内の左上からの位置もランダム。この時、他の領域には
踏み入らないように計算しているので、部屋の重なりをチェックする必要はない。

必ず9個の部屋があるわけでない。条件によって部屋のあるなしが決められる。
条件は単なるランダムではなく、ある程度の法則性がある。
これはゲームバランス的なものだと思うので詳しい説明は省略。
1/2の確率で縦に3部屋並ぶ構成になる・1/2の確率で3種類の部屋の並びになる、
一つのフロアには、少なくとも3つの部屋が生成される、とか。
省2
193
(1): 04/06/14 19:18 ID:HxZhdP5q(6/19) AAS
おっと、一部読み間違えた。

>部屋の位置やサイズを別に記憶しておく。
サイズではなく、左上の座標と右下の座標っぽい。

あと、条件チェックで部屋がないと判断されても、先に計算した部屋の位置・・・
つまり、小領域内での左上と右下の座標値を保存している。どうやら通路?を
生成する時に利用しているっぽい。
194: ぐぅ ◆Mn5mzn8hAQ 04/06/14 19:40 ID:0lapHs9H(11/19) AAS
だいたいわかったんだが、
わからないのが
ペアの部屋を選定するコード。

add_maze/make_maze。
add_mazeは>>193の「部屋ではなく通路にする」場合の処理で
座標を保存して範囲を限定することで
どこまでも無駄に通路を延ばしてしまうことを避け
るためと読んだ。
月曜日は面白いテレビ番組がなくて退屈である。
195
(2): 04/06/14 19:42 ID:HxZhdP5q(7/19) AAS
部屋を作ったら、次は迷路の作成らしい。通路ではない。

9個の小領域内に、ある条件を満たしたら、迷路を作る。
基点は先の部屋を作成した時に保存した左上の位置から、掘り進む。
1回(1文字)掘るごとに1/3の確率で進行方向を変える。
掘り進む方向+1と、その左右方向(画面の左右ではなく進行方向に対して)、
それから、掘り進む方向+2を調べて、すでに掘った通路があったら迷路作成終了。
掘る範囲は先にランダムに決定した部屋サイズ内なので、小領域を出ることはない。

迷路が生成される条件はゲームバランス的なので詳しい説明は略。
最初の階では絶対に迷路がない。16階以降は階を増やすごとに迷路が作られる確率が高まる。
迷路は1つの階につき1つっぽい。
196: 04/06/14 19:45 ID:HxZhdP5q(8/19) AAS
>>195は、make_maze()の処理内容です。
197
(1): 04/06/14 19:49 ID:HxZhdP5q(9/19) AAS
>>195
また読み違えた。

> 掘る範囲は先にランダムに決定した部屋サイズ内なので、小領域を出ることはない。

掘る範囲は少領域内。
基点が、部屋サイズ内。
198
(1): ぐぅ ◆Mn5mzn8hAQ 04/06/14 19:52 ID:0lapHs9H(12/19) AAS
ははぁなるほど。
するってぇと通路への変更は別のコードか。
199
(1): 04/06/14 19:57 ID:HxZhdP5q(10/19) AAS
>>198
関数名だけみると、通路&ドア作成は、connect_rooms()内っぽいですよ。
200
(3): 04/06/14 20:12 ID:HxZhdP5q(11/19) AAS
迷路を作ったら、hide_boxed_passage()を実行してる。

処理内容は、作った迷路をところどころHIDDEN属性にする。
つまり、先に迷路を掘ってから迷路の一部をHIDDEN化してる。
このルーチンは、迷路だけでなく、通路作成時にも呼び出されてる。

隠し処理は3階以降にしか発生しない。あとはゲームバランス的な条件で。
201: 04/06/14 20:14 ID:HxZhdP5q(12/19) AAS
というわけで、add_mazes()もおしまい。

>>197は間違いで、やっぱり掘る領域は部屋サイズだったけど、まぁいいや。
202: ぐぅ ◆Mn5mzn8hAQ 04/06/14 20:16 ID:0lapHs9H(13/19) AAS
>>199
ああ、通常の部屋同士の通路掘りはそれなんだけど、
229行で部屋でも迷路でもないものははじかれるから
それ以外に部屋を通路にするロジックがあるのではないかと
おもて。

R_CROSSという定数がアヤシイ・・
fill_out_level()とfill_it()がアヤシイ・・
とかおもてました。
最後に調整してるんかな、とか。
でもなんか違う気もするし・・
省2
203
(2): ぐぅ>腹ペコ ◆Mn5mzn8hAQ 04/06/14 20:29 ID:0lapHs9H(14/19) AAS
>>200
ほほぅ。そうなんだ。ソース読むの早いなぁ。

部屋同士を接続するアバウトなしくみの見当ついた。
012
345
678
とわかれているエリアで
ランダムに部屋を選んで、(ここでは仮に0とすると)
1,2,3,6のエリアの部屋に接続に行く。
選んだ部屋が4だったとすると5と7に接続にいく。
省9
204
(1): 04/06/14 21:06 ID:HxZhdP5q(13/19) AAS
連続投稿制限に引っかかって、ふてくされてた。

3x3の領域内に部屋と迷路を作ってから、迷路の部分隠しをしたあとは、
mix_random_rooms()で3x3の小領域の情報を10回ほどシャッフルしてるっぽい。
領域単位での入れ替え。

・・・すでに部屋とか迷路をdungeon[][]内に書き込んでるけど、
そんなことしていいのか?どこか読み違えてるかも。

というわけで、そろそろ通路の処理に入りそうなんだけど、ここからが面倒っすね。
とりあえずアミュレットは26階以降にでるっつーことで。
205
(1): ぐぅ>腹ペコ ◆Mn5mzn8hAQ 04/06/14 21:29 ID:0lapHs9H(15/19) AAS
>>204
そうそう、mix_random_rooms()でしっちゃかめっちゃかと俺も悩んだw
でも冷静によむと、
mix_random_rooms()はrandom_roomsをシャッフルするだけで
肝心のroomsはいじられないので大丈夫だったりしる。
random_roomsはランダムに部屋選ぶのに参照しるだけの配列にゃり。

部屋同士の接続はこれまたアバウトにいうと
部屋の出入り口を向かい合わせにつくって(dirとrevに向きを設定)
通路を延ばして途中で向きかえて座標をあわせて再度通路をのばして
ドッキングしてるだけ
省2
206
(1): 04/06/14 21:53 ID:MkSJwU7k(1) AAS
ソースに 日本語コメントつけてうぷ汁
207: ぐぅ@満腹 ◆Mn5mzn8hAQ 04/06/14 21:59 ID:0lapHs9H(16/19) AAS
>>206
なんかくれるか?
208: 04/06/14 22:10 ID:HxZhdP5q(14/19) AAS
>>205
なるほど、そっちだったか〜。
深読み&変数名勘違いのトラップひっかかってました。
209
(1): ぐぅ@凍結 ◆Mn5mzn8hAQ 04/06/14 22:35 ID:0lapHs9H(17/19) AAS
隣り合っていても部屋と部屋を繋ぐ通路がなかったりしるのは
どのような理屈であろうか。
1-
あと 792 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.025s