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

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

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

プロつく計画1-5:1週目 「再帰を使わない塗りつぶし」

プロつく計画
  • ClassDefinition.h
    • Font を FontAsset に乗り換え(Commandクラス)
  • Field.cpp
    • ネストを浅く or 省略できる波括弧を省略(多分もう無理)
    • DeleteBlock()の、ブロックを消去する処理と、消去したブロックの数からスコアを算出する処理を分離
    • SearchDeletableBlock(int x, int y, BlockColor block_color) を再帰を使わない実装にする
  • Main.cpp
    • while(System::Update())内のループをもっと簡潔に
    • ユーザ入力をまとめて処理する何かを導入する
  • Constants.h
    • enum型の名前をeHogehogeにする
  • ブロックを消したときのアニメーションを実装する
  • 色以外でもブロックの種類を判別できるようにする

1-5では、太字部分を実装していこうかと。

再帰を使わない塗りつぶし

  1. 開始セルを塗る
  2. 開始セルをスタックにプッシュする
  3. スタックが空でない間の処理
    1. スタックからポップする
    2. ポップしたセルの上下左右が同種のセルであり、なおかつまだ塗っていない時の処理
      1. それらのセルを塗ってスタックにプッシュする

某所で教えて頂いた、再帰を使わない塗りつぶし方法(深さ優先)。
幅優先にするときは、スタックをキューで代用する。