スライドパズルを作る
その4 完成かどうかの判定をする
今回が最終回です。前回までにピースをシャッフルして,ピースを動かすことを行ってきました。今回はピースが順番通りに並んだかどうかの判定をします。
この判定は簡単ですが,完成したときのイベントに凝ると面白いかもしれません。
ここでは完成したときに,16番目のピースを表示して「おめでとう」のメッセージを出してみます。
プログラムを書き込む場所は,Timer1.Timerのイベントハンドラです。
以下に,プログラムソースを書いてみます。
procedure TForm1.Timer1Timer(Sender: TObject);
begin
case space of
1:img[num].top:=img[num].top-2;
//変数spaceが1のとき,上に2ピクセル移動させる
2:img[num].Left:=img[num].Left+2;
//変数spaceが2のとき,右に2ピクセル移動させる
3:img[num].top:=img[num].top+2;
//変数spaceが3のとき,下に2ピクセル移動させる
4:img[num].Left:=img[num].Left-2;
//変数spaceが4のとき,左に2ピクセル移動させる
end;
timer1.Tag:=timer1.Tag+1;
//繰り返しの回数をtimer1.Tagに記録する
if timer1.Tag=50 then begin
//50回繰り返したら
timer1.Tag:=0;
//timer1.Tagの値を0にする
timer1.Enabled:=false;
//timerコンポーネントを無効にする
for i:=1 to 15 do begin //15個のピースについて調べるため15回繰り返す
if po[(i-1) mod 4+1,(i-1) div 4 + 1]<>i then exit; //po[x,y]の数字が順番に並んでいなかったら
end; //終了する
img[16].Visible:=true; //終了せずに15個終わったら,16個目のピースを表示する
showmessage('おめでとう!'); //「おめでとう」のメッセージを出す
end;
end;
これで一応は完成ですが,まだ問題点があります。それはtimerコンポーネントでピースが移動中に別のピースをクリックするとピースが止まってしまいます。これについてはプログラムを書きませんので,書ける人は書いてみてください。
ここまでのプログラムソースをサンプルファイルとしてアップしました。
興味のある方はご覧ください。