1read 100read
2011年10月1期ゲ製作技術【ダンジョン】 自動生成 2 【地形】 TOP カテ一覧 スレ一覧 削除依頼
・ 次のスレ
短編且つ戦闘無しのRPGの企画皆で妄想スレ
過疎板からの脱却
怖いノベルゲーム作ろうぜ
エミュ鯖の製作


【ダンジョン】 自動生成 2 【地形】


1 :07/06/19 〜 最終レス :11/11/19
ランダムでダンジョンを自動作成する手法についてのスレです。
ローグタイプやシレンタイプのダンジョンや、街並みや地形など。
※過去スレ
ダンジョン自動生成
http://pc11.2ch.net/test/read.cgi/gamedev/1027084016/
関連サイトは>>2>>3

2 :
※参考サイト
★Racanhack コード解説 (日本語)
http://racanhack.sourceforge.jp/rhdoc/intromaze.html
★迷路の自動生成 「C言語によるアルゴリズム辞典」 (日本語)
http://www.matsusaka-u.ac.jp/~okumura/algo/
↓サンプルコード(src/maze.c)
ftp://ftp.matsusaka-u.ac.jp/pub/algorithms
★アリの巣作り(画像紹介のみ。日本語)
ttp://acolyte.t.u-tokyo.ac.jp/~kaityo/ant2.html
巡回セールスマン問題を「アリのフェロモン」をシミュして解くアプレットらしい。
ttp://uk.geocities.com/markcsinclair/aco.html
★ソース付ウィンドウズ版ローグクローン2 (日本語)
ttp://www.freak.ne.jp/HEPOPO/
★RogueLikeのマップの作り方 (英語)
Dungeondweller - www.roguelikedevelopment.org
http://www.roguelikedevelopment.org/php/category/showCategory.php?path=development/&category=MAP
★D&D用 (英語)
ttp://www.aarg.net/%7Eminam/dungeon.cgi
★ドラクエ風 進可 ◆Sinka1my5k (日本語)
ttp://www.interq.or.jp/moonstone/person/RRL/index.html

3 :
※参考論文
★自律的に変化する仮想都市の自動生成に関する研究 (日本語)
ttp://www.tulips.tsukuba.ac.jp/pub/dl/e_thesis/ko/honda2004.pdf
★時間変化する仮想都市における道路網の自動生成 (日本語)
ttp://www.cs.tsukuba.ac.jp/H15Syuron/200205246.pdf
★仮想都市のためのL-systemによる道路網生成手法の検討 (日本語。要登録)
ttp://fw8.bookpark.ne.jp/cm/ipsj/search.asp?from=&flag=6&keyword=IPSJ-CG98090003&page=&mode=PDF
★仮想都市の自動生成における建物形状の作成と表示 (日本語)
ttp://www.cs.tsukuba.ac.jp/H15Syuron/200205245.pdf

4 :
>1

5 :
>>1お疲れ様。

6 :
いちおつ

7 :
5代目住職 ジュウシマツ和尚はわかないのかwww

8 :
________
|              |
|  / ̄ ̄ ヽ,  |
| /        ', |
| {0}  /¨`ヽ {0}, !
|.l   ヽ._.ノ   ', |
リ   `ー'′   ',|
|              |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄
5代目住職 ジュウシマツ和尚

9 :
糞スレ以外にはあんまり貼らないんだがな。
呼ばれたので貼っておく

10 :
ワロタ

11 :
んじゃお題を一つ。
ローグのマップ作成は、長方形の分割から成り立っているが
必ず縦か横に真っ二つに分断されるラインがある。
こういう分断ラインの無い長方形分割を、ランダムにできないか?

12 :
お題じゃなく「教えてください」だろボケ。

13 :
確かにお題とはちょっと違うみたいだが
いったん小さめの格子状に分割して、それを結合するってのはどうよ?

14 :
必ず縦か横に真っ二つってのがよくわからないんだが…もしかして俺は馬鹿?

15 :
おれもわからんw
ローグのソースよまんとわからんのじゃ、面倒でやってられんw

16 :
ああ、長方形分割って、>>2 の一番上のサイトみたいな方法のことなのね。
こういう分割方式って、部屋が被らないことが簡単に保障できる代わりに
特定のパターンでの生成を諦めるって趣旨だと思うが……。
まともなの作ろうとすると、掘削していくとか、ボトムアップなやり方じゃないと無理があるだろう。
迷路の棒倒し法と穴掘り法をどちらも実装した経験があるが、
同じ経験をした奴ならこのイメージが分かると思う。

