【#13】~ソフトドロップ編~新人プログラマーはテトリスを作れるのか?【C#.NET】

2021.08.16

CATEGORY : C#.NET プログラミング

こんにちは、あんみんどうふです。

今回はソフトドロップの実装です。というよりは、ミノを設置した時の”待機時間”を実装します。これにより回転入れの際に意図しない置きミスの発生率が下がります。

前回の記事はこちら。

こんにちは、あんみんどうふです。 今回はDASとARRの実装です。今まで結構テトリスやってきている私も単語自体は初めて聞きました。 前回の記事はこちら。 https://www.terasol.co.jp/%e3%83%9...

全編見たい方はタグからどうぞ。

13-0.ソフトドロップとは?

以前、上キーを入力することで何かにぶつかるまで真下へ落下させる「ハードドロップ」を実装しました。
その対となる「ソフトドロップ」とは、下キーを入力することでミノの落下速度を速めるものです。

・・・ですが、これ自体は前回のDAS・ARRで既にできあがっています。左右の移動はDASが終了してからARRに移行しますが、下への移動はDAS無しで直接ARRを行います。
この処理はもう書いちゃってるので何もしなくてもオッケーですね。

 

で、本題です。

本家テトリスではソフトドロップや自由落下でミノを設置した時、約0.5秒の待機時間があります。この間に位置の微調整を行ったり、設置まで待つことができます。
今回はこれを実装します。

 

13-1.ソフトドロップ

待機時間が発生するタイミングは下にブロックがある時です。勿論、床も同様です。
待機時間は0.5秒で、経過後にミノが設置されます。

ただ、これだけだと一番下まで行って0.5秒経過した時点で強制設置となるため、Tスピンミニのような回転入れを行う時間が足りず難しくなってしまいます。

なので、これを遅延できるようにする必要があります。

 

ということで、ミノが落下・回転する度に待機時間をリセットさせるようにします。永遠に同じミノで操作できるのも困るので、リセットした回数が8回に到達した時点でその場に強制設置します。

(参考: Lock Delay – Hard Drop – Tetris Wiki

 

 

時間経過で処理を行いたいので、デザイナーを開きTimerを1つ追加します。

nameは「softDropTimer」にしました。毎ミリ秒チェックするのでIntervalは1にしています。(処理がちょっと重くなりそうだけど…)

内容は後で書きますが、予めsoftDropTimerのTickイベントを作成しておきます。

 

Tips. softDropTimerのデバッグ

結構複雑なのでDAS・ARR同様デバッグ用のLabel「debugViewLockDelay」を置いてます。
待機時間を表示させてます。これが500になったら設置。


 

コードに戻り、ソフトドロップ関連の変数を追加します。いつものグローバルの所に追記する形で。

softDropWatchは0.5秒数えるためのストップウォッチです。
先程作成したsoftDropTimerは毎ミリ秒チェックするためのもので、softDropWatchで0.5秒経過したらsoftDropTimerから設置処理を呼び出すようにします。

DROP_LOCK_DELAYは待機時間です。500ミリ秒=0.5秒。
本家テトリスは作品によって異なります。

dropDelayが待機時間を遅延した回数で、その上限がTURN_DELAY_MAXです。

 

新規メソッド「softDropRun」を追加します。ここはソフトドロップによる設置の処理を書きます。

タイマーを止め、ストップウォッチをリセットし、ミノの設置を行います。ソフトドロップの本体ですね。

 

更に新規メソッド「dropDelayCheck」を追加します。遅延回数をカウントし、上限に達したら強制設置させます。

 

先程作成したsoftDropTimer_Tickに以下のコードを書きます。

当たり前ですが、毎ミリ秒実行するので簡潔な処理にしました。正直毎ミリ秒実行させてる時点でもっといい方法があるように思いますが・・・。
処理時点で待機時間が0.5秒経過していればsoftDropRunを行います。

 

ここからは追記地獄です。

まずはmainForm_KeyDownのKeys.Up, Keys.Z, Keys.Xから。

ハードドロップはフラグで管理するようにしました。minoMovingの第3引数がtrueであればハードドロップとみなしています。
回転は行う度に待機時間リセットさせてます。通常の回転は遅延回数にカウントされないので、dropDelayの増加はありません。

 

次にminoMovingです。

まあいろいろやってます。
bool型引数「hard」を追加し、これをハードドロップを使ったフラグとしています。ハードドロップを行うと設置処理に直接移行させてます。

 

最後にminoTurnです。

スーパーローテーションの回転である場合、遅延回数を1増やしています。

 

ソフトドロップ実装完了です。遅延もできてますね。

 

だいぶやりたいことやりきったので、そろそろ一区切りつけたいと思います。

次回は設定画面を作ります。オプションってやつですね。私はどのゲームでも始める前にオプションからいじる派です。

#14 設定画面編へ続く。

こんにちは、あんみんどうふです。 今回は設定画面の作成です。操作するキーやミノの色を変えたり、ゲームの仕様をいじったりできるようにします。 前回の記事はこちら。 https://www.terasol.co.jp/%e3%...