中核処理の仕様
![]() |
とりあえず、中核処理部分の仕様だけ書いておきますね
|
![]() |
あっ、やっぱりコードの中身まで解説する気はないんだ。
|
- ソースコード: Game.cs
今回作った15パズルは以下のような仕様になっています。
セルの値を参照:
- 左上から右下に、0~15のインデックス番号を割り当てています。
- セルの値にも0~15の番号を割り当てていて、15番が空セルを表します。
- インデクサー(this[i])を使って、セルの値を参照します。
初期化
- セルをランダムに並べ替えます。
キー入力
- キー入力でのゲームプレイを想定して、方向を指定してセルを動かします。
- 例えば、「右」キーで、空セルの左側のセルを右に移動します。

マウスクリック
- マウスクリックでのゲームプレイを想定して、インデックスを指定してセルを動かします。
- 指定したインデックスのセルが空セルと隣接していれば、そのセルを動かします。そうでなければ何もしません。
クラス実装
この仕様を実装するクラスは以下のようになります。
public class Game
{
// 盤面をランダムに初期化。
public void Initialize() { … }
// セルの状態番号を取得。
public int this[CellIndex i] { get; }
// マウスクリックでセルを動かすためのメソッド。
// セルのインデックスを指定。
public MoveResult Move(CellIndex i) { … }
// キー操作でセルを動かすためのメソッド。
// 動かしたい向きを指定。
public MoveResult Move(Direction key) { … }
}
セルの移動(Move)の結果(MoveResult)は以下のような情報を持ちます。
public struct MoveResult
{
// 所望の操作が可能だったかどうか。
// 操作可能だった(=セルの状態が変化した)ら true。
public bool Success { get; }
// 変化したセルのインデックス。
// セルの入れ替え(= 変化するのは2つ)なので、そのうちの1つ目。
public CellIndex Index1 { get; }
// 変化したセルのインデックス。
// セルの入れ替え(= 変化するのは2つ)なので、そのうちの2つ目。
public CellIndex Index2 { get; }
}


