HOME > ActionScript > テトリスアルゴリズム > ハードドロップ

ハードドロップ

最大落下

近年のテトリスだとほとんど標準で付いてる機能じゃないかなと思うハードドロップを追加してみます。ハードドロップに使用するキーはSPACEキーを使用します。

ソースファイル pt11.zip

ハードドロップもテトリミノを下へ移動する機能ですが、通常の一つ下へ移動する操作とは違いハードドロップの場合は「一瞬で下まで落下して固定」されます。ただし下まで一気に落ちてもすぐには固定されずに遊び時間がある仕様のテトリスもあるようです。
今回はその固定されずに少し遊び時間が残る仕様でハードドロップを追加します。
一番下まで落下した後に、次の下移動操作(もしくは自動落下)で下のブロックに対するヒット判定を検出するまでは通常通り動かす事が可能なようにします。

通常の下移動処理との違い

通常の下移動は矢印の下キーを押すと登録されているリスナー関数からtetrominoControl()へ下移動指示のコードを渡しつつ処理を移行します。tetrominoControl()は受け取った指示コード(この場合下移動)で処理を分岐してヒット判定をチェックしつつ移動などを行います。

ハードドロップの場合はこのキーイベントのリスナー関数とtetrominoControl()の間にもう一つ「そこから落下できる一番下の座標」を検出する為のgetHardLocation()関数(main.asファイル 988行目)を経由させます。

経由するgetHardLocation()で「そこから落下できる一番下の座標」を検出してからdropLocationのy値を更新し、その後tetrominoControl()メソッドに通常の下移動の時と同じように処理を移行します。

今回の機能追加の為に新しく追加する関数はこのgetHardLocation()のみで、他にはキーイベントのリスナー関数とtetrominoControl()に1~2行追加するだけです(main.asファイル 643行目と753~754行目)。

次のテトリミノの仕様

ハードドロップ用の座標の検出を行うgetHardLocation()関数では、現在のdropLocationのy値からフィールドを下へ向かってデータを走査していき、現在落下中のテトリミノパターンが何かにぶつかるまで探索を繰り返します。
この時、ヒット判定自体を行うのはすでに実装されているoverlapChecker()関数(main.asファイル 1123行目)で行いますので、getHardLocation()は座標を下方向へ順番に辿りながら、都度overlapChecker()にそこでのヒット判定を要求するというプロセスになります。

overlapChecker()は引数で取ったパターンデータを指定された位置に置いた場合にフィールドデータ上で何かにぶつかると言う事がわかると真を返してきます。その為overlapChecker()から真が返った時点のy座標は「何かに重なる位置」なので、それをそのままハードドロップの座標とすることはできません。真が返った位置より-1のy座標がハードドロップ用の座標になります(左図)。

ただしハードドロップの座標はその-1した位置で正しいのですが、処理的にはその後tetrominoControl()に下移動の指示を出しつつ処理を移行しますので、tetrominoControl()の中で一つ下へ移動することを見越しておく必要があります。
その為ハードドロップ用にdropLocationの値を更新する際には、overlapChecker()から真が返ってきたy座標から-2の位置が正解になります(main.asファイル 1007行目)。

ちなみに-1にして処理を移行するするなど、ハードドロップの機能の追加は他の方法でも可能ですが、今回のプログラム構造で追加する場合に一番処理分岐の追加などが少なくて済む方法をとりました。

ハードドロップの連続を防ぐ

ハードドロップの処理はこれで再現完了ですが、一つ対策しておかないといけないことがあります。ハードドロップの連続を防ぐことです。これは、上記までの処理を追加しただけですと、一番下まで落下した後に再度スペースキーを押すと、再び一番下へ移動しようと処理が実行されるため、スペースキーをポンポンと連打しているだけで延々同じ位置でずっと固定されずにいることが可能になってしまいます。

これを防ぐためにはこれが起きる原因と状態を理解すれば難しくありません。この状況が起きるのはハードドロップを実行しようとした時にすでに下に何かがある場合です。そしてこの時にハードドロップ用にdropLocationのy値を-2した場合、その値は必ず現在のy値よりも上の座標(小さい値)になるのです。
この状態を利用してgetHardLocation()のループ処理に評価を加えれば対策は完了です(main.asファイル 1005行目)。

動作確認

動かない時はFlash画面上を一度クリックしてみてください。
ハードドロップに使用するキーはSPACEキーです。
両手を使う事になってしまいスマートじゃないですが、とりあえずSPACEキーで設定しました。

Flashファイルをご覧いただくためには、
アドビシステム株式会社のフラッシュプレーヤー(Flash Player)が必要です。
インストールされていない方は下のボタンから、最新版が無償で入手できます。

Adobe Flash Playerのダウンロード

ソースファイルについて

ソースファイルはasファイルのみです。

使用する環境としてはFlashIDE(動作確認はSC4のみ)を想定していますので。適当に用意したflaファイルに、ダウンロードしたソースファイルをドキュメントクラスとして適切に設定すれば問題無く動作します。
また、コーディングはFlashDevelopを使用して行っておりますので、プロジェクト内にファイルを適切に配置、もしくはクラスパスを設定するなどすればFlashDevelopだけでも問題なく動作します。Stageサイズは幅420px、高さ500pxです。
申し訳ありませんが、ご質問等にはお答えできませんので、ご使用は環境に合わせて各自行ってください。

TOP