※言葉では伝わりにくいかもしれませんがご容赦を
◆▲◆▲☆◯
◆◯▲☆◯▲
◯◆◆◯▲☆
実際は12*12マス
とまあ、適当に図を書きましたが、これを同じ形のブロックを縦か、横に4つ以上そろうと消えるプログラムを組もうとしているところです。しかし、デバック用に、消す代わりに揃えたブロックを別のブロックに変えるように組んでみたところ、加算ブレンドして気づいたのですが、元の4つのブロックと、変えた後のブロックが二重に表示されるようになってしまうのです。これでは、その次の消えたところを埋める作業に移れません。どなたか助言をよろしくお願いいたします。
int g_Block[16]; // 画像を入れる変数
int g_Panel[PANEL_SIZE][PANEL_SIZE]; //パネルの大きさ12*12マス
int g_DelCountW,g_DelCountH;
int g_DeletePanelW[PANEL_SIZE][PANEL_SIZE],g_DeletePanelH[PANEL_SIZE][PANEL_SIZE]; // 1なら消える
int g_CheckPanelW[PANEL_SIZE][PANEL_SIZE],g_CheckPanelH[PANEL_SIZE][PANEL_SIZE]; // 1ならチェック済み
whire文の外で初期化
void InitializePlay(void){
int h,w;
for( h = 0; h < PANEL_SIZE ; h++)
{
for( w = 0; w < PANEL_SIZE; w++)
{
g_Panel[h][w] = GetRand(12);
}
}
}
以下while文の中での処理
/==============================================================================================
// 消えるブロックの検索
//==============================================================================================
void SearchDelBlock(void){
int h,w;
for( h = 0; h < PANEL_SIZE; h++)
{
for( w = 0; w < PANEL_SIZE; w++)
{
if(g_DeletePanelW[h][w] == 0)
{ // まだ消えていないブロックなら…
SearchDelBlockW(h, w); // 再帰ルーチン(横)スタート
if(g_DelCountW >= DEL_MIN)
{ // 消えるなら…
for(int h2 = 0; h2 < PANEL_SIZE; h2++)
{
for(int w2 = 0; w2 < PANEL_SIZE; w2++)
{
if(g_CheckPanelW[h2][w2] == 1)
{
g_DeletePanelW[h2][w2] = 1; // チェックしたブロック→消える
}
}
}
}
// 次の処理に備えて初期化
ZeroMemory(g_CheckPanelW, sizeof(g_CheckPanelW));
g_DelCountW = 0;
}
}
}
for( h = 0; h < PANEL_SIZE; h++)
{
for( w = 0; w < PANEL_SIZE; w++)
{
if(g_DeletePanelH[h][w] == 0)
{ // まだ消えていないブロックなら…
SearchDelBlockH(h, w); // 再帰ルーチン(縦)スタート
if(g_DelCountH >= DEL_MIN)
{ // 消えるなら…
for(int h2 = 0; h2 < PANEL_SIZE; h2++)
{
for(int w2 = 0; w2 < PANEL_SIZE; w2++)
{
if(g_CheckPanelH[h2][w2] == 1)
{
g_DeletePanelH[h2][w2] = 1; // チェックしたブロック→消える
}
}
}
}
// 次の処理に備えて初期化
ZeroMemory(g_CheckPanelH, sizeof(g_CheckPanelH));
g_DelCountH = 0;
}
}
}
}
//==============================================================================================
// 再帰ルーチン(横)
//==============================================================================================
void SearchDelBlockW(int h, int w){
g_CheckPanelW[h][w] = 1; // チェックしました。
g_DelCountW++;
if(w + 1 < PANEL_SIZE)
{ //→
if(g_CheckPanelW[h][w + 1] == 0 && g_Block[g_Panel[h][w]] == g_Block[g_Panel[h][w + 1]])
{
SearchDelBlockW(h, w + 1);
}
}
if(w - 1 >= 0)
{ //←
if(g_CheckPanelW[h][w - 1] == 0 && g_Block[g_Panel[h][w]] == g_Block[g_Panel[h][w - 1]])
{
SearchDelBlockW(h, w - 1);
}
}
}
//==============================================================================================
// 再帰ルーチン(縦)
//==============================================================================================
void SearchDelBlockH(int h, int w){
g_CheckPanelH[h][w] = 1; // チェックしました。
g_DelCountH++;
if(h + 1 < PANEL_SIZE)
{ //↓
if(g_CheckPanelH[h + 1][w] == 0 && g_Block[g_Panel[h][w]] == g_Block[g_Panel[h + 1][w]])
{
SearchDelBlockH(h + 1, w);
}
}
if(h - 1 >= 0)
{ //↑
if(g_CheckPanelH[h - 1][w] == 0 && g_Block[g_Panel[h][w]] == g_Block[g_Panel[h - 1][w]])
{
SearchDelBlockH(h - 1, w);
}
}
}
//----------------------------
ステージ描画
//----------------------------
void DrawStage(void){
int h,w;
for( h = 0; h < PANEL_SIZE ; h++)
{
for( w = 0; w < PANEL_SIZE; w++)
{
if(g_DeletePanelW[h][w] == 0 && g_DeletePanelH[h][w] == 0)
{
SetDrawBlendMode( DX_BLENDMODE_ALPHA, 224 );
DrawGraph( w*32, h*32 , g_Block[g_Panel[h][w]], TRUE );
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );
}
if(g_DeletePanelW[h][w] == 1)
{
SetDrawBlendMode( DX_BLENDMODE_ALPHA, 224 );
DrawGraph( w*32, h*32 , g_Block[9] , TRUE);
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );
}
if(g_DeletePanelH[h][w] == 1)
{
SetDrawBlendMode( DX_BLENDMODE_ALPHA, 224 );
DrawGraph( w*32, h*32 , g_Block[9], TRUE);
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );
}
}
}
}