SlidePuzzle: 操作が有効かどうかを検証する

SlidePuzzle ゲーム内部に組み込まれているシステムについての説明です。

自身の制作したパズルゲームでは、スワイプ、タップ、もしくはキーボード操作でブロックをスライドさせることができます。
実際のパズルゲームであれば、ブロックが枠を飛び出したり、重なったりすることは起こりえません。
しかし、アプリケーション上では操作時に、その操作が有効かどうかを判断する必要があります。

ブロックの生成方法

例えば、4 × 4のパズルなら、4 × 4のマス目のうち、15ブロックが埋まっており、残り1ブロックが空いています。
この時、システム上、空いているブロックは”air”(空気)というブロックとして扱います。可視性のないブロックが存在している状態です。表示上、”air”は透明にしておきます。

スライドの方法

そして、可視性のあるブロックと可視性のないブロックを入れ替えることでスライドを行っています。
入れ替える際に入れ替えの対象にするブロックは、操作の方向によって変化します。
その際に、左上から数えて何番目のブロックを入れ替えるかを指定します。以下は4 × 4の場合の入れ替え対象を指定するそれぞれの処理です。

左スライド : “air” と [現在の”air”の位置 – 1] 番目のブロック を入れ替え
右スライド : “air” と [現在の”air”の位置 + 1] 番目のブロック を入れ替え
上スライド : “air” と [現在の”air”の位置 – 4] 番目のブロック を入れ替え
下スライド : “air” と [現在の”air”の位置 + 4] 番目のブロック を入れ替え

“air”が枠の端にあるなら動かさない

4 × 4で、「左上から何番目か」でブロックを指定し、入れ替える時、

「左上から4番目のブロック」(1段目の最も右)と

「左上から5番目のブロック」(2段目の最も左)の入れ替えが発生した際(4番目のブロックを右に移動しようとした場合)、実際のパズルでは起こり得ないブロックの移動が発生します。

例えば、このように”air”(見えないブロック)が右上にある場合、

「4を右に移動する、もしくは7を上に移動する」

以外の操作は行えないべきです。

実際には起こり得ないスライドを防止するため、スライドが行われる際には、毎回、そのスライドの方向が枠の中かを検証します。

左スライド : “air” が最も右の縦列にあるなら実行しない
右スライド : “air” が最も左の縦列にあるなら実行しない
上スライド : “air” が最も下の横列にあるなら実行しない
下スライド : “air”が最も上の横列にあるなら実行しない

これらを処理として実装するために、このような条件分岐を行っています。

左スライド: “air”の位置を4で割った余り = 0だったら実行しない
右スライド: “air”の位置を4で割った余り – 1 = 0 だったら実行しない
上スライド: “air”の位置が13以上だったら実行しない
下スライド: “air”の位置が4以下 だったら実行しない

これらの条件の元、実際のパズルと同様の挙動をアプリケーション上で再現します。

SlidePuzzle: 操作が有効かどうかを検証する