★前回の記事
前回まででスタックに新たにデータを投入する準備が整いました。今回はスタックに次のデータを投入しましょう。
実装
solver.init
でデータを投入したのと同じように、まだフィールドに置かれていないピースnextUnPlaced
の各スピンに対して、pieceId
とspinId
, 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番のピースが置けるか試しています。
また、"完成"の文字とすべてのマスが埋まった状態のフィールドが表示されました。
ここまででKATAMINOを解くプログラムは完成しました。js/main.js
のsolver.init
に渡している値を変えてみて色々な組み合わせを試してみてください。
次回からは画面に表示します。
★次回の記事
★目次