[過去ログ] ダンジョン自動生成 (1001レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
180(1): 04/06/14 11:25 ID:HxZhdP5q(1/19) AAS
思っていたより厄介なソースだなぁ、コメント少ないし。
get_rand(x, y);
xからyまでの範囲の乱数値を得る
例)
get_rand(5, 2);
5から7までの間の乱数値
181: 04/06/14 11:26 ID:HxZhdP5q(2/19) AAS
coin_toss();
0か1の値をランダムに返す
185(2): 04/06/14 13:08 ID:HxZhdP5q(3/19) AAS
>>183
まだ読みかけだから間違っているかもしれないけど補足すると・・・
部屋の最大数は9で、80x24の空間をを9個に分割して
部屋を配置しているっぽい。
例外はBIG_ROOM。空間内に一部屋だけという状態。部屋のサイズは画面内でランダム。
これはゲーム中、いずれかの階に一度だけ かつ 1/100の確率で出現する。
186: 04/06/14 13:09 ID:HxZhdP5q(4/19) AAS
>>185
あ、0lapHs9H氏の書き込みみると、9個じゃなくて8個なのかな。
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
おっと、一部読み間違えた。
>部屋の位置やサイズを別に記憶しておく。
サイズではなく、左上の座標と右下の座標っぽい。
あと、条件チェックで部屋がないと判断されても、先に計算した部屋の位置・・・
つまり、小領域内での左上と右下の座標値を保存している。どうやら通路?を
生成する時に利用しているっぽい。
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
また読み違えた。
> 掘る範囲は先にランダムに決定した部屋サイズ内なので、小領域を出ることはない。
掘る範囲は少領域内。
基点が、部屋サイズ内。
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は間違いで、やっぱり掘る領域は部屋サイズだったけど、まぁいいや。
204(1): 04/06/14 21:06 ID:HxZhdP5q(13/19) AAS
連続投稿制限に引っかかって、ふてくされてた。
3x3の領域内に部屋と迷路を作ってから、迷路の部分隠しをしたあとは、
mix_random_rooms()で3x3の小領域の情報を10回ほどシャッフルしてるっぽい。
領域単位での入れ替え。
・・・すでに部屋とか迷路をdungeon[][]内に書き込んでるけど、
そんなことしていいのか?どこか読み違えてるかも。
というわけで、そろそろ通路の処理に入りそうなんだけど、ここからが面倒っすね。
とりあえずアミュレットは26階以降にでるっつーことで。
208: 04/06/14 22:10 ID:HxZhdP5q(14/19) AAS
>>205
なるほど、そっちだったか〜。
深読み&変数名勘違いのトラップひっかかってました。
210: 04/06/14 23:18 ID:HxZhdP5q(15/19) AAS
>>200の続き。
部屋と部屋をつなぐ処理・・・は>>203ですが、ちょっと補足。
1つの小領域につき1度、右とその右、下とその下の4箇所の
小領域(にある部屋)に対して通路を作成する。
connect_rooms();
まず、向かい合わせになっているそれぞれの部屋の壁に対して、
ランダムな位置に扉を作成する。そこから通路を延ばす。
draw_simple_passage();
通路は2回曲がるように作成される。スタート地点の扉から
ランダムな長さまで直線をひいて、進行方向を変えて、そこからゴールの扉の
省4
211: 04/06/14 23:28 ID:HxZhdP5q(16/19) AAS
通路を作成したら、12%の確率で通路の一部を隠す。
迷路作成時に呼び出した、hide_boxed_passage()と同じ。
そうそう、小領域をまたぐ場合...つまり、>>200の図でいうと、0から2とか、
0から6へ通路を作成した場合には、その中間の小領域(1 or 3)には、
R_CROSSという部屋扱いになるけど・・・これが何を意味するのか、今はわからない。
もちろん、1と3に部屋があったら、通路は作成されない。
あとは、is_all_connected()とfill_out_level()を読んだらオシマイ。
ナゾというか、勘違いかもしれないけど、隠し扉ってなかったっけ?
あれっていつ作ってるんだろう?
213: 04/06/14 23:46 ID:HxZhdP5q(17/19) AAS
通路を一本作成したら、全ての部屋がつながっているかを調べる。
is_all_connected();
9つの小領域分用意された、部屋訪問フラグをクリアする。同時に、部屋が
あるかどうかを調べて、あれば、その部屋の番号を覚えておく。(starting_room)
その部屋から訪問調査する。
visit_rooms(roomnum);
roomnum部屋の訪問フラグをオンにする。
roomnum部屋にある4つの扉に対して・・・
扉から接続されている別の部屋の扉を調べて、
その部屋に対してvisit_rooms()する。再帰呼び出しですよ。
省7
215: 04/06/14 23:51 ID:HxZhdP5q(18/19) AAS
>>212
隠し扉それです、ThanX!
>>209
その1 ... 隠し扉
その2 ... is_all_connected();が真の場合、通路作成のfor()ループをbreakしてます。
つまり、ぐるっとまわって別の部屋へつながっている場合、直通路は作成されないのだと思います。
216: 04/06/14 23:59 ID:HxZhdP5q(19/19) AAS
fill_out_level()ながーい!休憩。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.029s