★前回の記事
フィールドにピースが置かれているかどうか判定できたので、今回はフィールドにピースを置く処理を実装します。
実装
ピースが置かれた場所を、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 }) }, // 追加ここまで }
動作確認
動作結果です。フィールドが置かれたピースの番号で更新されています。
以上でフィールドのマスを、置かれたピースの番号で更新することができました。
★次回の記事
★目次