フィールドの更新 (KATAMINOを解くプログラムを作成する)

★前回の記事

yucatio.hatenablog.com

フィールドにピースが置かれているかどうか判定できたので、今回はフィールドにピースを置く処理を実装します。

実装

ピースが置かれた場所を、pieceIdで更新します。kataminoFieldの値を更新してしまうとスタック内の他のデータにも影響が出てしまうので、コピーを作成してから変更します。

配列の配列をコピーする関数を先に書いておきます。

js/util.js

const util = {
  copyArrayOfArray : (arrayOfArray) => {
    return arrayOfArray.map(array => ([...array]))
  },
}

フィールドを更新するplaceSpin関数とそれを呼び出す部分を実装します。placeSpin関数の中でフィールドのマスの値を置かれたピースの番号(pieceId)で更新します。

js/solver.js

const solver = {
    // 中略

  solve : () => {
    while (solver.solverStack.length > 0) {
      const {kataminoField, minEmpty, pieceId, spinId, spin, unPlacedPiece} = solver.solverStack.pop()

      console.log("pieceId", pieceId)
      console.log("spinId", spinId)

      const offset = {x: minEmpty.x, y: minEmpty.y - spin[0].y}
      
      if (! solver.isAllEmpty(kataminoField, spin, offset)) {
        // フィールドの外か、すでにピースが置かれている
        console.log("フィールドの外か、すでにピースが置かれている")
        continue
      }

      console.log("ピースが置ける")

      // 追加ここから
      const nextField = util.copyArrayOfArray(kataminoField)
      solver.placeSpin(nextField, spin, offset, pieceId)

      console.log("nextField", nextField)
      // 追加ここまで
    }
  },

  // 中略

  // 追加ここから
  placeSpin: (kataminoField, places, offset, pieceId) => {
    places.forEach((place) => {
      kataminoField[place.x + offset.x][place.y + offset.y] = pieceId
    })
  },
  // 追加ここまで
}

動作確認

動作結果です。フィールドが置かれたピースの番号で更新されています。

f:id:yucatio:20190722214005p:plain

以上でフィールドのマスを、置かれたピースの番号で更新することができました。


★次回の記事

yucatio.hatenablog.com

★目次

yucatio.hatenablog.com