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