TETRIS作成について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
akasann

TETRIS作成について

#1

投稿記事 by akasann » 8年前

ホームページ(http://itouhiro.hatenablog.com/entry/20121119/tetris)を参考にしながらテトリスを作成しています。色々考えているのですが当たり判別のところをどのようなプロセスでやるのか思いつきません。助言をいただけると嬉しいです。

ブロックの置き方として、このようにおいています。

コード:

block[3]={ 2, { { 0,-1 }, {-1, 0 }, {-1, 1 } }, GetColor(100, 255, 0) }, //Sブロック
PutBlock関数としてこのような感じでvoid型で作成してみました。

コード:

void PutBlock(Status s){
	
	if (board[s.y][s.x] == 0){

		for (int i = 0; i < 3; i++){
			int dx = block[s.type].p[i].x;
			int dy = block[s.type].p[i].y;
			int r = s.rotate % block[s.type].rotate;
			//回転時の変換
			for (int j = 0; j < r; j++){
				int nx = dx, ny = dy;
				dx = ny;  dy = -nx;
			}
			//当たり判定
			if (board[s.y + dy][s.x + dx] != 0){

			}

			board[s.y][s.x] = s.type;
			board[s.y + dy][s.x + dx] = s.type;

		}
	}
}

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: TETRIS作成について

#2

投稿記事 by あんどーなつ » 8年前

テトリス作るのは意外に難しいです。

私が作るならば、
①テトリスの種類と回転させたときの変化について資料化する
例: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
};
のような構造体の作り方は、パッと見て分かるわけじゃないので、私的にお勧めではないです。①をもとにデータ構造を考えてみてください。

akasann

Re: TETRIS作成について

#3

投稿記事 by akasann » 8年前

あんどーなつさん、返信(助言)ありがとうございます。
最初はそのような形でブロックを置いていたのですが、このホームページを見て良いなと思ってこの置き方でやってみたところ、つまずいてしまいました。もう一度考え直してみます。

閉鎖

“C言語何でも質問掲示板” へ戻る