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



では、
「指定した行から初めて、
 一番上の行まで、
 RewriteLineByOverLineを呼び出す」
手続きを作りましょう。
これは結局、
指定した行がなくなって、
その上が落ちてきたのと同じ事が起きます。
定義部です。
   TMapBlocks = Class(TObject)
   private
   public
       (略)
       procedure DeleteLine(at:integer);
       (略)
   end;
実装部です。
procedure TMapBlocks.DeleteLine(at:integer);
var i:integer;
begin
   For i:=at downto 0 do begin
       RewriteLineByOverLine(i);
   end;
end;
単純ですね。
よく見ると新しい処理が使われています。
for 初期化 downto 終了値 do;
と、 to ではなく、downto が使われています。
downtoの場合は、初期化した変数を、
毎ループにカウンタを1減らします。
これを使えば、
初期値iを指定した削除行にしたあと、
0まで一つ減らしながらループすることで、
RewriteLineByOverLineを、
指定した削除行から0行目(一番上)まで実行できるわけです。
これで固まりを落下させる処理ができました。
あとは、消せる段の発生を検知して、
削除処理を呼び出すだけです。
ここで重要なのは、
テトリスは一度に何段消えるかわからないので、
「消せる行がなくなるまで、
 消える行の探知を無限ループ」
しなければならないことです。
(最大は4だけど
そこで、
「消える行があればその行番号を返し、
 無ければ-1を返す関数」
を作ろうと思います。
次回で。