17 :
>>14
俺は>>11をこんな感じに解釈してみた。
これで質問の意図と合ってるか、これがローグの方法かはわからないが。
マップを二つに縦か横の直線で分けて部屋を二つ作る。ここでは部屋A、Bとする。
部屋Aを同様に分割、これを新しく部屋C、Dとする。ここで部屋Aはなくなる。
同様に、[B→E、F]、[C→G、H]、[F→J、K]といった感じに分割していく。
で、こんなマップが出来るはず。ちなみにIが飛んでるのは図にする都合。
GGHHEEEE
GGHHEEEE
GGHHEEEE
GGHHJKKK
DDDDJKKK
DDDDJKKK
DDDDJKKK
今回問題になってるのは、HとE、DとJの境目。最初にAとBの境界線になっていたライン。
できたマップ全体がこのラインで分断されている。

18 :
−20〜20度くらい傾けた縦横ラインで分割して、
部屋自体は分割線からはみ出ないように配置していけば、
ぱっと見判らないし比較的空間のロスも少ないんじゃね?
廊下が長めになるかもしれないけど。

19 :
そこで、>>13の方法を提案してみる。
始めにマップを小さい格子状の部屋で分割しておく。部屋は多めにしておく。
AABBCCCDD
AABBCCCDD
EEFFGGGHH
EEFFGGGHH
EEFFGGGHH
JJKKLLLMM
JJKKLLLMM
これを[A=A+E][C=C+D][H=H+M][J=J+K+L]といった感じに結合。
AABBCCCCC
AABBCCCCC
AAFFGGGHH
AAFFGGGHH
AAFFGGGHH
JJJJJJJHH
JJJJJJJHH
このとき結合の仕方により、図のように全体を分断するラインがないマップが出来る、ってわけ。
ちなみに最終的なマップは、ここで決めた部屋の中に空洞(実際の部屋)と通路を配置する形で行えばいい。

20 :
ランダムに部屋を置いていく。すでに置いてあるのと重なるようなら縮小。
だと、細かいマス目があちこちできそうだな。
そういえばランダム室内割りは、まだ出てきてなかったよな?
>2 のD&D風だけど未使用空間が無いようなタイプ

21 :
#!/usr/bin/perl -w
my ($width, $height) = (60, 25);
my (@x, @y);
my ($i, $j, $k) = (0, 0, 0);
# x 方向に適当に分割
push @x, $j += (int rand 5) + 2 while $j < $width; # 2 - 6
delete $x[-1];
($i, $j, $k) = (0, 0, 0);
# y 方向に適当に分割
push @y, $j +=(int rand 5) + 2 while $j < $height; # 2 - 6
delete $y[-1];
print +(join ', ', @x), " [", scalar @x, "]\n", +(join ', ', @y), " [", scalar @y, "]\n";

22 :
my %no_wall;
# 適当に結合
for (1 .. (int rand 15) + 15) { # 15 - 29
my ($x, $y) = (int rand scalar @x, int rand scalar @y);
print "$x : $y (";
my $dir = int rand 4;
if ($dir == 0) {
print $x . "," . ($y - 1) . "-" . $y . ")\n"; $no_wall{$x . "," . ($y - 1) . "-" . $y} = 1;
} elsif ($dir == 1) {
print $x . "-" . ($x + 1) . "," . $y . ")\n"; $no_wall{$x . "-" . ($x + 1) . "," . $y} = 1;
} elsif ($dir == 2) {
print $x . "," . $y . "-" . ($y + 1) . ")\n"; $no_wall{$x . "," . $y . "-" . ($y + 1)} = 1;
} elsif ($dir == 3) {
print +($x - 1) . "-" . $x . "," . $y . ")\n"; $no_wall{($x - 1) . "-" . $x . "," . $y} = 1;
}
}
my (@x_wall, @y_wall) = (map { 0 } 1 .. $width, map { 0 } 1 .. $height);
$x_wall[$_] = 1 for @x; $y_wall[$_] = 1 for @y;
my (@x_room, @y_room);
$i = 0; @x_room = map { ++$i if $x_wall[$_]; $i; } 0 .. $width - 1;
$i = 0; @y_room = map { ++$i if $y_wall[$_]; $i; } 0 .. $height - 1;
for my $y (0 .. $height - 1) {
for my $x (0 .. $width - 1) {
my ($xr, $yr) = ($x_room[$x], $y_room[$y]);
$x_wall[$x] and (!$no_wall{($xr - 1) . "-" . $xr . "," . $yr} and ($y_wall[$y] and print "+" or print "|") or print ".");
$y_wall[$y] and !$no_wall{$xr . "," . ($yr - 1) . "-" . $yr} and print "-" or print ".";
} print "\n";
}
----
ごめん俺は投げた

23 :
http://www.chukkysoft.com/m-bara/My3D/main.html
JavaApplet製
http://www.aarg.net/~minam/dungeon_design.html
(↑リンク先にcgiが設置されています)
これをJavaで実装し直しました。

24 :
畜生良い仕事だ

