JavaScriptで値を指定して削除する(置かれていないピースの更新) (KATAMINOを解くプログラムを作成する)

★前回の記事

yucatio.hatenablog.com

続いて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)が含まれていません。

f:id:yucatio:20190722215416p:plain

以上でunPlacedPieceから置かれた置かれたピースの番号を削除することができました。


★次回の記事

yucatio.hatenablog.com

★目次

yucatio.hatenablog.com