次に置くピースの投入 (KATAMINOを解くプログラムを作成する)

★前回の記事

yucatio.hatenablog.com

前回まででスタックに新たにデータを投入する準備が整いました。今回はスタックに次のデータを投入しましょう。

実装

solver.initでデータを投入したのと同じように、まだフィールドに置かれていないピースnextUnPlacedの各スピンに対して、pieceIdspinId, spin,kataminoField, minEmpty, unPlacedPieceをスタックに投入します。

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)

      const nextUnPlaced = unPlacedPiece.filter(id => id !== pieceId)
      console.log("nextUnPlaced", nextUnPlaced)

      if (nextUnPlaced.length <= 0) {
        console.log("完成")
        break
      }

      const nextEmpty = solver.findNextEmpty(nextField, minEmpty)
      console.log("nextEmpty", nextEmpty)

      // 追加ここから
      nextUnPlaced.forEach((nextPieceId) => {
        KATAMINO_ARR[nextPieceId].forEach((nextSpin, nextSpinId) => {
          solver.solverStack.push({kataminoField: nextField, minEmpty: nextEmpty, pieceId:nextPieceId, spinId:nextSpinId, spin: nextSpin, unPlacedPiece: nextUnPlaced,})
        })
      })
      // 追加ここまで
    }
  },
  // 中略
}

動作確認

動作結果です。

(spinId, pieceId) = (9, 1)のピースを置いた後、そのフィールドに対して2,1番のピースが置けるか試しています。

f:id:yucatio:20190725083556p:plain

また、"完成"の文字とすべてのマスが埋まった状態のフィールドが表示されました。

f:id:yucatio:20190725083613p:plain

ここまででKATAMINOを解くプログラムは完成しました。js/main.jssolver.initに渡している値を変えてみて色々な組み合わせを試してみてください。

次回からは画面に表示します。


★次回の記事

yucatio.hatenablog.com

★目次

yucatio.hatenablog.com