nextUnPlacedは置かれたピースの番号(pieceId)が含まれていません。以上でunPlacedPieceから置かれた置かれたピースの番号を削除することができました。(KATAMINOを解くプログラムを作成する)KATAMINOを解くプログラム★前回の記事yucatio.hatenablog.comフィールドにピースが置かれているかどうか判定できたので、今回はフィールドにピースを置く処理を実装します。実装ピースが置かれた場所を、pieceIdで更新します。kataminoFieldの値を更新してしまうとスタック内の他のデータにも影響が出てしまうので、コピーを作成してから変更します。配列の配列をコピーする関数を先に書いておきます。},}フィールドを更新するplaceSpin関数とそれを呼び出す部分を実装します。placeSpin関数の中でフィールドのマスの値を置かれたピースの番号(pieceId)で更新します。フィールドが置かれたピースの番号で更新されています。以上でフィールドのマスを、置かれたピースの番号で更新することができました。(KATAMINOを解くプログラムを作成する)KATAMINOを解くプログラム★前回の記事yucatio.hatenablog.com前回まででスピンをどこに移動するか求めることができたので、今回はその位置に置けるかどうかを判定する関数を作成します。ピースがフィールドに置ける条件は、以下の2点を満たすことです。実装フィールドにスピンが置けるかを判定する、isAllEmpty関数とisEmpty関数を定義します。isAllEmptyは、スピンが置かれるすべてのマスが、フィールドの範囲内でまだピースが置かれていないときにtrueを返す関数です。isEmptyは、placeの位置がフィールドの外でなく、かつまだピースが置かれていないときにtrueを返す関数です。はじめに呼び出し側の実装をします。isAllEmptyでスピンが置けるか判定し、置けなかった場合には処理を中断し、ループの先頭に戻ります。追加ここまで}isAllEmptyからisEmptyを呼び出しましょう。コールバックに渡された関数が、配列のすべての要素に対して、true相当を返すかどうかを判定します。isEmptyの引数には、スピンが実際に置かれるマスを渡すので、offsetをそれぞれ加算した値を渡しています。},次に、isEmpty関数を実装します。placeの位置がフィールドの内のときにtrueを返すようにします。JavaScriptの場合は、配列の定義外の範囲を参照するとundefinedが返ってくるので、それで判定します。place.xもplace.yもundefinedでなければフィールドの範囲内です。},次に、置こうとする場所にすでに他のピースが置かれていないことを判定します。フィールドにピースが置かれているときはそのピースの番号、置かれていないときは-1なので、ピースが置かれているかどうかは0より小さいかどうかで判定します。コンソールの出力はこのようになっています。1)が初期状態で置けることが分かり、コンソールの出力結果と一致していることが分かります。(KATAMINOを解くプログラムを作成する)KATAMINOを解くプログラム★前回の記事yucatio.hatenablog.comスタックからフィールドとスピン情報を取得することができたので、ピースが置けるか判定していきます。minEmptyのマスに重なるようにピースを置くのでした。minEmptyは、フィールドのピースが置かれていないマスのうち、1番上の行で1番左にあるマスです。置くスピンの一番上の左端とminEmptyを重ねます。これ以外のマスを重ねようとしてもすでにあるピースと重なってしまったり枠の外に出たりしてしまいます。(ただしスピンの1番上の左端を重ねたからと言って必ずしも他のピースと重ならないわけではないです)minEmptyと重なるようにピースを置いた例↓フィールドからはみ出していて、他のピースとも重なっているminEmptyと重なるようにピースを置いた例↓フィールド内に収まっていて、他のピースとも重なっていない幸いな事に、spinの1番上の1番左にあたる場所はspin[0]です。これは2次元配列からリストを作成した時に、1番上の列の左からリストにしていったためです。スピンをminEmptyと重なるように移動します。x方向(下方向)にはminEmpty.xぶん移動します。spin[0].yぶん移動します。実装コードにしていきます。spinの移動量をoffsetという変数に格納します。},}pieceの各値にoffsetを足したものが実際のピースが置かれる場所になります。