−トップへ−

スライドパズルを作る
その3 ピースをシャッフルする

 今回は,ゲームを始める前にピースをばらばらに並べ替えてみたいと思います。しかしここで注意しないといけないのは自由に並べ替えを行うと,元の状態に名並べ替えることができる場合とできない場合があります。
 そこでまずスライドパズルのときのシャッフルの仕方を述べてみたいと思います。

ピースのシャッフルの仕方

 シャッフルの仕方は,元の状態から2つの数字を入れ替えるという方法をとります。
 
 例えば下の図で2と11を入れ替えると右のようになります。

 
10
11
12
13
14
15
 
11
10
12
13
14
15
 

 これを奇数回繰り返すと元の配列には戻らず,偶数回繰り返すと元に戻すことができます。
 ただしここで注意することは,空欄と入れ替えるとおかしくなるので,空欄とは入れ替えできません。
 
 実際のプログラムの中では,1のピースとランダムに選んだピースを入れ替え,次に2のピースとべつのピース…というように順番に入れ替えていきたいと思います。繰り返すのは8回にしてみます。
 
 
 以下に,プログラムソースを書いてみます。

 //「ゲームの開始」メニューを押したとき,ピースの場所を記録する
procedure TForm1.N1Click(Sender: TObject);
var
 i,j:integer; //iとjを宣言
  x,y,z:integer; //x,y,zを宣言
begin
 for i:=0 to 5 do begin //全体を−1にする
  for j:=0 to 5 do begin
   po[i,j]:=-1;
  end;
 end;
 for i:=1 to 16 do begin //パーツの番号をpo[i,j]に記録
  po[(i-1) mod 4+1,(i-1) div 4+1]:=i;
 end;
 po[4,4]:=0; //16番目のピースの場所を0にして空欄扱いにする
 img[16].Visible:=false; //16番目のピースを見えなくする
 randomize; //乱数の初期化
 for j:=1 to 4 do begin
  for i:=1 to 4 do begin
   repeat
    x:=random(4)+1; //xの値を1〜4の任意の数にする
    y:=random(4)+1; //yの値を1〜4の任意の数にする
   until (po[i,j]<>po[x,y]) and (po[x,y]<>po[4,4]); //po[i,j]とpo[x,y]が同じにならないように
                                   //そして空欄を選ばないようにする
   z:=po[i,j]; //po[i,j]の値をzに代入
   po[i,j]:=po[x,y]; //po[i,j]にpo[x,y]の値を代入
   po[x,y]:=z; //po[x,y]にzの値を代入
  end;
 end;
 
 for j:=1 to 4 do begin //po[i,j]の値によってピースを並べ替える
  for i:=1 to 4 do begin
   if po[i,j]<>0 then begin //po[i,j]の値が0でなければ,以下を実行
    img[po[i,j]].left:=100*(i-1)+2; //
    img[po[i,j]].Top:=100*(j-1)+2; //
   end;
  end;
 end;
end;

 これで,「ゲームの開始」のメニューをクリックするとピースがばらばらに並び替えられて表示されます。
 
 次回が最終回で,成功したかどうかの判別を行います。

−トップへ−