テトリスで回転した要素の位置を決定する


24

テトリス-タイルは、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、 =アクティブブロック、灰色 =配置済み/占有ブロックです。毎回、反時計回りの回転を実行する必要があります。緑のオーバーレイは、ブロックのマトリックスを示します。矢印は、回転を解決するための結果の修正を示します。

テトリスブロック回転

  1. ブロックはボードの左側にあります。ブロックはボードから離れることができないため、回転後に内部に戻す必要があります。
  2. ブロックは「グラウンド」にヒットしますが、まだ配置/コミットされていません。この場合、衝突を解決するためにタイルを上に移動する必要があります(「I」ブロックの場合、移動は2セル上になります)。
  3. タイルは使用中のブロックにヒットするため、衝突を解決するには左に移動する必要があります。
  4. タイルは回転できません。

この問題に取り組む最良の方法は何でしょうか?最適な解決策は、一般的なもの、たとえば 任意のサイズで実装されたボード上の任意の4x4マトリックスブロックで動作します。


おもしろい.. 1年前にテトリスをやったのですが、マトリックスを回転させて元のものを保持しました。何かが重なっている場合は、オリジナルを使用しました。うまくいきました。私はかなり頻繁にテストプレイをしましたが、問題に遭遇することはありませんでした。幸運だったに違いない。興味深いトピックをありがとう!
snitch182

回答:


16

あなたが説明する状況は、「壁キック」と呼ばれます。

壁のキックは、プレイヤーが通常、回転後にそのテトロミノが占める正方形にスペースが存在しないときにピースを回転させるときに発生します。

...

最も簡単なウォールキックアルゴリズムは... tetrominoを1スペース右に移動し、次に1スペース左に移動して、どちらも実行できない場合は失敗することです。

さまざまなテトリス回転システムがあり、すべてウィキアに文書化されています:Rotation Systems

SRSは「公式の」テトリス仕様であり、テーブル含むウォールキック用の非常に複雑なアルゴリズムを備えています。最終ピースは、元のピースとまったく重ならない場合もあります。

DTET回転システムは、ちょうど右と左以外の他の5つの壁キックをチェックすることで、もっとも簡単なアルゴリズムを拡張します。すべてのピースは同じルールに従います。


+1、興味深いウィキ。Iブロックを1つ左または右に移動しても機能しませんが。より高度な回転システムは、ブロックごとに異なるルールを適用しているようです。
-bummzack

1
@bummzack:それでは、DTETシステムのようなすべてのブロックに同じテーブルを使用してください。左右以外の場所をテストするだけです。独自のシステムを作成して、必要なポジションをいくつでも確認できます。ただし、すべてのピースに同じテーブルを使用すると、「不自然な」壁キックが許可される場合があります。
レフティウム

編集していただきありがとうございます。これらは実際にウィキアの資料よりもはるかに優れています。とても有難い。
bummzack
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.