yucatio@システムエンジニア

趣味で作ったものいろいろ

2次元配列からピースがある場所のリストを作成する (KATAMINOを解くプログラムを作成する)

★前回の記事

yucatio.hatenablog.com

2次元配列からピースがある場所のリストを作成します。こちらの記事を参考にしてください。

yucatio.hatenablog.com

現在はピースを以下のように2次元配列で表現しています。ピースの場所を1, ピースでない場所を0で表現しています。

f:id:yucatio:20190620083647p:plain:w200

[
  [1, 1, 0],
  [0, 1, 0],
  [0, 1, 1]
]

ここからリストの形式に変換します。

f:id:yucatio:20190620084008p:plain:w200

[
  {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
}

動作確認

実行結果です。ピースが置かれている場所のリストが表示されました。

f:id:yucatio:20190716084053p:plain

リファクタリング

matrixToListreducefiltermapなどを使って一時的な配列を宣言せず記述することも可能ですが、 現在のままの方がわかりやすいので、このままにします。

仕上げ

最後に、作成した関数を画面に表示します。

const KATAMINO_ARRAY = KATAMINO_ORG_ARRAY.map((piece, pieceId) => createKataminoSpinList(piece, pieceId))

document.write("const KATAMINO_ARR = " + JSON.stringify(KATAMINO_ARRAY))

function createKataminoSpinList(piece) {
  // 略
}

実行結果です。この結果を次回使用します。

f:id:yucatio:20190721112716p:plain

以上で2次元配列からピースがある場所のリストを作成することができました。KATAMINOを解くためのピースの準備がこれで整いました。


★次回の記事

yucatio.hatenablog.com

★目次

yucatio.hatenablog.com