プロつく計画 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()