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;
}