多次元配列と演算子

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 多次元配列と演算子

Re: 多次元配列と演算子

#3

by izumi » 4年前

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

Re: 多次元配列と演算子

#2

by Bull » 4年前

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

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

多次元配列と演算子

#1

by izumi » 4年前

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 演算を行った結果を変数に代入します)と書いてあったんですが、上のソースコードではどう処理されるのでしょうか?

ページトップ