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

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

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

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

Necro Dancer 迷路生成・探索

f:id:yasu9780:20150622115946j:plain

経路生成を見なおしたらだいぶマシになった。
一つ前の部屋と必ず繋がっていれば、必ずすべての部屋がつながっていることが保証されるはず。
つながってないなら、ツルハシで壊せば行けるので、隠し部屋ということで(ゝω・)

	void makeRoadH(int x1,int y1,int x2,int y2,int dx,int dy)
	{
		int cx=(x1+x2)/2;
		int cy=(y1+y2)/2;
		for(int x=x1;x!=cx && x>0 && x<99 && map[x,y1]>=0;x+=dx) map[x,y1]=0;
		for(int y=y1;y!=y2 && y>0 && y<99 && map[cx,y]>=0;y+=dy) map[cx,y]=0;
		for(int x=cx;x!=x2 && x>0 && x<99 && map[x,y2]>=0;x+=dx) map[x,y2]=0;
	}
	void makeRoadV(int x1,int y1,int x2,int y2,int dx,int dy)
	{
		int cx=(x1+x2)/2;
		int cy=(y1+y2)/2;
		for(int y=y1;y!=cy && y>0 && y<99 && map[x1,y]>=0;y+=dy) map[x1,y]=0;
		for(int x=x1;x!=x2 && x>0 && x<99 && map[x,cy]>=0;x+=dx) map[x,cy]=0;
		for(int y=cy;y!=y2 && y>0 && y<99 && map[x2,y]>=0;y+=dy) map[x2,y]=0;
	}
	void connectRoom(int x1,int y1,int x2,int y2 )
	{
		if(prex2<x1 && (prey1+prey2)/2<=(y1+y2)/2)
		{
			makeRoadH(prex2,(prey1+prey2)/2,x1,(y1+y2)/2,1,1);
		}
		else
		if(prex2<x1 && (prey1+prey2)/2>(y1+y2)/2)
		{
			makeRoadH(prex2,(prey1+prey2)/2,x1,(y1+y2)/2,1,-1);
		}
		else
		if(x2<prex1 && (prey1+prey2)/2<=(y1+y2)/2)
		{
			makeRoadH(prex2,(prey1+prey2)/2,x1,(y1+y2)/2,-1,1);
		}
		else
		if(x2<prex1 && (prey1+prey2)/2>(y1+y2)/2)
		{
			makeRoadH(prex2,(prey1+prey2)/2,x1,(y1+y2)/2,-1,-1);
		}

		else
		if(prey2<y1 && (prex1+prex2)/2<=(x1+x2)/2)
		{
			makeRoadV((prex1+prex2)/2,prey2,(x1+x2)/2,y2,1,1);
		}
		else
		if(prey2<y1 && (prex1+prex2)/2>(x1+x2)/2)
		{
			makeRoadV((prex1+prex2)/2,prey2,(x1+x2)/2,y2,-1,1);
		}
		else
		if(y2<prey1 && (prex1+prex2)/2<=(x1+x2)/2)
		{
			makeRoadV((prex1+prex2)/2,prey2,(x1+x2)/2,y2,1,-1);
		}
		else
		if(y2<prey1 && (prex1+prex2)/2>(x1+x2)/2)
		{
			makeRoadV((prex1+prex2)/2,prey2,(x1+x2)/2,y2,-1,-1);
		}
	}
広告を非表示にする