棒倒し法による迷路作成

var makeMaze = mazeSize => {

	// 外枠を作成
	var fld = [...Array(mazeSize)].map(_=>[...Array(mazeSize)].map(_=>0));
	var initMap = (fld,y,x) => (x==0 || y==0 || x==mazeSize-1 || y==mazeSize-1) ? 1 : fld[y][x];
	fld = fld.map((arr,y)=>arr.map((_,x)=>initMap(fld,y,x)));

	// 内側に柱を作成
	var isEven = n => n % 2 == 0;
	var spawnPole = (fld,y,x) =>  ( fld[y][x] == 0 && isEven(x) && isEven(y) ) ? 2 : fld[y][x];
	fld = fld.map((arr,y)=>arr.map((_,x)=>spawnPole(fld, y, x)));

	// 柱を倒す
	var downPole = (fld,x,y) => {
		if (fld[y][x] != 2) { return; }
		// 最上段は4方向、それ以外は3方向のうちランダムで方向を決める
		var n=Math.floor(Math.random() * (y == 2 ? 4 : 3));
		// 倒す方向を算出して倒す
		var py=Math.round(Math.sin(Math.PI / 2 * n));
		var px=Math.round(Math.cos(Math.PI / 2 * n));
		fld[y+py][x+px] = 3;
	};
	fld.forEach((arr,y)=>arr.forEach((_,x)=>downPole(fld,x,y)));

	// 表示
	fld
		.map(arr=>arr.map(n=>n==0 ? ' ' : '#'))
		.forEach(arr=>console.log(arr.join("")));

};

makeMaze(21);