再帰的な領域分割での部屋生成まで
あとは部屋と部屋を通路で結ぶ必要がある(ここがなかなか難しい)
mapは100x100で、縦または横に分割しながら再帰呼び出しして
領域が狭くなったら部屋を作って、親に戻るって感じの動き。
public int[,] map; for(int y=0;y<=99;y++) for(int x=0;x<=99;x++) map[x,y]=1; divMap(1,1,98,98,5); void divMap(int x1,int y1,int x2,int y2,int depth) { if(x2-x1<=8) return; if(y2-y1<=8) return; if( (x2-x1<=20) && (y2-y1<=20) ) { makeRoom(x1,y1,x2,y2);return; } if(Random.Range(1,100)<50) { int x=Random.Range(x1+2,x2-2); divMap(x1,y1, x,y2,depth-1); divMap( x,y1,x2,y2,depth-1); } else { int y=Random.Range(y1+2,y2-2); divMap(x1,y1,x2, y,depth-1); divMap(x1, y,x2,y2,depth-1); } } void makeRoom(int x1,int y1,int x2,int y2) { int startx=Random.Range(7,10); int starty=Random.Range(7,10); int cx=(x1+x2)/2; int cy=(y1+y2)/2; for(int size2=startx;size2>=3;size2--) for(int size=starty;size>=3;size--) { if( (x1<cx-size) && (y1<cy-size2) && (x2>cx+size) && (y2>cy+size2) ) { for(int y=cy-size2;y<=cy+size2;y++) for(int x=cx-size;x<=cx+size;x++) { map[x,y]=0; } break; } } }