【#3】~NEXT・移動実装編~新人プログラマーはテトリスを作れるのか?【C#.NET】

2021.06.07

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

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

前回に続き、テトリス作っていきます。今回はNEXTとテトリミノの移動の実装です。キーボード入力で縦横無尽に操作できるようにします。

前回の記事はこちら↓

こんにちは、あんみんどうふでーす。 前回はテトリスを遊ぶ上で欠かせない「フィールド」を作りましたが、今回はもっと重要な要素である「テトリミノ」を実装します。 前回の記事はこちら↓ http://www.terasol.co...

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

3.NEXT・移動の実装

現状では何を移動させればいいのかを書いていない状態なので、まずはそれを決めてくれるNEXT(ネクスト)を実装します。

3-1.NEXT

NEXTとは、ざっくり言うと次に出てくるミノがわかる機能です。ぷよぷよにもありますね。

このNEXTの先頭(next[0])のミノを現在操作しているミノとして使います。厳密に言うと操作するミノはNEXTではないですが、細かいことは気にしない。

 

まずグローバル変数にNEXT関連の変数を用意します。

 

次にNEXTを決定してくれるnextDecideメソッドを作ります。

テトリスのガイドラインによると全種類のミノを偏りなく出す必要があるので、予め配列に1~7の数値を順番に入れてからシャッフルしています。

また、一巡分無くなったらまたシャッフルして後ろから補充するようにしています。

 

ちゃんと動いているか確認してみます。

Loadイベントの一番下に以下のコードを追記します。nextDecideでNEXTを設定し、minoDrawingで最初のミノを描画しています。

そして実行、終了を繰り返します。

このように毎回ランダムでミノが出てきていたらオッケーですね。テトリスに一歩近づいた気がします。

 

次に、NEXTを進めてくれるnextToNextメソッドを作ります。・・・もっと良い名前あったかも。

このメソッドは呼び出される度にNEXTを1つ次に進め、一巡分空っぽになったら補充する役割を持ちます。

NEXTを実装したついで一緒に書いときます。

とりあえず書きましたがテストしようにもする手段がないので、一旦保留して次に操作の部分を作ります。次回やります。

 

3-2.方向キーで操作

ここに来て現在のミノの向きを表す変数を作り忘れていたので、現在の向きを表すグローバル変数を用意します。あぶねー。

 

操作にはKeyDownイベントを使います。上を除く矢印キーで移動、Zキーで左回転、Xキーで右回転の処理を行います。

今は移動処理を作るので左右キーと下キーの処理のみ書きます。

ちなみに後の実装ですが上キーはハードドロップ、Cキーはホールドに使います。

移動処理はminoMovingというメソッドに分けることにしました。配列field上のミノを削除し、座標を移動してから再描画という処理になっています。

引数moveで行く先の方向、引数pwrで移動量を指定しています。

 

さて、さっそく実行して方向キーを押してみます。

ウロウロ・・・ スポッ!!

ちゃんと動いてくれていますが、衝突判定の処理を書いていないので壁抜けしてしまいます。というわけで衝突判定を作ります。

 

3-3.衝突判定

minoMoveCheckメソッドです。directionは移動方向、powerは移動距離。

srsx、srsyはスーパーローテーションをする時の座標のずれですが今は必要ないので、初期値0だけ入れておきます。これはまた後ほど。

現在ミノを1マスずつチェックし、今いる場所から各方向へ移動できるかを確認して大丈夫そうならtrueを返す処理です。

画像にしてわかりやすくしました。まず、赤いマスから緑のマスにかけて順に現在操作しているミノの場所をチェックします。移動方向によってチェックする順番を変えています。

 

次に、各方向に壁があるかをチェックします。例として、右向きのZミノの画像を用意しました。これを1枚目の画像に照らし合わせると、上方向は6・10・11・15になるので、その位置にミノが存在することがわかりました。長くなるので他の方向は割愛します。

画像の緑の部分に壁があればfalseを返し、何もなければ移動できるのでtrueを返します。

また、条件式にchkedという配列を挟んでいますが、これは既に壁のチェックをした列はスキップするためです。

スキップしないと画像のように、1の上が空白だったとしても2の上に空白でない物、即ち壁が存在するのでfalseを返してしまいます。これを防ぐため、1をチェックしたらその下の2はスキップするようにしています。3も同様、チェックしたら4はスキップされます。

 

これをさっきのminoMoving後半のswitch文に条件式で囲んであげます。

 

あとは実行・・・の前に、これを書いて・・・。

実行!

壁やミノを避けてるわけじゃないですよ!ちゃんとぶつかって進めないようになっています。うまくいきました~。

 

ちなみにこの形、テトリスでは「開幕パフェ積み」と呼ばれています。パーフェクトの略称でパフェです。食べたい。

7種すべてのミノを1回ずつ使って作れる形で、空いたスペースにミノを入れてすべて消せるとパーフェクトクリアです。

この形を組んだ後のミノでパーフェクトが取れるか取れないかが決まります。上の画像だとOミノを操作しているので、この後にJミノIミノが来れば取れますね。

パーフェクトが取れなかったとしても比較的形が綺麗なので、Tスピン等に派生しやすくデメリットが少ない技となっています。

ちなみにパーフェクトクリアで相手に攻撃すると、前回のDT砲と同じぐらいの攻撃になります。(ぷよテトの場合。作品によって上下します)

・・・余談でした。

 

次回はミノの設置をできるようにし、更に今回作ったNEXTを可視化できるようにします。

#4 ミノ設置・NEXT表示編に続く。(6月14日更新予定)

Pocket