AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

ローグのダンジョンを自動生成する(2)

f:id:yasu9780:20150622111116j:plain

部屋を分割する時に、水平分割して失敗したら、垂直分割してみる
を入れたら、部屋数が増えました。
(逆の垂直分割失敗で、水平分割やってみるも、やっている)

前回生成した部屋情報だけ覚えておいて、新しく部屋作った時に
前回の部屋とを道でつなげるだけやってみたんですが、
すべての部屋が道でつながってませんね。
これは、部屋生成→分割失敗→部屋生成みたいな流れの時に、
道が引けないような位置関係になっているのかもしれません。
このへん、再帰処理でデバッグやりにくいので、よくわかってません。
トライ&トライでやっています。

	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;
			}
		}
広告を非表示にする