読者です 読者をやめる 読者になる 読者になる

たぶん週刊「今週の進捗」

1週間に勉強したことや実装したことをネタに、週に1回(主に土日に)更新していく予定です。「多分」なので、臨時休刊があってもご海容ください。

プロつく計画 19週目


消して出来たスペースに、上のブロックが落ちるようになりました。

何故かプログラムを書いてもブロックが落ちなかったり、
無限ループになったりしましたが、無事何とかなりました。

bool dropped;
for(int yi = 0; yi < BlockNumY - 1; yi++){
    dropped = false;
    for(int xi = 0; xi < BlockNumX; xi++){
        if (FieldArea[xi][yi + 1].GetBlockColor() == Blank){
            Block tmp = FieldArea[xi][yi];
            FieldArea[xi][yi] = FieldArea[xi][yi+1];
            FieldArea[xi][yi+1] = tmp;
            dropped = true;
        }
    }
    if(!dropped)
        break;
}

ブロックが落ちなかったときのコード。
全体をサーチしないケースがある(上から走査して、スペースのある段がないとそこでbreakする)。これだとそもそもちゃんと落ちない。

bool dropped = true;
while(dropped)
{
    dropped = false;
    for(int yi = 0; yi < BlockNumY - 1; yi++){
        for(int xi = 0; xi < BlockNumX; xi++){
            if (FieldArea[xi][yi + 1].GetBlockColor() == Blank){
                Block tmp = FieldArea[xi][yi];
                FieldArea[xi][yi] = FieldArea[xi][yi+1];
                FieldArea[xi][yi+1] = tmp;
                dropped = true;
            }
        }
    }
}

無限ループになったときのコード。
ブロックを落とす時の条件が、「スペースがある」だけなので、
フィールド中にスペースがある限りループし続ける(「上にブロックがあるスペースがある」が必要)。

どっちも初歩的なバグだった…。

しかしアレだね、配列上だと、0が上だか下だかわからないね。
あと、MouseL.click ではなく .release にすることで、
画面遷移時のクリック誤爆を防止しました。

いよいよゲームっぽくなってきた予感。

メモ

std::swap()