★前回の記事
続いてunPlacedPiece
の更新をします。unPlacedPiece
はまだ置かれていないピースの番号を格納しています。置かれたピースの番号をここから削除します。
実装
JavaScriptでは、引数に渡された値と同じ値を削除する関数は用意されていませんので、自分で用意する必要があります。また、フィールドを更新したときと同様に、unPlacedPiece
自体を更新しないように気をつける必要があります。調べたところ、Array.filter
を使用するのが良さそうなので、今回はこちらを使用します。
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) // 追加ここまで } }, // 中略 }
ここで、nextUnPlaced
が空の場合はすべてのピースが置けたということなので、処理を中断します。コードを追加します。
const solver = { // 中略 solve : () => { while (solver.solverStack.length > 0) { // 中略 const nextUnPlaced = unPlacedPiece.filter(id => id !== pieceId) console.log("nextUnPlaced", nextUnPlaced) // 追加ここから if (nextUnPlaced.length <= 0) { console.log("完成") break } // 追加ここまで } }, // 中略 }
動作確認
動作結果です。nextUnPlaced
は置かれたピースの番号(pieceId
)が含まれていません。
以上でunPlacedPiece
から置かれた置かれたピースの番号を削除することができました。
★次回の記事
★目次