今回はテトリスをつくります。実際にYouTubeでもプログラミングしている方も多くいるのでやってみることにしました。

フィールドを作成する

フィールドのサイズは、公式には縦20行 × 横10列とされているので、今回はこれに従います。フィールドに20×10のPictureBoxを敷き詰めて色を変えていくことでテトリミノが落下しているように見せかけることができます。でもC#でテトリスを作成している動画はかなりありますが、PictureBoxを使う方法を採用している方を見たことがありません。このやり方はなにか問題があるのでしょうか?

まずフィールドをつくります。またブロックを表すPictureBoxはそのまま使わずに継承して使います。PictureBoxクラスを継承してBlockクラスをつくります。

ブロックの大きさは20ピクセルにしました。またこのブロックはフィールドのどの部分に存在するのかわかるように、Colum、Rowというプロパティも作成しました。またコンストラクタの引数を指定することでフォーム上に表示させることまでできるようにしました。

それから左上に表示されるブロックの座標はフォーム上の座標(0,0)ではなく、もうちょっと内側にしたいので、Point型フィールド変数 LeftTopBlockをつかって調整しています。

ではフィールドを作成することにしましょう。

フィールドは縦20行 × 横10列です。またテトリミノは縦横4つずつブロックが並んで作られているので

としています。

フォームがロードされたら自作メソッドInitFieldを使用して10×20個のブロックを作成して、必要なときにアクセスできるようにフィールド変数のFieldに格納しています。フィールド変数のFieldはBlockの2元配列です。

フィールドの作成が終わったらゲーム開始前はなにも存在しないはずなので、自作メソッド ClearFieldでBackColorを白にしています。

またMovingTetorosはList型で落下中のテトリミノがフィールドのどの位置にあるかを記録しているフィールド変数です。またFixedTetoroは落下して場所が確定したテトリミノがフィールドのどの位置にあるかを記録しているList型のフィールド変数です。MovingTetoroPosは落下中のテトリミノの座標です。

ゲーム開始時はMovingTetorosもFixedTetoroも空なのでClearメソッドで要素を空にしています。

テトリミノを出現させ移動させる

メニューの[スタート]をクリックしたらゲーム開始です。まず最初のテトリミノを出現させます。

テトリミノには種類があって

I-テトリミノ(水色)
O-テトリミノ(黄色)
S-テトリミノ(緑)
Z-テトリミノ(赤)
J-テトリミノ(青)
L-テトリミノ(オレンジ)
T-テトリミノ(紫)

があります。

そこでこのような形のテトリミノをつくるために2元配列の配列をつくります。

そしてメニューの[スタート]が選択されたら最初のテトリミノを表示させます。そのために作成したのが自作メソッドShowNewTetoroです。どのタイプのテトリミノを出現させるかは乱数をつかって決めます。

タイプが決まればこれでフィールドのなかに描画することができます。

現在落下している最中で左右、回転のコントロールができるテトリミノと完全に落下して動かすことができないテトリミノはわけて考えます。現在落下しているテトリミノの位置は着地してその場所が確定されるまでMovingTetorosで管理します。

テトリミノは4×4マスのなかに存在する4つのブロックで構成されています。そこでテトリミノのタイプが決まったらTetorosをつかって描画し、古いMovingTetorosのデータはクリアし、そこに新しく作成されたテトリミノの位置情報を格納します。