−トップへ−

スライドパズルを作る
その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コンポーネントでピースが移動中に別のピースをクリックするとピースが止まってしまいます。これについてはプログラムを書きませんので,書ける人は書いてみてください。
 
 
 ここまでのプログラムソースをサンプルファイルとしてアップしました。
 興味のある方はご覧ください。

−トップへ−