テトリスブロックの定義

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

テトリスブロックの定義

#1

投稿記事 by 炎色憑依(ウロボロス) » 14年前

ゲームプログラミングを勉強中で、ひとしきり参考書を読みました。
そこで、ゲームプログラミングの定番である「テトリス」をVC++でDXライブラリを使い作成しようと思っています。

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 14年前

テトリスのプログラムの前に練習として、ブロックを表示することから始めて見ましょう。
1)色々なブロックを表示
2)色々なブロックを回転
3)色々なブロックを落下
をまずやってみましょうか?

これをするにはブロックをどう構成するか決めなくてはいけません。
それぞれ1つの絵なのか?正方形のブロックの組み合わせなのか?(どちらでも出来ます)
どうされますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
バグ
記事: 130
登録日時: 14年前
住所: 愛媛県
連絡を取る:

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

#3

投稿記事 by バグ » 14年前

例えば、テトリミノは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: テトリスブロックの定義

#4

投稿記事 by 炎色憑依(ウロボロス) » 14年前

まとめて返信をすることになりますが、ご了承ください。

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

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

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

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

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

たいちう
記事: 418
登録日時: 14年前

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

#5

投稿記事 by たいちう » 14年前

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

炎色憑依(ウロボロス)

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

#6

投稿記事 by 炎色憑依(ウロボロス) » 14年前

たいちうさん返信ありがとうございます。
紹介してくれた動画はちょくちょくここの掲示板でも貼られていたので、目は通しましたが
少々この方のブロック定義は特殊な感じがして、少し尻込みをしていたのです。

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

たいちう
記事: 418
登録日時: 14年前

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

#7

投稿記事 by たいちう » 14年前

> 少々この方のブロック定義は特殊な感じがして、少し尻込みをしていたのです。

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

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

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

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

炎色憑依(ウロボロス)

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

#8

投稿記事 by 炎色憑依(ウロボロス) » 14年前

一応これもちょくちょく貼られていますが、
http://www.nhk.or.tv/kow/program/index.php

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

炎色憑依(ウロボロス)

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

#9

投稿記事 by 炎色憑依(ウロボロス) » 14年前

コード:

#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関数での左上頂点の座標の指定がうまくできず、めちゃくちゃな形になってしまいます。

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

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

#10

投稿記事 by h2so5 » 14年前

DrawGraphの引数をよ〜く確認してください。

炎色憑依(ウロボロス)

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

#11

投稿記事 by 炎色憑依(ウロボロス) » 14年前

oh...
かなり単純なミスでした・・・
教えていただきありがとうございます。
おかげで、無事期待通りの出力結果をだせました。

閉鎖

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