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:多重配列での値の取り方
10×10の配列の連続した3×3マスが1ならCFlgをTrueにする
と言うことなら・・・
配列の型をintにしたのは・・・特に意味は無いです(笑)
ポイントは「連続した」3×3マスなのでチェックの起点を8までしかとっていないとこでしょうか。
これで、無駄なループ回数を減らせます^^
と言うことなら・・・
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までしかとっていないとこでしょうか。
これで、無駄なループ回数を減らせます^^
Re:多重配列での値の取り方
boxさん、素敵な指摘ありがとさんです^^
最初、3×3のマスを「足し算」で集計させていたのですが、管理人さんの「掛け算」投稿を先に投下されてしまったので、急遽変更を加えたのですが、初期化部分を忘れてましたね(恥)
最初、3×3のマスを「足し算」で集計させていたのですが、管理人さんの「掛け算」投稿を先に投下されてしまったので、急遽変更を加えたのですが、初期化部分を忘れてましたね(恥)
if(Data[x][y]==1){ csum=1; ・ ・ ・もしくは
if(Data[x][y]==1){ csum=Data[x][y];ですね^^;
Re:多重配列での値の取り方
こんなのはどうでしょう?分かりやすさ重視です(笑)
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; }