HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1015
Nasuダンジョンの自動生成6解決


Nasu

リンク

2011/10/15(Sat) 20:44:42|NO.42428

ローグライクのようなダンジョン自動生成のプログラムを作りたいのですが
区画分けと部屋の生成がよくわかりません。
その他の言語のサイトでもいいので初心者でもわかりやすいアルゴリズムが乗っている
サイトなどを教えていただけないでしょうか?
よろしくお願いします。



この記事に返信する


wass

リンク

2011/10/15(Sat) 22:30:10|NO.42432




木村

リンク

2011/10/16(Sun) 00:05:39|NO.42437

 やり方は前述のGemma氏のサイトの解説通り。コメントは書いてないので、分からない部分があったら質問してください。以下は一例。

#define CX 64 #define CY 36 #define SX 16 #define SY 16 randomize screen 0, 1024, 576, 0 makemap map, CX, CY, 7 redraw 0 for x, 0, length(map) for y, 0, length2(map) pos x*16, y*16 if map(x,y) { box x*16, y*16, 16, 16, $000000, $404040 } else { box x*16, y*16, 16, 16, $D0A080, $FFD0B0 } next next redraw 1 stop #module #deffunc makemap array map, int cx, int cy, int count dim map, cx, cy repeat cx map(cnt,0) = 1 map(cnt,cy-1) = 1 loop repeat cy map(0,cnt) = 1 map(cx-1,cnt) = 1 loop makebrock map, 1, 1, cx-2, cy-2, count return #define IX 3 #define IY 3 #deffunc makebrock array map, int bx, int by, int cx, int cy, int count \ , local div, local size1, local size2, local hole if (count+2<rnd(5)) | ((cx < IX*2+1) & (cy < IY*2+1)) : return div = rnd(2) if cx < IX*2+1 : div = 1 if cy < IY*2+1 : div = 0 if div = 0 { size1 = IX+rnd(cx-IX*2) size2 = cx-1-size1 repeat cy, by map(bx+size1,cnt) = 1 loop makebrock map, bx, by, size1, cy, count-1 makebrock map, bx+size1+1, by, size2, cy, count-1 repeat rnd(1+(cy-IY)/IY/2)+1 hole = by+rnd(cy) map(bx+size1-1,hole) = 0 map(bx+size1,hole) = 0 map(bx+size1+1,hole) = 0 loop } else { size1 = IY+rnd(cy-IY*2) size2 = cy-1-size1 repeat cx, bx map(cnt,by+size1) = 1 loop makebrock map, bx, by, cx, size1, count-1 makebrock map, bx, by+size1+1, cx, size2, count-1 repeat rnd(1+(cx-IX)/IX/2)+1 hole = bx+rnd(cx) map(hole,by+size1-1) = 0 map(hole,by+size1) = 0 map(hole,by+size1+1) = 0 loop } return #define global alargb(%1) color ((%1)&$FF0000)>>16, ((%1)&$FF00)>>8, (%1)&$FF #deffunc box int px, int py, int sx, int sy, int oc, int ic alargb oc boxf px, py, px+sx-1, py+sy-1 alargb ic boxf px+1, py+1, px+sx-2, py+sy-2 return #global
 ……にしても良いサイトを教えてもらいました。wass氏には感謝です。



Nasu

リンク

2011/10/16(Sun) 17:33:26|NO.42449

皆さまご回答ありがとうございました。
ソースコードまで頂き
とても参考になりました!



dekamega

リンク

2011/10/16(Sun) 20:20:33|NO.42451

自分が昔作ったときは、
1:部屋のシードとなる点を2次元座標にいくつか(10〜20)無作為に配置する
2:上記座標の連結順を無作為に決める(例:2→9→3→7→…)
3:連結順に、点を結ぶ。詳細は以下
 -1:出発点から連結先の点のx,y座標の差を取る
 -2:タテ/ヨコ のいずれかを無作為に選び、
    タテならタテ→ヨコ の順番で、ヨコならヨコ→タテの順番で
    -1で求めた差に基づき出発点から通路を掘る
   ・・・鈎(『 )型の通路になります。
4:通路を結び終わったら 点ごとに順番に部屋を作ります。詳細は以下
 -1:部屋のタテヨコの辺の長さを無作為に決めます。
    自分はint(sqrt(100-rnd(100)))+4 で決めました
    これだと一辺の長さは4〜14になり、大きな部屋ほど作られにくくなります。
-2:点を含み、かつ、-1:で求めた大きさの部屋を
    他の部屋と1マス以上カベで隔てられたところに配置可能なパターンの
    右上カドの座標を全て求めます。
    ※既に掘った通路と重なってもかまいません
-3:-2で求めた座標のうち、1つを無作為に選び、
    その座標を最右上マスとして-1で求めた大きさの部屋を掘ります。
    なお、この時部屋が配置できない場合がよくあります。
    その場合、部屋は生成しません。
    部屋を生成しないことにより、鈎型の通路が続き、
    複雑な進路の通路が生成されます。

かなりめんどくさい生成方法ですが、
区画分けにたよった方法よりバラエティ豊かなダンジョンができる割には、
他の無作為すぎる方法よりも、
区画分けによって作られたような整然とした雰囲気のダンジョンができます。
一例としては、マップを大回りさせられた末に元の部屋に戻ってくるような
一種の罠のようなダンジョンも稀に生成されます。



dekamega

リンク

2011/10/16(Sun) 20:32:30|NO.42452

ソースが残ってたので、いくつかスクショとってみました。
ダンジョン生成がんばってください。
ttp://bbs.2ch2.net/freedom_uploader/img/1221745526/0181.jpg



Nasu

リンク

2011/10/17(Mon) 15:43:21|NO.42476

さらなるご回答を有難うございます。
スクリーンショットが自分の作りたいものそっくりで驚きました。
詳しい解説を教えてくださりとても参考になりました。



ONION software Copyright 1997-2023(c) All rights reserved.