【#7】~ハードドロップ・ホールド編~新人プログラマーはテトリスを作れるのか?【C#.NET】

2021.07.05

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

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

今回はミノを即時落下させる「ハードドロップ」、ミノを1つだけ保持できる「ホールド」の実装を行います。

前回の記事はこちら。

こんにちは、あんみんどうふです。 今回はより直感的に回転できる仕様、スーパーローテーションを実装します。多分ここが一番のつまづきポイント。 前回の記事はこちら。 https://www.terasol.co.jp/%e3%...

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

7-0.各機能のおさらい

ハードドロップ」は上方向に1回入力することで、操作しているミノを一番下まで即時落下させるものです。テトリスに慣れてくると8割ぐらいはこれで落下させます。

ちなみに下方向に入力し続けることで、即時ではないですが普通よりも高速で落下させることを「ソフトドロップ」と呼びます。本家のテトリスにより近づけたいならこれも必要ですが、Windowsの仕様で勝手にそれっぽくなっているので今のところは保留します。

 

ホールド」は操作しているミノを1つだけ取っておくことができる機能です。例えるとポケットに1つしまっておくみたいな感じです。

ホールドが空の時はそこにミノを保持してNEXTを次に進めますが、既に入っているときはホールド内と操作中のミノが入れ替わります。

また、ミノを設置し終えるまでに一回しか使えない制限もあります(設置したら再度使えます)。

 

どんなものかを再確認したところで早速作っていきます。

7-1.ハードドロップ

上に入力したら発動します。キーを司る部分といったらアレっしょ!ということで、KeyDownイベントをいじります。

上キーを押したら何かにぶつかるまでずっと下方向へ移動させます。
while文だけだとぶつかったらその場で止まってしまうので、もう一歩進ませると設置処理をしてくれます。これだけ。

 

7-2.ホールド

ホールドも描画する必要があるので、デザイナーを開きpictureboxを一つ追加します。NEXTのpictureboxをコピペし、nameは「view_hold」にしました。
場所はフィールドの左上隣に配置します。これに関してはガイドライン通りです。

 

コードに戻り、グローバル変数の所に変数holdを追加します。これはホールド中のミノを表します。
そしてもう一つ、変数usedHoldを追加します。ホールドはミノを1回設置し終えるまでに一度しか使えないので、bool型変数でフラグを管理します。

 

次に、新しいメソッドholdDrawingを追加します。その名の通りホールドの描画です。
コードもnextDrawingからコピペして若干修正したぐらいです。

 

そして処理の部分を書くために新しくholdControlメソッドを作成します。

一旦フィールドに描画している現在ミノを削除し、ホールド中のミノと現在ミノを交換します。もしホールドが空の場合、ホールドに現在ミノを入れて次のNEXTに進めるためnextToNextメソッドを呼び出しています。
また、一度設置するまで1回しか使えないようにするため、先ほど作ったbool型変数「hold」でフラグの管理をします。

 

最後に、minoDropに”ホールド使用フラグ”を解除するように追記します。

 

ハードドロップとホールドが完成しました。これで安定して開幕パフェが組めますね。最後回転入れ1回ミスってるけど…

 

欲しかった機能はだいたい作り終えましたが、テトリスプレイヤーからするとまだまだ違和感が抜けきっていません・・・。

というわけで、次回はマス目ゴーストの実装をします。ゴーストとは、現在位置から落下させた時のプレビューみたいなものをリアルタイムで表示させる機能です。

#8 マス目・ゴースト実装編へ続く(7月12日投稿予定)。

こんにちは、あんみんどうふです。 今回はフィールドを見やすくするためにマス目と、ミノの置く場所をわかりやすくするためにゴーストを実装します。 前回の記事はこちら。 https://www.terasol.co.jp/%e3...

 

↓ちょっとした番外編です。

こんにちは、あんみんどうふです。間に挟んでちょっとしたことをします。 前回の記事はこちら。 全編見たい方はタグからどうぞ。 ...