ダンジョンですが、廊下をつなげる方法を、今までは、一つ前に作った部屋と2つ前に作った部屋につないでいましたが、領域分割の状況によっては、かなり離れた部屋に廊下をつなげてしまう場合があったので、
以下のようにリストを調べて、一番近い部屋に廊下をつなげるようにしました。
void connectRoom(int x1,int y1,int x2,int y2 ,int depth) { Vector2 pos0 = new Vector2( (x1+x2)/2 , (y1+y2)/2 ); float min=99999f; int target=0; for(int i=0;i<RoomList.Count-1;i++) { if(RoomList[i]==null) continue; prex1=RoomList[i].x1; prey1=RoomList[i].y1; prex2=RoomList[i].x2; prey2=RoomList[i].y2; Vector2 pos =new Vector2( (prex1+prex2)/2 , (prey1+prey2)/2 ); float dis = Vector2.Distance( pos0,pos); if(min > dis ) { target=i;min=dis; } } if( RoomList[target]==null ) return;; prex1=RoomList[target].x1; prey1=RoomList[target].y1; prex2=RoomList[target].x2; prey2=RoomList[target].y2; int pcx=(prex1+prex2)/2; int pcy=(prey1+prey2)/2; int cx=(x1+x2)/2; int cy=(y1+y2)/2; if(prex2<x1) { if( pcy<=cy ) makeRoadH(prex2,pcy,x1,cy,1,1); else makeRoadH(prex2,pcy,x1,cy,1,-1); } else if(x2<prex1) { if( pcy<=cy ) makeRoadH(prex2,pcy,x1,cy,-1,1); else makeRoadH(prex2,pcy,x1,cy,-1,-1); } else if( prey2<y1 ) { if( pcx<=cx ) makeRoadV( pcx,prey2,cx,y2,1,1); else makeRoadV( pcx,prey2,cx,y2,-1,1); } else if(y2<prey1) { if( pcx<=cx ) makeRoadV( pcx,prey2,cx,y2,1,-1); else makeRoadV( pcx,prey2,cx,y2,-1,-1); } }
これでtarget要素が一番近い部屋です(部屋の中心と中心の距離で調べています)
(自分の部屋はRoomList.Count-1なので)
例えば、プレイヤー初期位置から、ある部屋までの距離が遠いほど、より強いモンスターを配置したり、より良い財宝を置けば、自動的な難易度設定として望ましいと思います。
でも、なんかLSIの自動配線みたいだな(^_^;)