今回はぷよぷよもどきを作ります。

ぷよぷよ – Wikipedia

によると

フィールドは基本的に縦12マス×横6マスの格子で構成される。
上からぷよが2つ1組で落下してくる(「組ぷよ」と呼ばれる)。
ぷよは種類ごとに色が異なり、色は3-5色(通常は4色)ある。
プレイヤーはぷよに対して回転、横移動、高速落下のいずれかの操作を行う。
次に落下するぷよはフィールドの枠外に「NEXTぷよ(ネクストぷよ)」として予告される。

落下してきたぷよがフィールドの床やほかのぷよに衝突すると、その位置にぷよが固定される。
ただし組ぷよを横にして置いたりなどして、ぷよに1マス分でも下方向に空白がある場合は、強制的にそのぷよだけ落下する。

固定されたぷよと同色のぷよが周囲4方向にいる場合、それらは互いにくっつく。
ぷよが4個以上くっつくと消滅し得点となる。
ぷよの消滅により上にあったぷよが落下する。このとき再びぷよが4個以上くっつくと消滅し、連鎖が起きる。

なお、普通に4つ色を並べて消す行為だけでも1連鎖と考え、消滅した回数(○回)に応じて○連鎖と呼ばれる。複数色を同時に消した場合や同色を別箇所で消した場合でも、1連鎖扱いとなる。

となっています。

フィールドをつくる

まず最初にフィールドをつくります。縦12マス×横6マスですが、外枠になる部分もつくりたいので

とします。

ユーザーコントロールでフィールドをつくる

幅は左右の枠をつくるため、2つ分広くしています。高さは底の部分と「組ぷよ」を出現させる都合上、2つ分高くなっています。

フォームのうえにあるのはユーザーコントロールです。名前はFieldとします。

変更している部分はDoubleBufferedをtrueにしています。

まずはUserControl1クラスを示します。IsInputKeyメソッドをオーバーライドしていますが、これをしておかないとキーが押されたときにイベントを捕捉することができないからです。

UserControlでカーソルキーを押した時のKeyDownイベント – アンの開発日記によると、

NET FrameworkでUserControlクラスを継承した独自コントロールを作成した場合、そのままではカーソルキーを押してもKeyDownイベントが発生しない。

これはUserControlクラスの親クラスであるContainerControlクラスの内部でカーソルキーの押下処理が行われているため。

この問題を解決するにはIsInputKeyメソッドを下記のようにオーバーライドすればよい。

と説明がされています。

ぷよの位置を示すCellクラス

またCellというクラスを作成しています。これはユーザーコントロールに「ぷよ」を描画するときにどの部分に描画すればよいかをわかりやすくするためのものです。

ぷよのタイプを示す列挙体

これはぷよのタイプを示す列挙体です。

Form1クラスのコンストラクタとフィールド変数

Form1クラスのコンストラクタとフィールド変数は以下のとおりです。Fieldはデザイナでフォームにはりつけたユーザーコントロールです。

Angleは以下のようになっています。

フィールドの初期化

InitCellsメソッドはセルを作成してこれを配列のなかに格納します。また一番上の行はぷよを回転させるときにつかわれる部分で表示はさせません。

ぷよを表示させる

ぷよを表示させるためにはぷよを表示するセルにデータをセットして、Invalidateメソッドを呼びます。SetPuyoメソッドはぷよを表示するセルにデータをセットするためのものです。

Invalidateメソッドを呼ぶことで、そのセルがある位置にぷよを表示させます。

ぷよを表示させるのであればイメージが必要です。使用したPNGファイルはここからダウンロードしました。

ぷよぷよ通 – 素材 – しろま空間

作者のサイト
しろま空間

取得したPNGファイルをリソースに追加

これでぷよのイメージを描画することができます。

GetImageFromPuyoTypeメソッド

GetImageFromPuyoTypeメソッドはぷよのタイプを指定すると対応するイメージを返します。

DrawPuyosメソッドでぷよを描画する

DrawPuyosメソッドでぷよを描画します。ぷよが描画される矩形を取得し、そこにGetImageFromPuyoTypeメソッドで取得したイメージを描画します。