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);