部屋を分割する時に、水平分割して失敗したら、垂直分割してみる
を入れたら、部屋数が増えました。
(逆の垂直分割失敗で、水平分割やってみるも、やっている)
前回生成した部屋情報だけ覚えておいて、新しく部屋作った時に
前回の部屋とを道でつなげるだけやってみたんですが、
すべての部屋が道でつながってませんね。
これは、部屋生成→分割失敗→部屋生成みたいな流れの時に、
道が引けないような位置関係になっているのかもしれません。
このへん、再帰処理でデバッグやりにくいので、よくわかってません。
トライ&トライでやっています。
int prex1,prey1,prex2,prey2; int divMap(int x1,int y1,int x2,int y2,int depth) { if(x1<1 || y1<1 || x2>98 || y2>98) return 0; if(x2-x1<=6) return 0; if(y2-y1<=6) return 0; if( (x2-x1<=20) && (y2-y1<=20) ) { makeRoom(x1,y1,x2,y2);return 1; } int cx=(x1+x2)/8; int cy=(y1+y2)/8; if(Random.Range(1,100)<50) { int x=Random.Range(x1+cx,x2-cx); int r=divMap(x1,y1, x,y2,depth-1); if(r==1) divMap( x,y1,x2,y2,depth-1); else { int y=Random.Range(y1+cx,y2-cx); divMap(x1,y1,x2, y,depth-1); divMap(x1, y,x2,y2,depth-1); } } else { int y=Random.Range(y1+cx,y2-cx); int r=divMap(x1,y1,x2, y,depth-1); if(r==1) divMap(x1, y,x2,y2,depth-1); else { int x=Random.Range(x1+cx,x2-cx); divMap(x1,y1, x,y2,depth-1); divMap( x,y1,x2,y2,depth-1); } } return 1; } void connectRoom(int x1,int y1,int x2,int y2 ) { if(prex2<x1) { for(int x=prex2;x<=x1 && x<99;x++) map[x,(prey1+prey2)/2]=0; for(int y=(prey1+prey2)/2;y<=(y1+y2)/2 && y<99 && map[x1,y]!=0;y++) map[x1,y]=0; for(int y=(prey1+prey2)/2;y>=(y1+y2)/2 && y>1 && map[x1,y]!=0;y--) map[x1,y]=0; } else if(x2<prex1) { for(int x=prex1;x<=x2 && x>0;x--) map[x,(y1+y2)/2]=0; for(int y=(prey1+prey2)/2;y<=(y1+y2)/2 && y<99 && map[x2,y]!=0;y++) map[x2,y]=0; for(int y=(prey1+prey2)/2;y>=(y1+y2)/2 && y>1 && map[x2,y]!=0;y--) map[x2,y]=0; } else if(prey2<y1) { for(int y=prey2;y<=y1 && y<99;y++) map[(x1+x2)/2,y]=0; for(int x=(prex1+prex2)/2;x<=(x1+x2)/2 && x<99 && map[x,y1]!=0;x++) map[x,y1]=0; for(int x=(prex1+prex2)/2;x>=(x1+x2)/2 && x>1 && map[x,y1]!=0;x--) map[x,y1]=0; } else if(y2<prey1) { for(int y=prey1;y<=y2 && y>0;y--) map[(x1+x2)/2,y]=0; for(int x=(prex1+prex2)/2;x<=(x1+x2)/2 && x<99 && map[x,y2]!=0;x++) map[x,y2]=0; for(int x=(prex1+prex2)/2;x>=(x1+x2)/2 && x>1 && map[x,y2]!=0;x--) map[x,y2]=0; } } void makeRoom(int x1,int y1,int x2,int y2) { if(x1<1 || y1<1 || x2>98 || y2>98) return; if(x2<=x1) return; if(y2<=y1) return; int startx=Random.Range(3,7); int starty=Random.Range(3,7); int cx=(x1+x2)/2; int cy=(y1+y2)/2; for(int size2=startx;size2>=2;size2--) for(int size=starty;size>=2;size--) { if( (x1+1<cx-size) && (y1+1<cy-size2) && (x2-1>cx+size) && (y2-1>cy+size2) ) { int x=0; int y=0; for(y=cy-size2;y<=cy+size2;y++) for(x=cx-size;x<=cx+size;x++) { if(x<1 || x>98 || y<1 || y>98 ) continue; map[x,y]=0; } connectRoom(cx-size,cy-size2,cx+size,cy+size2); prex1=cx-size;prey1=cy-size2; prex2=cx+size;prey2=cy+size2; return; } }