ページ 11

テトリスブロックの定義

Posted: 2011年6月21日(火) 22:12
by 炎色憑依(ウロボロス)
ゲームプログラミングを勉強中で、ひとしきり参考書を読みました。
そこで、ゲームプログラミングの定番である「テトリス」をVC++でDXライブラリを使い作成しようと思っています。

ある程度テトリスのブロックの落下やブロックのラインが消える等の処理はぼんやりと理解しましたが
テトリスブロックの定義がわかりません。
ブロックの絵を使い様々なブロックを作りたいのですがどのような定義をしたらよいのでしょうか。
また、定義したブロックをどのようにして表示すればよいのでしょうか。

結構投げやりな感じになっていますが、教えていただけると幸いです.

Re: テトリスブロックの定義

Posted: 2011年6月22日(水) 09:36
by softya(ソフト屋)
テトリスのプログラムの前に練習として、ブロックを表示することから始めて見ましょう。
1)色々なブロックを表示
2)色々なブロックを回転
3)色々なブロックを落下
をまずやってみましょうか?

これをするにはブロックをどう構成するか決めなくてはいけません。
それぞれ1つの絵なのか?正方形のブロックの組み合わせなのか?(どちらでも出来ます)
どうされますか?

Re: テトリスブロックの定義

Posted: 2011年6月22日(水) 09:49
by バグ
例えば、テトリミノは7種類ありますよね?
よくアルファベットの形で表現されますが・・・

I、L、J、S、Z、T、O

これらのテトリミノは4つのブロックの組み合わせで構成されています。

□□■□□
□□■□□
□□■□□
□□■□□
□□□□□

例えば、I型(いわゆるテトリス棒)だと上記のような感じです。

単純にブロックの有る場所と無い場所だけの情報で構わないというのであれば、bool型の配列変数などを使用して、ブロックの存在する箇所にtrue、そうでない箇所にはfalseを代入しておけば、ブロックの有無は判定できますね?

t = true, f = false

f,f,t,f,f
f,f,t,f,f
f,f,t,f,f
f,f,t,f,f
f,f,f,f,f


もし、表示する際に色違いのブロックを表現したいのであれば、bool型の代わりにint型などを使用して・・・

0,0,1,0,0
0,0,1,0,0
0,0,1,0,0
0,0,1,0,0
0,0,0,0,0

こんな感じで配置してやればいかがでしょう?(※ここでは0をブロック無し、それ以外をブロック有りとしています)
これだと、格納されている数値によって、描画する条件を分岐させれば、色や画像も変化させることができるわけです。

Re: テトリスブロックの定義

Posted: 2011年6月22日(水) 20:25
by 炎色憑依(ウロボロス)
まとめて返信をすることになりますが、ご了承ください。

まずは、返信してくださりありがとうございます。

softya(ソフト屋)さんのブロック構成ですが、自分は色分けした正方形のブロック(32*32)を組み合わせて創っていきたいと
思っています。

バグさんの方法は思いつかなかったですね・・・
bool型ですか。
様々な解説サイトを見てきましたが、ほとんどがint型であったので
bool型のほうがもう少しシンプルな考えでできそうですね。

お二人の意見を参考にして、もう少し考えてみようと思います。
ありがとうございます。

また、何度も質問することになると思いますが、よろしくお願いします

Re: テトリスブロックの定義

Posted: 2011年6月22日(水) 21:18
by たいちう
写経のようにこれを真似するのも勉強になるのではないだろうか。
【プログラミング】テトリスを1時間強で作ってみた【実況解説】
http://www.nicovideo.jp/watch/sm8517855

Re: テトリスブロックの定義

Posted: 2011年6月22日(水) 21:29
by 炎色憑依(ウロボロス)
たいちうさん返信ありがとうございます。
紹介してくれた動画はちょくちょくここの掲示板でも貼られていたので、目は通しましたが
少々この方のブロック定義は特殊な感じがして、少し尻込みをしていたのです。

やっぱり、最初から考えるのではなく,ある程度までは人の真似をしたほうが作り易いのですかね?

Re: テトリスブロックの定義

Posted: 2011年6月23日(木) 07:53
by たいちう
> 少々この方のブロック定義は特殊な感じがして、少し尻込みをしていたのです。

私には特殊な感じはしません。
色々考えられる定義の仕方のうちの1つです。

> やっぱり、最初から考えるのではなく,ある程度までは人の真似をしたほうが作り易いのですかね?

自分で考えても行き詰ってしまった場合、他に何が出来ますか?
少なくとも掲示板に丸投げするよりも成長につながると思います。
学習の仕方は人それぞれなので責めるつもりは全くないですが。

補足
成長につながると私が考えるのは、能動的な行動を重視しているからです。
サンプルを写して終わり、とか、掲示板で答えをもらって終わり、とかは問題外です。

Re: テトリスブロックの定義

Posted: 2011年6月23日(木) 20:55
by 炎色憑依(ウロボロス)
一応これもちょくちょく貼られていますが、
http://www.nhk.or.tv/kow/program/index.php

ここのテトリスを書写?して、分かるところはちょくちょくコメントを書いています。

Re: テトリスブロックの定義

Posted: 2011年6月28日(火) 00:22
by 炎色憑依(ウロボロス)

コード:

#include<DxLib.h>
#include<stdio.h>

/*ブロックの形を決める。今回は□型のブロックを作る。
    0 1 2 3
   0□□□□
   1□■■□
   2□■■□
   3□□□□
*/
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode(TRUE); // ウィンドウモードに設定
	DxLib_Init();   // DXライブラリ初期化処理

	int Handle;
	int i,j;
	Handle = LoadGraph("EDGE1.bmp");
	
	//□ブロックの定義
	int Block_Square[4][4] = {{0,0,0,0},
					          {0,1,1,0},
					          {0,1,1,0},
					          {0,0,0,0}};
	
	for(i=0; i<4; i++){
		for(j=0; j<4; j++){
			if(Block_Square[i][j] == 1){
				DrawGraph( i*4, i*4, Handle, TRUE) ;
			}
		}
		printf("\n");
	}

	WaitKey();      // キー入力待ち
	DxLib_End();    // DXライブラリ終了処理
	return 0;
} 
このコードで四角のブロックをEDGE1.bmp(16 *16)という画像を用いて描画したいのですが。
DrawGraph関数での左上頂点の座標の指定がうまくできず、めちゃくちゃな形になってしまいます。

どこをどういうふうに指定してあげれば、うまく描画できますか?

Re: テトリスブロックの定義

Posted: 2011年6月28日(火) 00:50
by h2so5
DrawGraphの引数をよ〜く確認してください。

Re: テトリスブロックの定義

Posted: 2011年6月30日(木) 21:57
by 炎色憑依(ウロボロス)
oh...
かなり単純なミスでした・・・
教えていただきありがとうございます。
おかげで、無事期待通りの出力結果をだせました。