中核処理の仕様
とりあえず、中核処理部分の仕様だけ書いておきますね
|
|
あっ、やっぱりコードの中身まで解説する気はないんだ。
|
- ソースコード: 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; } }