多重配列での値の取り方

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

多重配列での値の取り方

#1

投稿記事 by 初心者 » 17年前

0か1を記憶でいるBOOL型で10×10の多重配列 bool Data[10][10]; をつくります。

この変数の中に一定時間ごとにランダムであたいが入ります。

この中から連続した縦横3×3マスが1だったらというフラグを立てる処理を考えているのですが、

思いつきません・・・

{0,0,0,0,0, 1,1,1,0,0}, //
{0,0,0,0,0, 1,1,1,0,0}, //
{0,0,0,0,0, 1,1,1,0,0}, //
{0,0,0,0,0, 0,0,0,0,0},
{0,0,0,0,0, 0,0,0,0,0},



みたいなかんじです。

考えて見たのは
void CheckTask(void)
{
int x,y;

for(x=0;x<CEL_MAX_W;x++){
for(y=0;y<CEL_MAX_H;y++){
if(GameData[y][x] != 0 && Block[0][GameData[y][x]].Ptn == 1){
CheckTbl(x,y); //9マスの左上を取って関数に送る
}
}
}
}

void CheckTbl(int sx,int sy)
{
short CcheckTbl[3][3];
short Ccount;
int x,y;
bool CFlg;

Ccount=0;

CFlg=false;

for(x=0;x<3;x++){
for(y=0;y<3;y++){
CcheckTbl[y][x] = Block[0][GameData[sy+y][sx+x]].Ptn; //左上から順番に仮テーブルに代入
}
}

for(x=0;x<3;x++){
for(y=0;y<3;y++){
if(CcheckTbl[y][x] == 1)
Ccount+=1; //仮テーブルの1の数を数える
}
}

if(Ccount>=9) CFlg = true;
}

ってかんじです・・・
C++始めたばかりでわかりませんw
どなたかご教授お願いできないでしょうか?

管理人

Re:多重配列での値の取り方

#2

投稿記事 by 管理人 » 17年前

ざっとしか見てないのですが、
3x3を全部掛け算して0なら、1ならでフラグをわけたらいいだけではないでしょうか??

やそ

Re:多重配列での値の取り方

#3

投稿記事 by やそ » 17年前

10×10の配列の連続した3×3マスが1ならCFlgをTrueにする
と言うことなら・・・
int main(){
  int Data[10][10]; 
  int x,y,x2,y2,csum; 
  bool CFlg; 
/* x=たて y=よこ */

/* 配列初期化 */
  for(x=0;x<10;x++){
    for(y=0;y<10;y++){
      Data[x][y]=0;
    }
  }

  for(x=0;x<8;x++){
    for(y=0;y<8;y++){
      /* チェックの基点となる座標をチェック */
      if(Data[x][y]==1){
        csum=0;
/* 3×3マスを集計する */
        for(x2=x;x2<x+2;x2++){
          for(y2=y;y2<y+2;y2++){
            csum *= Data[x2][y2];
          }
        }
/* 集計結果=1 ・・・3×3マス全てが1 */
        if(csum==1){
          CFlg=True;
        } 
      }
    }
  }
}
でどうでしょうか?

配列の型をintにしたのは・・・特に意味は無いです(笑)
ポイントは「連続した」3×3マスなのでチェックの起点を8までしかとっていないとこでしょうか。
これで、無駄なループ回数を減らせます^^

box

Re:多重配列での値の取り方

#4

投稿記事 by box » 17年前

>やそさん

csumの初期値がゼロなのはまずいでしょうね。
ゼロに何を掛けてもゼロのままです。

やそ

Re:多重配列での値の取り方

#5

投稿記事 by やそ » 17年前

boxさん、素敵な指摘ありがとさんです^^

最初、3×3のマスを「足し算」で集計させていたのですが、管理人さんの「掛け算」投稿を先に投下されてしまったので、急遽変更を加えたのですが、初期化部分を忘れてましたね(恥)
if(Data[x][y]==1){
        csum=1;
    ・
  ・
  ・
もしくは
if(Data[x][y]==1){
        csum=Data[x][y];
ですね^^;

バグ

Re:多重配列での値の取り方

#6

投稿記事 by バグ » 17年前

こんなのはどうでしょう?分かりやすさ重視です(笑)
void CheckTable(bool pResult[TABLE_WIDTH][TABLE_HEIGHT], bool pTable[TABLE_WIDTH][TABLE_HEIGHT], int iPosX, int iPosY)
{
	for (int x = iPosX; x < iPosX + 3; x++)
	{
		for (int y = iPosY; y < iPosY + 3; y++)
		{
			// 配列の領域外が指定された場合は、それ以上の処理は無駄なので何もしない
			if (x < 0 || x >= TABLE_WIDTH ||
				y < 0 || y >= TABLE_HEIGHT)
				return;

			// 検査箇所の内、1箇所でもfalseが見つかった場合は、それ以上の処理は無駄なので何もしない
			if (pTable[x][y] == false)
				return;
		}
	}

	// 3×3マスが全てtrueだったので、バッファの3×3マスにtrueを代入する
	for (int x = iPosX; x < iPosX + 3; x++)
		for (int y = iPosY; y < iPosY + 3; y++)
			pResult[x][y] = true;
}

閉鎖

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