25 :
コレは3DをJavaで自前で実装してるのかな?
Wizの疑似3D表示ではないようだし。
すごいな。というか、めんどうそうだ。

26 :
>>24
ども。自分(描画周り・その他担当)と、
自分の上の人(ダンジョンジェネレータ移植・全体マップ描画担当)も喜んでおります。
>>25
[CodeZine:3Dモデルを表示するJavaアプレットの作成]
http://codezine.jp/a/article/aid/38.aspx
を参考にしました。
表示物はメタセコイア形式(*.mqo)のものを表示しています。
テクスチャとかは未対応。

27 :
二人で作ってるのか。

28 :
>>1おつ
華麗に28get
>>19の説明はわかり易いね
rogueはただ単に定量に6分割する方法だったと思う。
俺は>>20の方法で分割したなー、分割領域x, y, w, hを乱数で出す。
ただ、重なる時は分割せず、なにもせずcontinueしてループを200回くらい回すといい感じに分割できてるっていう力技
でも>19のほうがよさげだね

29 :
まぁ俺は >>2 のD&D風 = >>23 の2番目みたいな、
通路を先に書いて部屋を後で置くアルゴリズムをオススメする

30 :
>>23のやつ、アプレットのコンソール見ると面白いぞ。
生成過程がテキストで表示されてる。

31 :
ほんとだ、生成方法も1つじゃなくて色々あるね。おもしろー

32 :
>>20が思っているものと違うかもしれないが、未使用空間なしのものを作ってみた。
ソースが汚なくてすまんです。
ttp://gamdev.org/up/img/9705.zip
>>11が言うように全体での上下分割の弊害がある気がする。

33 :
>>32
GJ!
たしかに通路が縦か横方向に端から端まで一直線にのびて
分断されている感じのマップができる傾向にあるな。
でも、ちゃんとウィザードリィ系3DダンジョンRPG風のマップが生成されているね。
あと、今時、MS-DOS用のプログラムだと、一瞬でウィンドウが閉じてしまって
意味が分からんっていう人もいると思うから、
a.exe > a.txt
pause
みたいなバッチファイルを同梱しといた方が良かったんじゃないかと思う。

34 :
エクステンダにog32使っちゃうとXPのDOS環境と互換性がなくなる、と最近気づいた俺が言ってみる。
他にフリーのあったかしらw

35 :
go32だね・・・orz

36 :
>32
いい感じですね。でも縦横区切りはやっぱり宿命だなー
部屋の形を長方形以外でも可にすればもうちょっと減るか?

37 :
>>32
GJ!ビルみたいな実際の建造物の内部を想起させていいね
void makeCorridor()<ここで通路の配置予約を行っているみたいだから
const int CORRIDOR_FIRST_CHANCE = 90;
const int CORRIDOR_SECOND_CHANCE = 80;

const int CORRIDOR_FIRST_CHANCE = 50;
const int CORRIDOR_SECOND_CHANCE = 30;
みたいにすると通路自体は短くならないけど通路の数は減ってちょっとすっきりする
>>33
DOS窓もわからんのはソース読んでもわからんだろうし問題ねえよw

38 :
>>34
素直に
cygwin
Mingw32
あたりを使うとか
DOS窓強化だけならNYACUS。

39 :
Roguelike Dungeon Creation Contest!
http://www.dev-spot.com/forums/index.php?topic=4.msg10
> This contest ends: August 5th, 2007 at midnight.
こんなんあるぜ

40 :
Digging Features
http://www.jimrandomh.org/rldev/digging_features/

41 :
>>40のセルオートマタにインスパイアされてみた
ブラウザ上でWiz風(だと思ってる)ダンジョンを生成する
http://gamdev.org/up/img/9779.lzh
最初は何もないマップで、一つだけ部屋を作ってやって、
あとは各マスが自分で周囲の状況を見て部屋なり通路なりを
伸ばしていくという感じなんだけどどうよ

42 :
なぞっただけじゃん。

43 :
別にいんじゃね?

44 :
えー、そ、そうか?
うむー。

45 :
街マップ生成のテクノロジーデモ動画
http://forums.introversion.co.uk/introversion/viewtopic.php?t=733

46 :
すごすぎて吹いた

47 :
成長させるんじゃなくて完成図を一気に描く方式か。

48 :
そして建物内の部屋も生成
http://forums.introversion.co.uk/introversion/viewtopic.php?t=600

49 :
もう設計士いらねーな

50 :
こういうのに敵を配置して歩かせるための AI スレってどっかにありますか??

51 :
A*のスレならないな

52 :
今さらだけど>>41のダンジョン生成アルゴリズムいいな
パラメータいじくれば応用範囲も広いし
一部屋を基点にして増殖、っていうのがマップ構成に独特の雰囲気を出している

