ダンジョン自動生成
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
02/07/19 22:06ID:o6Bp.wT2どうやるんですか
012182
03/09/22 23:02ID:rNdSiZ4B0122名前は開発中のものです。
03/09/22 23:07ID:Pk1G8jz26の手順をスッキリさせないと時間メッチャかかりそうだけど
012382
03/09/23 00:49ID:H87naM88間違えると自分の部屋に戻ってくる行けない部屋のあるダンジョンになってしまう。
ちなみに6の判定そのものは、すぐに出来る。
漏れの場合は左下にリトライカウントを表示してたけど大体1発で出来てた。
たまにやり直すくらい。
0124名前は開発中のものです。
03/10/09 18:15ID:gloYt7es2、通路の上に部屋同士が重ならないように配置する。
これでどう?
0125名前は開発中のものです。
03/10/09 18:29ID:s4Tn1OFh問題は通路の作り方だ。
0126名前は開発中のものです。
03/10/09 18:47ID:gloYt7es重ねる通路は、直線やL形や四角形などを使う。
何度か通路を重ねれば大きくて複雑な通路が出来る。
012782
03/10/09 22:35ID:WP88aGMfなにも考えずに部屋を置くと部屋の形が四角に見えない可能性がある。
それでも良ければ構わないけど、漏れはトルネコのような部屋の形が長方形から
崩れないように注意した。
■□□□■□□□□□
■■■■■□□□□□
■■■■□□□□□□
□■■■■■■■■■
□■■■■□□□□□
□■■■■□□□□□
□■■■■■■■□□
□■■■□□□■□□
こんな部屋の形を許すかどうかだね。
0128名前は開発中のものです。
03/10/09 22:54ID:PD96naDp細かいルールになるが通路の長さや部屋の大きさ、配置の座標を奇数で統一すれば、
部屋の形を綺麗にすることは可能だと思う。
0129名前は開発中のものです。
03/10/10 02:58ID:YAvlPDIa0130名前は開発中のものです。
03/10/10 05:14ID:x+Z90lGG同じく鉱脈を作ってカクカク掘っていけば鉱山。
013182
03/10/13 08:53ID:wevhMUAZその制限が許されるなら簡単にはなる。問題はそれでいいかどうか。
論点としては>>124と同じだね。
漏れは>>1にシレンとあったので不思議のダンジョン系のダンジョンを基点として考えただけ。
ところで、漏れ以外にも誰か書いてくれよ。
0132名前は開発中のものです。
03/10/13 09:41ID:bbfkqWDBとりあえず仲間の匂いがする(仲間が多くいる)箇所を彫る
んだけじゃなかったっけ?なんでそんなルールで複雑な巣穴
が生成されんだか…
0133名前は開発中のものです。
03/10/13 11:31ID:bV77mRDFboidみたいに、できるといいね
0134132
03/10/13 13:20ID:bbfkqWDBアリの巣作り(画像紹介のみ)
ttp://acolyte.t.u-tokyo.ac.jp/~kaityo/ant2.html
巡回セールスマン問題を「アリのフェロモン」をシミュして解くアプレットらしい。
ttp://uk.geocities.com/markcsinclair/aco.html
ズバリのものは見つけられんかった。自分で作るしかないか…
0135名前は開発中のものです。
03/10/14 11:56ID:0sl2OLkJ2.通路は((奇数ブロック*i)進んだら曲がる)*n
3.1に戻る
を任意数繰り返したら終了、ってのでやってみた。最初と最後の部屋には階段もつけてみた。
たしかに>>82みたいにきっちりやろうとすると大変だけど、「ダンジョンらしきもの」を自動生成させるのはそれほど難しくはないね。
初めてやってみたけどこれ面白いわ。もちっとがんばってみる。
013682
03/10/24 23:55ID:LUG2pqu00137名前は開発中のものです。
03/12/03 22:01ID:zSvX83Rw0138名前は開発中のものです。
03/12/04 00:54ID:z1sAcz/m1 X*Yの外壁をつくる。中は全部床。これをダンジョンと呼ぶ。
2 ダンジョンの中にX個の壁を置く。位置はランダム。
3 ダンジョンの中にX*Yの部屋をZ個作る。部屋は外周が全て壁で中が全て床。
4 入り口をランダムで一つ作る。
5 入り口から深さ優先の探索で床に深度を付ける。
6 深度の最大値がXより小さかったら、一番深い床に接してる壁を一つ床に変えて4に戻る
パラメータをうまく与えてやればそれらしいものが出来たよ。
ゲーム作成には挫折したが。
0139名前は開発中のものです。
03/12/04 00:56ID:z1sAcz/m○ 5に戻る
0140名前は開発中のものです。
03/12/04 22:39ID:kq3KaFzwすまんが何がどうなのかさっぱりわからん。
なんで全部床なところにさらに床と壁を作るのか?
1〜3と6にあるXはどこまで同じものなのか?
深度がなにを意味しているのか?
0141名前は開発中のものです。
03/12/05 00:12ID:w85YOxE1まず、xとかyとか同じものを違う意味で使うのは止めたほうがよいと思った。
0142名前は開発中のものです。
03/12/05 01:35ID:ltjJGjMdしかも深さ優先じゃなくて幅優先の探索だった。
深度は入り口からその床までの最短歩数。
Xは全部別物。
スゲー単純に言うとある程度の深さになるまで壁→床、床→壁を適当に繰り返してるだけ。
部屋を作って通路で繋ぐという考え方ではないので
ここで議論してるのとは全然違うものでした。
0143名前は開発中のものです。
03/12/06 17:18ID:DPzBMAwq・幅優先・・なんのこと?
・最短歩数・・なんのこと?直線じゃなくてもいい?
あと、結局どんなダンジョンになるかわからん。
0144名前は開発中のものです。
03/12/06 20:27ID:gsVF3sa20145名前は開発中のものです。
03/12/06 22:34ID:uezX5CzB1.部屋数を一定数+乱数に決定
2.壁で埋め尽くされたマップに部屋を重ならないように配置
3.開始地点・終点をどこかの部屋の中に指定
4.開始地点から終点までの通路を1+乱数個作成
とまぁ、言うのは簡単なんだが
アルゴリズムにしろってーと難しいな・・・(´Д`)ハァ。
0146名前は開発中のものです。
03/12/06 23:51ID:pqhCLOb0部屋
部屋 987
部屋 6
部屋 345
部屋12
深度ってこんな感じか?でも廊下が巻いたらどうするんだ?
9から下に行って右に行ったら?
同じ部屋についた場合とか廊下が交差したりすぐ隣を通って広くなったりで
これだけだとあまり廊下っぽくならない気がするぞ。
0147138
03/12/07 04:08ID:SbSpMvxn>>144
ソースはPC98を物置から引っ張り出さないとならないから面倒
でも面白そうだから、暇なときにでもサルベージします。
>>146の例の空白が壁を現しているなら
0がダンジョンの入り口だったとして下のようになる。
54
43 987
32 6
21 345
1012
0148続き
03/12/07 04:08ID:SbSpMvxn9の下、9の左下が壁から床になると
54
43 567
3234 6
21 345
1012
になる。
書いてて思い出したが、6の「一番深い床に接してる壁を一つ床に変えて」は記憶違い。
ランダムで床を5個置く、壁を5個置く、とかやってたような気がする。
俺の作ってたやつは部屋の概念が無かったので、
床がたまたま四角く残ってたら部屋って感じ。
イベントの位置は深度で決定してた。
全然ローグ系じゃなくてゴメンネ
0149名前は開発中のものです。
03/12/07 10:16ID:Jd1VJ/+bでも、参考になったよ。おかげで下の方法を思いついた。
138と比較するとローグ系の廊下は一マスごとに方向をランダムに決めているんじゃなくて
他の部屋を目指した直線的なランダムってことだろうな。
A:掘り始めの部屋と行き先の部屋をランダムに決める。
B:XとY、どちらかを先にあわせるか決めて廊下を延ばす。
C:一方が合えばもう一方を合わせる方向へ。
D:数十回に一回、進行方向をランダムに変える。
E:別の廊下と繋がったらそこで終了。
まだ欠点はあるだろうけどたぶんこんな感じか?
0150名前は開発中のものです。
03/12/17 19:26ID:Og4NARii作りたいタイプによってアルゴリズムを変えてた
迷路風
アルゴリズム辞典に出ているようなやり方で
所々壁を消したりしてアクセントを付けてみたり
ローグ風?
部屋を適当に配置し、適当に通路でつなぐ
行き止まり通路を作ってみたり
洞窟風?
適当に掘り進んで、適当に太らせる
0151名前は開発中のものです。
03/12/23 16:22ID:wQ1mOr30その適当って個所のアルゴリズムを書けよアホ
0152名前は開発中のものです。
03/12/23 17:22ID:bY3OxSod0153名前は開発中のものです。
04/01/13 23:46ID:8aDUcohE0154名前は開発中のものです。
04/03/18 05:26ID:mbXIiubf0155名前は開発中のものです。
04/05/03 20:45ID:6fzYU4+4Nethack ではダンジョンの深い所では古典的な迷路が(いっぱい)出現します。
ミノタウルスも(いっぱい)いるよ。
とってもつらいけど、神様がくれた試練なので頑張ろうと思いました。
0156名前は開発中のものです。
04/05/30 09:02ID:4+hrirdE0157 ◆wvM6C8VLoU
04/06/09 23:07ID:WBlL48ys超亀レスで別人だが自分が昔考えたアルゴリズムは
1.適当な部屋を選択
2.その部屋から一番近く部屋を探す。
3.それぞれの部屋から縦横に直線状に通路掘る
をすべての部屋に通路が繋がるまで繰り返す。
□
□
つまり上の場合(□は部屋)
□
↓
□→X
矢印方向に通路を掘っていけばX地点で通路が繋がる。
例外的な場合として、下みたいな場合があるが、書くまでもないので省略
□
□
0158 ◆wvM6C8VLoU
04/06/09 23:09ID:WBlL48ys0159 ◆wvM6C8VLoU
04/06/09 23:11ID:WBlL48ys↑
□
でもかまわない。
その他細々したものがあったと思うが思い出したらまた書く。
0160名前は開発中のものです。
04/06/10 16:16ID:v++dte4dマップが重要じゃなくてランダムイベントを#でつないでるんだよな
だから面白いんだと思った
0161名前は開発中のものです。
04/06/13 12:09ID:rkW7K1R1それだけだとこのように孤立したエリアができる可能性がある。
□ □
┃ ┃
□━┛ ┗━□
すべての部屋に通路は繋がっているが、部屋同士が繋がっていることにはならない。
厳密にやるなら、すべての部屋が繋がったかどうかのチェックが必要
あと「部屋から部屋へ通路を伸ばす」のではなく「部屋Aからの通路と部屋Bからの通路を繋げる」というアルゴリズムならば、その合流点Xをどう求めるのか気になる
0162 ◆Mn5mzn8hAQ
04/06/13 19:51ID:SVTy+FtY内容がよくわからんというか
思いっきり忘れたんだが
こういう感じのマップを自動生成できたら
結構イケテルか?
教えてくれろ。
□□□□□□□□□□□□□□□□□□□
□■■■■■□□□□□□□□□□□□□
□■■■■■■■■■■■■□□□□□□
□■■■■■□□□□□□■□□□□□□
□■■■■■□□□□□□■□□■■■□
□□□■□□□□□□□□■□□■■■□
□□■■■■■■■■■■■■■■■■□
□□■□□□□□□□□□■□□■■■□
□■■■■□□□□□□□■□□□□□□
□■■■■□□□□■■■■■□□□□□
□■■■■■■■■■■■■■□□□□□
□■■■■□□□□■■■■■□□□□□
□□□□□□□□□■■■■■□□□□□
□□□□□□□□□□□□□□□□□□□
場所とってしまってすまんね〜
0163名前は開発中のものです。
04/06/13 21:03ID:UiqEecMuトルネコタイプ
0164名前は開発中のものです。
04/06/13 21:10ID:nOFtOGzxつまりNetHackのソースでも見ればいいだろ(´д`)
0165名前は開発中のものです。
04/06/13 21:18ID:QEF1CnCV0166 ◆Mn5mzn8hAQ
04/06/13 21:28ID:SVTy+FtY死ねるというか寝れる。
で>>162はどうかいな?
0167名前は開発中のものです。
04/06/13 21:34ID:nOFtOGzx162は悪くないけど全ての部屋にほぼ直通で行ける状態はどうかと。
ある程度の回り道を要求する方がいいと思いますた。
さようか一筋縄ではいかんな。
ソース読んだ方が早いかな。
ちなみにローグの生成部分のソースファイルは1000行未満で
ほんとに関係あるのは
そのうち一部分だけなので実はたいしたことがない。
でもコメントついてねぇし。。orz..ぐぅ
0169名前は開発中のものです。
04/06/13 23:22ID:9y2POLbCいいこと言うなぁ。
仕切ってくださいくださいください
0171名前は開発中のものです。
04/06/14 03:47ID:kvXypjdH貼ってちょうだい
貼り付けられるほどは短くないジョ。。。
ソース付ウィンドウズ版ローグクローン2
ttp://www.freak.ne.jp/HEPOPO/
のRogue Clone II
部屋生成の理屈はわかったが
通路つなぎの部分で苦戦中。
(厳密にはローグクローン2系)の
我輩が読んでみた限りの情報提供しようとおもふ。
参考になるかわからんが(読み間違えてるかもしんないし)
AppMain.cがエントリポイントを含むソース
(Win版でない人は多分Main.c)
135行目のfor(;;)ループの部分の
make_level();が生成の関数。
level.cで定義されている。
これ以外で生成にからんでくるファイルは
room.cとrogue.h位だがちょっと参照する程度。
<つづく>
@3x3に分けたエリアのうち8箇所に部屋を設置する
A一定の法則で対となる部屋を決める
B3回方向転換しながら通路を結ぶ
という段取り。
<つづく>
しかしAの部分がまだ理解不能。
>>157 で指摘している繋がりチェックを省いて
華麗かつスマートなアルゴリズムで選定するんだろう。
寝ぼけた脳みそでは理解できんねぃ。朝になっちゃったねぃ。
ぐぅ。
他いろいろ気づいたことあるんですが長くなったのでさやうなら。
<つづかない>
0177名前は開発中のものです。
04/06/14 08:05ID:Fu2wy2cAというかこのページ、迷路ゲームの面白さへの考察まで書いてある。
なかなかいい大学だな。
0178名前は開発中のものです。
04/06/14 09:28ID:c4NXluee0179名前は開発中のものです。
04/06/14 09:47ID:5+/Otxjs0180名前は開発中のものです。
04/06/14 11:25ID:HxZhdP5qget_rand(x, y);
xからyまでの範囲の乱数値を得る
例)
get_rand(5, 2);
5から7までの間の乱数値
0181名前は開発中のものです。
04/06/14 11:26ID:HxZhdP5q0か1の値をランダムに返す
なるほど、ここで判明した関数かきだして
リファレンスみたいにすれば
みんなで読めるね
と、get_randの説明がおかしいある・・
get_rand(5, 2)なら2〜5の乱数を返す
get_rand(5, 7)なら5〜7の乱数を返す だわいね
乱数に関する関数はrandom.cに入っております。
>>178
最短経路探索、お、と思ったけどローグのソースはなんか違う気がしる
>>179
他のしとは知らんけど俺はまだ読むばかりなり。アンタも読むなり。
01832時間しか寝てませんよ? ◆Mn5mzn8hAQ
04/06/14 12:19ID:0lapHs9H#define ROW1 7
#define ROW2 15
#define DROWS 24/*縦の最大*/
#define COL1 26
#define COL2 52
#define DCOLS 80/*横の最大*/
※〜1、〜2は
マップを3x3の領域にきりわける際に利用している
01842時間しか寝てませんよ? ◆Mn5mzn8hAQ
04/06/14 12:54ID:0lapHs9HY2、X2、Y1、X1、door[4], is_room で構成される
is_roomはR_NOTHIN、R_ROOM、R_MAZE、R_CROSSなどの定数が入り、
部屋の種類をあらわす。
●door = dr・・・ドアに関する情報をつめこむ構造体
ペアになる部屋番号、ペアのドアのY、ペアのドアのX、X、Yで構成される
一つの部屋は最大4つのドアをもっていて
しかもペアになる部屋のドアの座標ももっており
かつ部屋ではなく通路になったりもする、と。
0185名前は開発中のものです。
04/06/14 13:08ID:HxZhdP5qまだ読みかけだから間違っているかもしれないけど補足すると・・・
部屋の最大数は9で、80x24の空間をを9個に分割して
部屋を配置しているっぽい。
例外はBIG_ROOM。空間内に一部屋だけという状態。部屋のサイズは画面内でランダム。
これはゲーム中、いずれかの階に一度だけ かつ 1/100の確率で出現する。
0186名前は開発中のものです。
04/06/14 13:09ID:HxZhdP5qあ、0lapHs9H氏の書き込みみると、9個じゃなくて8個なのかな。
01872時間しか寝てませんよ? ◆Mn5mzn8hAQ
04/06/14 13:17ID:0lapHs9Hあ、ほんとだ部屋の数9だね
for WonderWitchのソースはなぜか8ですた
#define MAXROOMS 9(rogue.h)
100分の1の確率なのか、なーる
01882時間しか寝てませんよ? ◆Mn5mzn8hAQ
04/06/14 13:24ID:0lapHs9H風来のシレン月影村の怪物インターネット版の体験版
を画面キャプチャしながら4階層遊んでみたが
今わかっている時点だけであきらかにRogueと
生成方法が違いますケドw
0189名前は開発中のものです。
04/06/14 14:21ID:CyVM64I20190名前は開発中のものです。
04/06/14 16:11ID:5+/Otxjs0191名前は開発中のものです。
04/06/14 17:06ID:rnOPv/om0192名前は開発中のものです。
04/06/14 19:04ID:HxZhdP5q部屋生成について補足。make_level()から呼び出される、make_room()は以下の通り。
画面を3x3に分割して、その分割された領域内に矩形を作ることで部屋にしている。
サイズはランダムで、領域内の左上からの位置もランダム。この時、他の領域には
踏み入らないように計算しているので、部屋の重なりをチェックする必要はない。
必ず9個の部屋があるわけでない。条件によって部屋のあるなしが決められる。
条件は単なるランダムではなく、ある程度の法則性がある。
これはゲームバランス的なものだと思うので詳しい説明は省略。
1/2の確率で縦に3部屋並ぶ構成になる・1/2の確率で3種類の部屋の並びになる、
一つのフロアには、少なくとも3つの部屋が生成される、とか。
部屋のあるなしを決定したら、フロアマップに部屋の構成を記録すると同時に、
部屋の位置やサイズを別に記憶しておく。
0193名前は開発中のものです。
04/06/14 19:18ID:HxZhdP5q>部屋の位置やサイズを別に記憶しておく。
サイズではなく、左上の座標と右下の座標っぽい。
あと、条件チェックで部屋がないと判断されても、先に計算した部屋の位置・・・
つまり、小領域内での左上と右下の座標値を保存している。どうやら通路?を
生成する時に利用しているっぽい。
0194ぐぅ ◆Mn5mzn8hAQ
04/06/14 19:40ID:0lapHs9Hわからないのが
ペアの部屋を選定するコード。
add_maze/make_maze。
add_mazeは>>193の「部屋ではなく通路にする」場合の処理で
座標を保存して範囲を限定することで
どこまでも無駄に通路を延ばしてしまうことを避け
るためと読んだ。
月曜日は面白いテレビ番組がなくて退屈である。
0195名前は開発中のものです。
04/06/14 19:42ID:HxZhdP5q9個の小領域内に、ある条件を満たしたら、迷路を作る。
基点は先の部屋を作成した時に保存した左上の位置から、掘り進む。
1回(1文字)掘るごとに1/3の確率で進行方向を変える。
掘り進む方向+1と、その左右方向(画面の左右ではなく進行方向に対して)、
それから、掘り進む方向+2を調べて、すでに掘った通路があったら迷路作成終了。
掘る範囲は先にランダムに決定した部屋サイズ内なので、小領域を出ることはない。
迷路が生成される条件はゲームバランス的なので詳しい説明は略。
最初の階では絶対に迷路がない。16階以降は階を増やすごとに迷路が作られる確率が高まる。
迷路は1つの階につき1つっぽい。
0196名前は開発中のものです。
04/06/14 19:45ID:HxZhdP5q0197名前は開発中のものです。
04/06/14 19:49ID:HxZhdP5qまた読み違えた。
> 掘る範囲は先にランダムに決定した部屋サイズ内なので、小領域を出ることはない。
掘る範囲は少領域内。
基点が、部屋サイズ内。
0198ぐぅ ◆Mn5mzn8hAQ
04/06/14 19:52ID:0lapHs9Hするってぇと通路への変更は別のコードか。
0199名前は開発中のものです。
04/06/14 19:57ID:HxZhdP5q関数名だけみると、通路&ドア作成は、connect_rooms()内っぽいですよ。
0200名前は開発中のものです。
04/06/14 20:12ID:HxZhdP5q処理内容は、作った迷路をところどころHIDDEN属性にする。
つまり、先に迷路を掘ってから迷路の一部をHIDDEN化してる。
このルーチンは、迷路だけでなく、通路作成時にも呼び出されてる。
隠し処理は3階以降にしか発生しない。あとはゲームバランス的な条件で。
0201名前は開発中のものです。
04/06/14 20:14ID:HxZhdP5q>>197は間違いで、やっぱり掘る領域は部屋サイズだったけど、まぁいいや。
0202ぐぅ ◆Mn5mzn8hAQ
04/06/14 20:16ID:0lapHs9Hああ、通常の部屋同士の通路掘りはそれなんだけど、
229行で部屋でも迷路でもないものははじかれるから
それ以外に部屋を通路にするロジックがあるのではないかと
おもて。
R_CROSSという定数がアヤシイ・・
fill_out_level()とfill_it()がアヤシイ・・
とかおもてました。
最後に調整してるんかな、とか。
でもなんか違う気もするし・・
まぁ割と瑣末な部分なので
この時点で突っ込まないでもいいのかもしれんが。
0203ぐぅ>腹ペコ ◆Mn5mzn8hAQ
04/06/14 20:29ID:0lapHs9Hほほぅ。そうなんだ。ソース読むの早いなぁ。
部屋同士を接続するアバウトなしくみの見当ついた。
012
345
678
とわかれているエリアで
ランダムに部屋を選んで、(ここでは仮に0とすると)
1,2,3,6のエリアの部屋に接続に行く。
選んだ部屋が4だったとすると5と7に接続にいく。
実は6にも接続に行ってしまうが、
connect_roomsで実際に接続する際、行か列のいずれかがあっていないと
処理を終了するので結局6には接続しない。
これをランダムな順番で0〜7について行う(8はイラン)
つまり、
右、さらに右、下、さらに下の4箇所に接続に行く。
非常にアバウトだが、
これが接続先選定のアルゴリズムであった。タブンネw
夕飯買ってきてそれからそれからもうちっと読んでみます。
0204名前は開発中のものです。
04/06/14 21:06ID:HxZhdP5q3x3の領域内に部屋と迷路を作ってから、迷路の部分隠しをしたあとは、
mix_random_rooms()で3x3の小領域の情報を10回ほどシャッフルしてるっぽい。
領域単位での入れ替え。
・・・すでに部屋とか迷路をdungeon[][]内に書き込んでるけど、
そんなことしていいのか?どこか読み違えてるかも。
というわけで、そろそろ通路の処理に入りそうなんだけど、ここからが面倒っすね。
とりあえずアミュレットは26階以降にでるっつーことで。
0205ぐぅ>腹ペコ ◆Mn5mzn8hAQ
04/06/14 21:29ID:0lapHs9Hそうそう、mix_random_rooms()でしっちゃかめっちゃかと俺も悩んだw
でも冷静によむと、
mix_random_rooms()はrandom_roomsをシャッフルするだけで
肝心のroomsはいじられないので大丈夫だったりしる。
random_roomsはランダムに部屋選ぶのに参照しるだけの配列にゃり。
部屋同士の接続はこれまたアバウトにいうと
部屋の出入り口を向かい合わせにつくって(dirとrevに向きを設定)
通路を延ばして途中で向きかえて座標をあわせて再度通路をのばして
ドッキングしてるだけ
というか、細かい話抜きにしると
これでほぼ全容はわかったことになるんだなぁ。
0206名前は開発中のものです。
04/06/14 21:53ID:MkSJwU7k0208名前は開発中のものです。
04/06/14 22:10ID:HxZhdP5qなるほど、そっちだったか〜。
深読み&変数名勘違いのトラップひっかかってました。
0209ぐぅ@凍結 ◆Mn5mzn8hAQ
04/06/14 22:35ID:0lapHs9Hどのような理屈であろうか。
0210名前は開発中のものです。
04/06/14 23:18ID:HxZhdP5q部屋と部屋をつなぐ処理・・・は>>203ですが、ちょっと補足。
1つの小領域につき1度、右とその右、下とその下の4箇所の
小領域(にある部屋)に対して通路を作成する。
connect_rooms();
まず、向かい合わせになっているそれぞれの部屋の壁に対して、
ランダムな位置に扉を作成する。そこから通路を延ばす。
draw_simple_passage();
通路は2回曲がるように作成される。スタート地点の扉から
ランダムな長さまで直線をひいて、進行方向を変えて、そこからゴールの扉の
縦座標(or横座標)まで直線をひいて、進行方向を扉の方にして、
そこからゴールの扉まで直線をひくだけ。進行方向を変えるとかいうのは90度向きを...
とかではなく、部屋の位置関係が上下であれば、下にひいて、右か左にひいて、また下ひく
という、ただの条件分岐と線をひくためのfor()ループ三回。
0211名前は開発中のものです。
04/06/14 23:28ID:HxZhdP5q迷路作成時に呼び出した、hide_boxed_passage()と同じ。
そうそう、小領域をまたぐ場合...つまり、>>200の図でいうと、0から2とか、
0から6へ通路を作成した場合には、その中間の小領域(1 or 3)には、
R_CROSSという部屋扱いになるけど・・・これが何を意味するのか、今はわからない。
もちろん、1と3に部屋があったら、通路は作成されない。
あとは、is_all_connected()とfill_out_level()を読んだらオシマイ。
ナゾというか、勘違いかもしれないけど、隠し扉ってなかったっけ?
あれっていつ作ってるんだろう?
0212ぐぅ@凍結 ◆Mn5mzn8hAQ
04/06/14 23:42ID:0lapHs9HR_ROOMでもR_MAZEでもR_NOTHINGでもないエリア(というか部屋)
connect_rooms()の最初の条件文ではじかれるエリア、
はやい話、通路を延ばせない場所でいいんでないかと。
十字路ってみかけないものな。
put_door()の最後の方の
if ((cur_level > 2) && rand_percent(HIDE_PERCENT)) {
dungeon[*row][*col] |= HIDDEN;
は隠しドアとは違うの?ちゃんと読んでないからわからんけど。
0213名前は開発中のものです。
04/06/14 23:46ID:HxZhdP5qis_all_connected();
9つの小領域分用意された、部屋訪問フラグをクリアする。同時に、部屋が
あるかどうかを調べて、あれば、その部屋の番号を覚えておく。(starting_room)
その部屋から訪問調査する。
visit_rooms(roomnum);
roomnum部屋の訪問フラグをオンにする。
roomnum部屋にある4つの扉に対して・・・
扉から接続されている別の部屋の扉を調べて、
その部屋に対してvisit_rooms()する。再帰呼び出しですよ。
※先に書き忘れたけど、部屋に扉と通路を作成する時に、どこの部屋の
扉につながっているのかを記録してあるので、それを参照している。
また、一つの部屋には最大で4つの扉が設置される。上下左右の壁に一つずつ。
全部屋訪問フラグがONになっていれば、全部屋が接続されているとみなされる。
なぜか、
if ((rooms[i].is_room & (R_ROOM | R_MAZE)) && (!rooms_visited[i])) {
部屋だけでなく、迷路も部屋と同じ扱いになってる。
0214ぐぅ@氷解 ◆Mn5mzn8hAQ
04/06/14 23:51ID:0lapHs9Hヽ(`Д´)ノ うぉ〜
あれ、部屋が通路になってしまう仕掛けはいったい・・
0215名前は開発中のものです。
04/06/14 23:51ID:HxZhdP5q隠し扉それです、ThanX!
>>209
その1 ... 隠し扉
その2 ... is_all_connected();が真の場合、通路作成のfor()ループをbreakしてます。
つまり、ぐるっとまわって別の部屋へつながっている場合、直通路は作成されないのだと思います。
0216名前は開発中のものです。
04/06/14 23:59ID:HxZhdP5q0217ぐぅ@氷解 ◆Mn5mzn8hAQ
04/06/15 00:02ID:f1MiYXarif ((rn != r1) && (rn != r2) && (rn != r3) && rand_percent(40)) {
goto END;
}
の処理、必須の3部屋でなければ40%の確率で
通路に変貌すると見た。つぅか既出だったっけかな・・
0218ID変わっちゃった
04/06/15 01:58ID:aIwm2r1B部屋に扉がない場合(どこにもつながってない壁がある)、
行き止まりの通路を作成してる?
まぁ、ローグの部屋と通路の作成方法はこれでわかった、ということでいっかな。
このアルゴリズムのキモは“空間を3x3に分割する”ということに尽きますね。
これで部屋の重なりを防げるし、ある程度のばらつきを保証できるわけです。
0219ぐぅ@氷解 ◆Mn5mzn8hAQ
04/06/15 02:25ID:f1MiYXarウンウン
おれっちも3X3が肝とおもふさ〜
あと、再帰して繋がりチェックしるやつ
あれないと全部の部屋がつながってしまうわけだけど
ランダムな部屋から通路つくるから絶妙に無駄な通路ができたりする。
必ずしも最低限の通路ではないちうとこもよくできてる。
まとめでもアップしようと思ったけど(カッタルイからw)やめて
このアルゴリズムの簡易版でも作ってアップしようかな。
ID変わっちゃったさんありがとう
おかげでかなりスムーズに解析できた。
というわけで、とりあえずどもおつかれさました〜
0220名前は開発中のものです。
04/06/15 16:40ID:vSxhBobb労をねぎらう意味で、
Delphianで人気の「Delphiゲームプログラミングのエッセンス」
からロジックを転載します。
フロアを3×5のブロックに分ける
1ブロックは、10×10のマス
部屋番号
□□□□□ 0〜4
□□■□□ 5〜9
□□□□□ 10〜14
部屋の数は、5〜10として、最低3個は偶数の部屋番号に配置する
1ブロックには、最大9×9マスの部屋が作られる。
(1マス分は通路に充てる。)
1ブロックには、必ず部屋か通路が存在する。ただし■は何も無し。
2と12(■の上下にあるブロック)はどちらかを必ず両隣とつなぐ。
2と12を隔てて左右のフロアで各6ブロック毎に部屋や通路を作成する。
そのとき通路を繋ぐロジックは、絶対に繋がっていない部屋を作らないこと。
これが基本。
3×3のブロックに分けるロジックよりは、ダンジョンっぽい造りになると思う
後は、部屋を迷路状にしてしまうとか、ブロックをまたいだ中部屋をつくるとか、
隣り合わせのブロックに向かう通路を必ず作るとか(円形のフロアになる)、
適当に部屋や通路を加工していけば面白くなるかもね。
■ このスレッドは過去ログ倉庫に格納されています