前回はJavaScriptで15パズルをつくりましたが、ブログ名が鳩でもわかるC#なのでC#(WindowsForms)でも作ってみます。

Pieceクラスの定義

まず、ピースを描画するためのPieceクラスを定義します。使用する定数はForm1クラスで以下のように定義されています。

コンストラクタ

Pieceクラスを以下のように定義します。

コンストラクタにはピースに描画するBitmapオブジェクトとそのピースがどの位置に配置されるべきか(行と列番号)を渡します。

描画処理

ピースの描画の処理をする部分を示します。

Bitmapを描画したあとピース番号と外枠を描画します。

外枠は描画しないでBitmapのみを描画する処理を示します。

座標のセット

ピースを固定する位置にセットする処理を示します。

クリック時への対応

クリックされた座標が固定されているピースの内部かどうかを調べる処理を示します。

ピースは正しい位置にあるかどうか?

固定されているピースが本来あるべき位置にあるかどうかを調べる処理を示します。

Form1クラスの定義

Form1クラスを定義します。デザイナで以下のようなものをつくります。

初期化の処理

もとのイメージをリソースから読み込んで16分割してそれぞれのピースを生成します。そして生成されたPieceオブジェクトをリストに格納します。そのあとパズルが解けるまでの時間を計測するためのタイマーと描画更新処理用のタイマーのふたつを初期化します。

Timer.Tickイベント時の処理

Timer.Tickイベントが発生したら消費時間のインクリメントまたは描画更新処理をおこないます。

描画処理

描画をする処理の部分を示します。

パズルが完成していない場合はピースには画像だけでなく枠線や番号を描画します。完成時には画像だけを描画します。if文で処理を切り分けています。そのあと消費時間を描画します。

ピースを移動させる処理

マウスボタンが押下されたらピースを移動させます。ただしピースが移動中の場合とすでにパズルが完成している場合はなにもしません。

MoveTo16メソッドはピースを16番ピースがある位置へすべるように移動させます。そして16番ピースを第一引数のピースがあった位置に移動させます。

キー操作でも移動できるようにします。

ピースをシャッフルする

[スタート]ボタンが押されたらピースをシャッフルし、消費時間を0にリセットしたあとタイマーをスタートさせます。

ピースをシャッフルしたあと置換パリティーをチェックします。置換パリティーが偶でないなら解けないパズルになっているのでシャッフルの処理をやり直します。

ピースをシャッフルする処理を示します。