多次元配列と演算子

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

多次元配列と演算子

#1

投稿記事 by izumi » 3ヶ月前

Youtube[プログラミング実況]のテトリスのソースコードです。

コード:

#include <conio.h>
#include <string.h>
#include <stdio.h>

#define FIELD_WIDTH 12
#define FIELD_HEIGHT 22

char field[FIELD_HEIGHT][FIELD_WIDTH];
char displayBaffer[FIELD_HEIGHT][FIELD_WIDTH];

enum {
	MINO_TYPE_I,
	MINO_TYPE_O,
	MINO_TYPE_S,
	MINO_TYPE_Z,
	MINO_TYPE_J,
	MINO_TYPE_L,
	MINO_TYPE_T,
	MINO_TYPE_MAX
};

enum {
	MINO_ANGLE_0,
	MINO_ANGLE_90,
	MINO_ANGLE_180,
	MINO_ANGLE_270,
	MINO_ANGLE_MAX
};

#define MINO_WIDTH 4
#define MINO_HEIGHT 4
char minoShapes[MINO_TYPE_MAX][MINO_ANGLE_MAX][MINO_HEIGHT][MINO_WIDTH] = {
	//MINO_TYPE_I
	{
		//MINO_ANGLE_0
		{
			0, 1, 0, 0,
			0, 1, 0, 0,
			0, 1, 0, 0,
			0, 1, 0, 0,
		},
		//MINO_ANGLE_90
		//MINO_ANGLE_180
		//MINO_ANGLE_270
	}
	//MINO_TYPE_O
	//MINO_TYPE_S
	//MINO_TYPE_Z
	//MINO_TYPE_J
	//MINO_TYPE_L
	//MINO_TYPE_T
};
void main() {
	memset(field, 0, sizeof(field));
	for (int i = 0; i < FIELD_HEIGHT; i++)
		field[i][0] = field[i][FIELD_WIDTH - 1] = 1;

	for (int i = 0; i < FIELD_WIDTH; i++)
		field[FIELD_HEIGHT - 1][i]=1;

	memcpy(displayBaffer, field, sizeof(field));

	int minoType = 0, minoAngle = 0;
	int minoX = 5, minoY = 0;
	for (int i = 0; i < MINO_HEIGHT; i++)
		for (int j = 0; j < MINO_WIDTH; j++)
			displayBaffer[minoY + i][minoX + j] |= minoShapes[minoType][minoAngle][i][j];
	
	for (int i = 0; i < FIELD_HEIGHT; i++) {
		for (int j = 0; j < FIELD_WIDTH; j++)
			printf(displayBaffer[i][j] ? "■" : "  ");
		printf("\n");
	}
	_getch();
}
C言語を始めたばかりでいろいろ検討しましたが全く分からなかったのでおしえてください。( ;´Д`)
char minoShapes[MINO_TYPE_MAX][MINO_ANGLE_MAX][MINO_HEIGHT][MINO_WIDTH] ={}
このソースコードはおそらく4次元配列だとおもうんですが、ネットのどのサイトでも3次元配列までしか記述されていなく、(3次元配列は、縦方向(Y方向)と横方向(X方向)と奥方向(Z方向)にデータの広がりがあります。)と記述されていたのですが、4次元配列はどのようになるのでしょうか?

displayBaffer[minoY + i][minoX + j] |= minoShapes[minoType][minoAngle][j];このソースコードなんですが、
あるサイトでは (「|=」はビットごとの OR 演算を行った結果を変数に代入します)と書いてあったんですが、上のソースコードではどう処理されるのでしょうか?

Bull
記事: 138
登録日時: 5年前

Re: 多次元配列と演算子

#2

投稿記事 by Bull » 3ヶ月前

izumi さんが書きました:
3ヶ月前
char minoShapes[MINO_TYPE_MAX][MINO_ANGLE_MAX][MINO_HEIGHT][MINO_WIDTH] ={}
このソースコードはおそらく4次元配列だとおもうんですが、ネットのどのサイトでも3次元配列までしか記述されていなく、(3次元配列は、縦方向(Y方向)と横方向(X方向)と奥方向(Z方向)にデータの広がりがあります。)と記述されていたのですが、4次元配列はどのようになるのでしょうか?
テトリスは平面つまり二次元ですから、ミノ(テトリミノ)のシェイプ(形状)としては、二次元配列ですみます。
しかし、ミノは七種類のタイプ(O, S, Z, J, L, T)があり、それぞれ回転の状態が四種類あります。
それをまとめて四次元配列にしていると思われます。
izumi さんが書きました:
3ヶ月前
displayBaffer[minoY + i][minoX + j] |= minoShapes[minoType][minoAngle][j];このソースコードなんですが、
あるサイトでは (「|=」はビットごとの OR 演算を行った結果を変数に代入します)と書いてあったんですが、上のソースコードではどう処理されるのでしょうか?

ソースが未完成のようなので想像でしかありませんが、その位置にあるミノを表示するために、表示用のバッファーdisplayBaffer[][] にマッピングしていると思われます。

izumi

Re: 多次元配列と演算子

#3

投稿記事 by izumi » 3ヶ月前

分かりやすい説明ありがとうございました。
助かりました。!(^^)!

返信

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