★前回の記事
2次元配列からピースがある場所のリストを作成します。こちらの記事を参考にしてください。
現在はピースを以下のように2次元配列で表現しています。ピースの場所を1
, ピースでない場所を0
で表現しています。
[ [1, 1, 0], [0, 1, 0], [0, 1, 1] ]
ここからリストの形式に変換します。
[ {x:0, y:0}, {x:0, y:1}, {x:1, y:1}, {x:2, y:1}, {x:2, y:2} ]
実装
2次元配列を受け取り、値が1
のインデックスのリストを作成する関数matrixToList
を作成します。
function matrixToList(spin) { // 変換後の値を格納する配列 const places = [] spin.forEach((row, i) => { row.forEach((value, j) => { if (value === 1) { // 値が1だったら場所を変換後の配列に追加する places.push({x:i, y:j}) } }) }) return places }
2重のループを回して、値が1
のときは、その時のインデックスを配列に追加しています。
createKataminoSpinList
からこの関数を呼び出します。
function createKataminoSpinList(piece) { // 回転した形を格納する配列 let spinArray = [] spinArray[0] = copyArrayOfArray(piece) // 中略 spinArray[4] = transpose(spinArray[3]) // スピンの重複を取り除く const uniqSpinArr = uniqSpin(spinArray) // 各スピンをリストの形式に変換する const spinLists = uniqSpinArr.map((uniqSpin) => matrixToList(uniqSpin)) console.log("spinLists", spinLists) return spinLists }
動作確認
実行結果です。ピースが置かれている場所のリストが表示されました。
リファクタリング
matrixToList
はreduce
やfilter
、map
などを使って一時的な配列を宣言せず記述することも可能ですが、
現在のままの方がわかりやすいので、このままにします。
仕上げ
最後に、作成した関数を画面に表示します。
const KATAMINO_ARRAY = KATAMINO_ORG_ARRAY.map((piece, pieceId) => createKataminoSpinList(piece, pieceId)) document.write("const KATAMINO_ARR = " + JSON.stringify(KATAMINO_ARRAY)) function createKataminoSpinList(piece) { // 略 }
実行結果です。この結果を次回使用します。
以上で2次元配列からピースがある場所のリストを作成することができました。KATAMINOを解くためのピースの準備がこれで整いました。
★次回の記事
★目次