テトリス作るのは意外に難しいです。
私が作るならば、
①テトリスの種類と回転させたときの変化について資料化する
例:L型リス
コード:
[* ] [ ] [ **] [ ]
[* ] [ *] [ *] [***]
[** ] [***] [ *] [* ]
②テトリスで必要になるであろうAPIについてテストコードを書いて感触をつかむ。
例えば、Win32 APIでテトリスを描画するにはBitBlt関数で画像を表示するか、Rectangle関数で四角形を描画する必要があるでしょう。色や大きさを指定するやり方も確認しておきます。十字キーの入力はメッセージループを使う必要があります。等々
③テトリスのロジックコードとコンソール画面上で動作するテストコードを作成して、デバッグする
ロジックコードには以下のような関数が含まれるでしょう(想像で書いているので、作る途中で変わっていくと思います)。
コード:
bool placePiece(BOARD *b, PIECE *p, POS *pos);
void rotate(BOARD *b, PIECE *p, POS *pos); // 回転は時計周りのみ
bool FallOneStep(BOARD *b, PIECE *p, POS *pos);
bool FallAssp(BOARD *b, PIECE *p, POS *pos);
デバッグするときは、テトリス画面を模擬した表示をさせる関数を作るとデバッグしやすいです。
コード:
[ @@@ ]
[ @ ]
[ ]
[ ]
[ * **]
[** **** *]
[****** **]
[***** ****]
[**** * ***]
[**** * ***]
④ ②、③をもとに本番コードを書いていきます。④の作業ができるだけ少なくなるように③を作るのが、効率化のコツです。
当たり判定は基本的に③で片づけます。競技プログラミング(AOJ等)にも似たような問題があるんじゃないかと思います。
コード:
BLOCK block[8] = {
{1, {{0, 0},{0, 0}, {0 ,0}}}, // null
{2, {{0, -1},{0, 1}, {0 ,2}}}, // tetris
...
{4, {{0, -1},{1, 0}, {-1 ,0}}}, // T
};
のような構造体の作り方は、パッと見て分かるわけじゃないので、私的にお勧めではないです。①をもとにデータ構造を考えてみてください。