読者です 読者をやめる 読者になる 読者になる

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

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

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

Necro Dancer 迷路生成・探索

再帰的な領域分割での部屋生成まで
あとは部屋と部屋を通路で結ぶ必要がある(ここがなかなか難しい)
f:id:yasu9780:20150622014220j:plain

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