
部屋を分割する時に、水平分割して失敗したら、垂直分割してみる
を入れたら、部屋数が増えました。
(逆の垂直分割失敗で、水平分割やってみるも、やっている)
前回生成した部屋情報だけ覚えておいて、新しく部屋作った時に
前回の部屋とを道でつなげるだけやってみたんですが、
すべての部屋が道でつながってませんね。
これは、部屋生成→分割失敗→部屋生成みたいな流れの時に、
道が引けないような位置関係になっているのかもしれません。
このへん、再帰処理でデバッグやりにくいので、よくわかってません。
トライ&トライでやっています。
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;
}
}