マインスイーパーを作るの1

浅川沿いの桜。 三分咲きぐらいだろうか。

バス停の桜。 こちらも三分咲き。 近所に桜はたくさんあるけど、毎年、こいつが一番綺麗に見える。 見上げるのではなくて見下ろすのが良いのかな。
minesweeper
昨日の続き。
まず何で作るか。
これはいつもの通り、HTML+JavaScriptでいいだろう。 UIが簡単に作れるし、テストも楽だし。
次に何を動作対象に作るか。
俺の手持ちのプラットフォームは WindowsPC, surface, MacBook, iPad, iPhone, nexus で、せっかくだからこれら全てで使えるようにしたい。
と考えていきなり詰まる。 マインスイーパーの操作は開くか旗を立てるかで、これってマウスがあることが前提なんだよな。 左クリックで開き、右クリックで旗を立てる。 が、iPadやiPhoneだと右クリックとか無理だし。
右クリックの代わりに長押しにするか。 そうすると、今度はマウスが使える方で操作性が悪くなりそう。 ドラッグと区別するのも面倒そう。
操作モードを指定するか。 この場合、操作モードをいつ指定するかも問題になる。 開くか旗を立てるかを選択してからクリックするか、逆にクリックする度に開くか旗を立てるかを選ぶようにするか。 ゲームでは何度もクリックするのだから、毎回そのクリックで何をするか選ばされるより、先に選んで次々とクリックする方が楽だろう。 しかし操作モードを間違って旗を立てるつもりで爆弾を開いてしまうなんて事態の防止には、後から選ぶ方が圧倒的に有利なんだよな。 うーん…。
小さなセルが密集している中をマウスでクリックするか指先でタップするかという操作の違いも大きいが、タッチデバイス側は拡大縮小が簡単なので何とかなるだろう。
あと、オリジナルのマインスイーパーは低中高と難易度を選択できたが、この機能は要らない。 どうせ高一択だ。
クリアタイムはどうするかな。 俺の周囲ではタイムアタックが流行っていたが、俺はあのタイムに価値があるとは思えなかったんだよな。 推論能力よりも運の要素の方が圧倒的に大きいし、推論だけで必ずクリアできるって訳でも無いし。 経過時間を取るのも保持するのも簡単だと思うけど、価値を見出せないものに手をかけるのもなぁ…。
ということで仕様。
- 難易度は高相当で固定。 16行30列のセルの中に爆弾が99個。
- 画面のロードでゲームを開始する。
- 開始したら、爆死または完遂で終了するまで止められない。
- 操作モード(開く or 旗を立てる)を、盤面のクリックより先に指定する。 但し初回クリックは開くのみ。
- 操作モードがどちらになっているかを盤面の色で示す。
- 最初にクリックしたセルには爆弾を配置しない。
- セルの状態は、開いているか閉じているか。
- 閉じているセルに対しては、開くか、旗を立てるか、立てた旗を抜くかができる。
- 開いたセルはもう操作できない。
- 旗を立てるか抜くかはクリックによるトグル操作。
- 旗が立っているセルを開くことはできない。 旗を抜いた後なら開くことができる。
- セルを開いたとき、そのセルに爆弾が有る場合、爆死で終了。 全てのセルを開き、爆弾の配置状況を見せる。
- セルを開いたとき、そのセルに爆弾が無い場合、隣接セルの爆弾の数を表示する。 ただし0は空白。
- 隣接するセルの爆弾の数が0の場合、そのセルから連鎖隣接する0のセルを全て開く。 それらに隣接する爆弾が無いセルも開く。
- 旗を立てたセルと未だ開いていないセルの合計が99になったら完遂で終了。
- 爆死、完遂どちらの終了でも、終了までの経過時間をメッセージ表示する。
- 終了メッセージの消去で、次のゲームを開始する。
- 進行状況として、旗が立っているセルの数と未確定状態のセルの数を表示する。
- 爆死で終了の場合、セルの数の意味が無いのでどちらも0を表示する。
だいたいこんな感じで良いだろう。 セルを開いたときに連鎖的に開くところがこれで良かったか今ひとつ自信が無いけど、とりあえずはこれで進めて、何か不都合があったらそのときに考える。
ダラダラ考えてたら遅くなったので、続きは明日。