★前回の記事
ピースの回転、反転を行うために2次元配列の転置を行います。転置を行う理由については以下の記事を参照してください。
各spinは0番を始めとして以下の順番で生成します。
はじめに0番目のスピンから7番目のスピンを作成します。
コーディング
プログラミングしていきます。 まず、回転した形を格納する配列を宣言し、0番に受け取ったピースを格納します。
0番を転置して7番のspinを作成します。転置を行う関数(transpose)は一旦仮の実装にしてあります。
function createKataminoSpinList(piece) { // 回転した形を格納する配列 let spinArray = [] // 受け取ったピースを格納する spinArray[0] = piece console.log("spinArray[0]", spinArray[0]) // 0番を転置したものが7番 spinArray[7] = transpose(spinArray[0]) console.log("spinArray[7]", spinArray[7]) } /* * 2次元配列の転置をする */ function transpose(spin) { // TODO 実装 return spin }
transpose
を実装していきましょう。もとの配列が2*3
の配列だとしたら、転置後は3*2
の配列になります。JavaScriptでは2次元配列を宣言する構文はないので、配列を宣言後、その配列の各要素にさらに配列を入れます。
転置するには、1番目と2番目のインデックスを入れ替える必要があるので、forEachの2重ループを使います。
function transpose(spin) { // 転置した配列 let transposed = [] // 2次元配列に初期化する spin[0].forEach((_, i) => { transposed[i] = [] }) // 1番目のインデックスと2番目のインデックスを入れ替える spin.forEach((row, i) => { row.forEach((value, j) => { transposed[j][i] = value }) }) return transposed }
実行結果
それぞれのピースを転置したものがコンソールに表示されて入れば成功です。
リファクタリング
ネットを検索したところ、transposeは以下のようにリファクタリングできます。 理解に時間がかかりますが、こちらを採用しても良いでしょう。
function transpose(spin) { return spin[0].map((_, i) => spin.map(row => row[i])); }
先ほど作成したプログラムで、最初の配列の配列を準備するところだけ、以下のようにspin[0]の数だけ空で初期化された配列を用意する方法にしてもよいです。
function transpose(spin) { let transposed = spin[0].map(() => []) spin.forEach((row, i) => { row.forEach((value, j) => { transposed[j][i] = value }) }) return transposed }
以上で転置を実装して、7番の行列を得ることができました。
★次回の記事
★目次