ゲームプログラミングを勉強中で、ひとしきり参考書を読みました。
そこで、ゲームプログラミングの定番である「テトリス」をVC++でDXライブラリを使い作成しようと思っています。
ある程度テトリスのブロックの落下やブロックのラインが消える等の処理はぼんやりと理解しましたが
テトリスブロックの定義がわかりません。
ブロックの絵を使い様々なブロックを作りたいのですがどのような定義をしたらよいのでしょうか。
また、定義したブロックをどのようにして表示すればよいのでしょうか。
結構投げやりな感じになっていますが、教えていただけると幸いです.
テトリスブロックの定義
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 14年前
- 住所: 東海地方
- 連絡を取る:
Re: テトリスブロックの定義
テトリスのプログラムの前に練習として、ブロックを表示することから始めて見ましょう。
1)色々なブロックを表示
2)色々なブロックを回転
3)色々なブロックを落下
をまずやってみましょうか?
これをするにはブロックをどう構成するか決めなくてはいけません。
それぞれ1つの絵なのか?正方形のブロックの組み合わせなのか?(どちらでも出来ます)
どうされますか?
1)色々なブロックを表示
2)色々なブロックを回転
3)色々なブロックを落下
をまずやってみましょうか?
これをするにはブロックをどう構成するか決めなくてはいけません。
それぞれ1つの絵なのか?正方形のブロックの組み合わせなのか?(どちらでも出来ます)
どうされますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: テトリスブロックの定義
例えば、テトリミノは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をブロック無し、それ以外をブロック有りとしています)
これだと、格納されている数値によって、描画する条件を分岐させれば、色や画像も変化させることができるわけです。
よくアルファベットの形で表現されますが・・・
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: テトリスブロックの定義
まとめて返信をすることになりますが、ご了承ください。
まずは、返信してくださりありがとうございます。
softya(ソフト屋)さんのブロック構成ですが、自分は色分けした正方形のブロック(32*32)を組み合わせて創っていきたいと
思っています。
バグさんの方法は思いつかなかったですね・・・
bool型ですか。
様々な解説サイトを見てきましたが、ほとんどがint型であったので
bool型のほうがもう少しシンプルな考えでできそうですね。
お二人の意見を参考にして、もう少し考えてみようと思います。
ありがとうございます。
また、何度も質問することになると思いますが、よろしくお願いします
まずは、返信してくださりありがとうございます。
softya(ソフト屋)さんのブロック構成ですが、自分は色分けした正方形のブロック(32*32)を組み合わせて創っていきたいと
思っています。
バグさんの方法は思いつかなかったですね・・・
bool型ですか。
様々な解説サイトを見てきましたが、ほとんどがint型であったので
bool型のほうがもう少しシンプルな考えでできそうですね。
お二人の意見を参考にして、もう少し考えてみようと思います。
ありがとうございます。
また、何度も質問することになると思いますが、よろしくお願いします
Re: テトリスブロックの定義
写経のようにこれを真似するのも勉強になるのではないだろうか。
【プログラミング】テトリスを1時間強で作ってみた【実況解説】
http://www.nicovideo.jp/watch/sm8517855
【プログラミング】テトリスを1時間強で作ってみた【実況解説】
http://www.nicovideo.jp/watch/sm8517855
Re: テトリスブロックの定義
たいちうさん返信ありがとうございます。
紹介してくれた動画はちょくちょくここの掲示板でも貼られていたので、目は通しましたが
少々この方のブロック定義は特殊な感じがして、少し尻込みをしていたのです。
やっぱり、最初から考えるのではなく,ある程度までは人の真似をしたほうが作り易いのですかね?
紹介してくれた動画はちょくちょくここの掲示板でも貼られていたので、目は通しましたが
少々この方のブロック定義は特殊な感じがして、少し尻込みをしていたのです。
やっぱり、最初から考えるのではなく,ある程度までは人の真似をしたほうが作り易いのですかね?
Re: テトリスブロックの定義
> 少々この方のブロック定義は特殊な感じがして、少し尻込みをしていたのです。
私には特殊な感じはしません。
色々考えられる定義の仕方のうちの1つです。
> やっぱり、最初から考えるのではなく,ある程度までは人の真似をしたほうが作り易いのですかね?
自分で考えても行き詰ってしまった場合、他に何が出来ますか?
少なくとも掲示板に丸投げするよりも成長につながると思います。
学習の仕方は人それぞれなので責めるつもりは全くないですが。
補足
成長につながると私が考えるのは、能動的な行動を重視しているからです。
サンプルを写して終わり、とか、掲示板で答えをもらって終わり、とかは問題外です。
私には特殊な感じはしません。
色々考えられる定義の仕方のうちの1つです。
> やっぱり、最初から考えるのではなく,ある程度までは人の真似をしたほうが作り易いのですかね?
自分で考えても行き詰ってしまった場合、他に何が出来ますか?
少なくとも掲示板に丸投げするよりも成長につながると思います。
学習の仕方は人それぞれなので責めるつもりは全くないですが。
補足
成長につながると私が考えるのは、能動的な行動を重視しているからです。
サンプルを写して終わり、とか、掲示板で答えをもらって終わり、とかは問題外です。
Re: テトリスブロックの定義
一応これもちょくちょく貼られていますが、
http://www.nhk.or.tv/kow/program/index.php
ここのテトリスを書写?して、分かるところはちょくちょくコメントを書いています。
http://www.nhk.or.tv/kow/program/index.php
ここのテトリスを書写?して、分かるところはちょくちょくコメントを書いています。
Re: テトリスブロックの定義
#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;
}
DrawGraph関数での左上頂点の座標の指定がうまくできず、めちゃくちゃな形になってしまいます。
どこをどういうふうに指定してあげれば、うまく描画できますか?
Re: テトリスブロックの定義
DrawGraphの引数をよ〜く確認してください。