テトリス-タイルは、4x4ブール行列として保存されます。各回転ステップには独自のマトリックスがあり、Tブロックの表現は次のようになります。
[
0, 0, 0, 0,
0, 1, 1, 1,
0, 0, 1, 0,
0, 0, 0, 0
],
[
0, 0, 1, 0,
0, 0, 1, 1,
0, 0, 1, 0,
0, 0, 0, 0
],
[
0, 0, 1, 0,
0, 1, 1, 1,
0, 0, 0, 0,
0, 0, 0, 0
],
[
0, 0, 1, 0,
0, 1, 1, 0,
0, 0, 1, 0,
0, 0, 0, 0
]
ブロックが回転し、ボードと衝突するときのブロックの位置を計算する方法を見つけようとしています(ボードもマトリックスです)。オリジナルのテトリスは、回転が衝突を引き起こす場合、ブロックの回転を許可しません。ゲームの最新のバリアントは、衝突を解決し、ブロックを有効な位置に移動します。
解決すべきいくつかの状況を以下に示します。ボードは6x6、赤 =アクティブブロック、灰色 =配置済み/占有ブロックです。毎回、反時計回りの回転を実行する必要があります。緑のオーバーレイは、ブロックのマトリックスを示します。矢印は、回転を解決するための結果の修正を示します。
- ブロックはボードの左側にあります。ブロックはボードから離れることができないため、回転後に内部に戻す必要があります。
- ブロックは「グラウンド」にヒットしますが、まだ配置/コミットされていません。この場合、衝突を解決するためにタイルを上に移動する必要があります(「I」ブロックの場合、移動は2セル上になります)。
- タイルは使用中のブロックにヒットするため、衝突を解決するには左に移動する必要があります。
- タイルは回転できません。
この問題に取り組む最良の方法は何でしょうか?最適な解決策は、一般的なもの、たとえば 任意のサイズで実装されたボード上の任意の4x4マトリックスブロックで動作します。