53 :
進可氏のRANDRANDLANDにインスパイアされて、ドラクエチップそのもので自動生成するFlashを作ってみた。
水際処理まではさすがに断念。
ttp://www.voidelement.com/randqmap/

54 :
弾幕の人か

55 :
3500ターンほどで世界が海に飲まれてしまいますた

56 :
思った以上に砂漠化は深刻ですな

57 :
なんかライフゲームを思い出した

58 :
むしろライフゲームそのものじゃね?

59 :
>>53
これ面白いなぁ

60 :
水際というか海岸処理実装してみた。
コンボリューションフィルタ駆使してみたら意外と軽くいけたので満足。
ついでにスムージングON/OFFも追加。

61 :
WEBデザイナーの作るモンって見栄えだけで内容浅いよねw
職業天ぷら詐欺師wwwwっっwうぇうぇww

62 :
内容浅い煽りが目に付く季節ですなぁ

63 :
しかし、ぱっと見だけのもんしか作ってないというのは同意かな。
なんか料理の模型が並んでるショーケースみたいなサイトだね。

64 :
と、1行もコードを書いたことのない者が申しております。

65 :

お、必死だな本人w

66 :
RANDRANDLAND
http://www.interq.or.jp/moonstone/person/RRL/index.html

67 :
>>53
って、これすげえなw
ドラクエってだけで、wktkするw

68 :
ホイール必須のインターフェースはどうかと思うけどな

69 :
それしか思わんのか

70 :
なんで本人そんな必死なのw

71 :

72 :

73 :
夏ですね

74 :
Flash厨はいつも元気ですよ(苦笑)

75 :
>>60
見栄えがずっと良くなってGood!
これで生成したマップを何かに使えないかなーとか刺激されマスタ

76 :
プゲラッチョ

77 :
単発IDに煽られても自演にしか見えないって知っててやってるんだろうか?

78 :
単発IDの擁護は作者自演にしか見えないって知っててやってるんだろうか?

79 :
無能で何やっても駄目な奴が、嫉妬してる様子に笑った。

80 :
Flash厨の分際で有能だとか勘違いしてる様子に笑った。

81 :
おいおいこのスレすっげー盛り上がってるじゃねーかよ!!

82 :
どこも夏だなあ

83 :
>>82
どのスレを開いても夏な展開になってるから困る

84 :
夏が寄り付かないようにもっと寒い流れにしておけば
夏厨も裸足で逃げ出すんじゃないか

85 :
Flash(苦笑)

86 :
板名考えたらそりゃそうだよなぁ

87 :
>>82-83
夏は露骨ですげえ
単発IDがどうとか言い出すからな・・・

88 :
夏が過ぎればまた過疎気味の濃いスレに戻ってくれることでせう

89 :
>66
GJ!

90 :
丘とか山のような地形データって、座標と標高で表すものでしょうか?
その上の建物とかはまた別に普通のモデルとして表しているのでしょうか?
何か参考になる本がありましたら教えてください。

91 :
地形はグレースケールとか?

92 :
>>90
3DのHeightMap的な考えならそうだろうと思う。

93 :
保守

94 :
今、自動生成のアルゴリズムを作ってた。
ちなみに最初はRacanhack コード解説を参考にしてみてたんだけどうまくいかなかったから自己流にしてみたんさ。
作り方は、ランダムに生成する部屋の数を決める。
部屋のサイズを決定し、各部屋が重ならないようにランダムに配置。
二つ目の部屋からは部屋の中に通路の基点を用意。
一つ前の段階で作った部屋にも通路の基点を設定して二つの起点を直線的に結ぶ。
これを最後の部屋まで繰り返す。
したがって、一つ目の部屋と最後の部屋には通常一本しか通路がつかない。
また、通路の交差および関係ない部屋と通路の接触は判定しないので、十字路や通路と混じっていびつな形になった部屋も生成される可能性がある。
けっこういびつなんだけど、これはこれでいいかなーとか思う。

95 :
http://www.chukkysoft.com/m-bara/My3D/main.html
JavaApplet製
・テクスチャ貼ってみました。重い。't'を押したらテクスチャ解除。
・画面下の数値は飾りです。

96 :
久しぶりに書き込みが!
>>95
重いよ。
テクスチャ解除すると普通に動くのに・・・・・

97 :
すまん。あげてもーた。

98 :
奥行きに従って暗くしてくれ

99 :
>>96
すってす。
もっと軽くする工夫が必要ですね。
>>98
了解。
http://www.chukkysoft.com/m-bara/My3D/main.html
暗い・暗くないの二値ですが出来ました。
さらに重くなったのでとりあえずテクスチャ解像度落としました。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 削除依頼
・ 次のスレ
短編且つ戦闘無しのRPGの企画皆で妄想スレ
過疎板からの脱却
怖いノベルゲーム作ろうぜ
エミュ鯖の製作