コラム / テトリスぽいもの / 33



「削除可能な行がなくなるまで無限ループし、
 削除可能な行があれば、削除処理を呼び出す。」
を作ります。
定義部
   TMapBlocks = Class(TObject)
   private
   public
       (略)
       procedure DeleteBlocks;
       procedure Draw;
   end;
命名のネタが尽きてきました
実装部 
procedure TMapBlocks.DeleteBlocks;
var i:integer;
    f:boolean;
begin
   f:=true;
   while f do begin
       f:=False;
       For i:=0 to 19 do begin
           if isFull(i) then begin
               DeleteLine(i);
               f:=True;
               break;
           end;
       end;
   end;
end;
iはforのカウンタです。
fはフラグを略してf。
行の削除があったら立てます。
全体としては、
フラグが立っていたらループに入り、
forで全部の行のループをします。
isFullで、ブロックが全部並んでいる行があったら、
DeleteLineで削除し、
フラグを立ててBreak;します
Break;は、現在のループを一つ抜けますから、
この場合は、全行のforループを抜けます。
Break;で抜けてきた場合は、
直前にフラグを立てているので、
Whileのループを再び行います。
ForループをしてもisFullにひっかからなかった場合は、
フラグが立っていないので、
Whileが終了して、
DeleteBlocksを終了します。

あとはこれを、ブロックを置いたタイミングで呼び出せば、
消える処理ができるはず・・・?