2023-08-17

優しく解説シリーズ第三段、今度は「jig.jp Engneers' Blog」で腕試しとして使われている、マインスイーパー。JavaScriptでチャレンジしてみました。(→ すぐ遊びたい人はこちら

マインスイーパ - Wikipedia」によると誕生は1980年代。BASICでプログラミングを覚えた多数の若者がゲームを作りまくっていた頃。一躍有名になったのは、ソリティアと並び、Windows標準のゲームに入っていたこと。

ルールはシンプル。格子状のフィールド、すべての爆弾の位置を特定せよ。隣接する爆弾の数がヒントとして表示される。

早速、実装開始!ss.sabae.ccを開いて、やってみましょう! <main id=main></main> <script type="module"> const w = 10; const h = 6; const fld = new Array(w * h); for (let i = 0; i < fld.length; i++) { fld[i] = 0; } </script> フィールド表示用のmainタグを設置。幅w、高さhのフィールドを1次元配列としてつくり、0で初期化。 const nmine = 10; const rnd = (n) => Math.floor(Math.random() * n); for (let i = 0; i < nmine; i++) { const idx = rnd(w) + rnd(h) * w; if (fld[idx]) { i--; continue; } fld[idx] = 1; } 続いて、爆弾の数nmineの分だけランダムに1をセットする。すでに爆弾があればやりなおし。 for (let i = 0; i < h; i++) { for (let j = 0; j < w; j++) { const txt = document.createElement("input"); main.appendChild(txt); } main.appendChild(document.createElement("br")); } フィールドを表示。手っ取り早く格子状を実現するためINPUTタグを使う。 <style> input { text-align: center; width: 2em; height: 2em; } </style> INPUTタグは標準だと横に長すぎるのでCSSで調整する。 let rest = w * h - nmine; for (let i = 0; i < h; i++) { for (let j = 0; j < w; j++) { const txt = document.createElement("input"); const idx = j + i * w; txt.onclick = () => { if (fld[idx]) { alert("gameover!"); return; } if (txt.value) return; txt.value = "?" rest--; if (!rest) { alert("congrat!") } }; main.appendChild(txt); } main.appendChild(document.createElement("br")); } フィールドの特定のマスがクリックされたときの処理を onclick に設定する関数として書く。爆弾に触れたらゲームオーバー。爆弾以外のマスの数restだけクリックできたらクリアのノーヒント版マインスイーパーのできあがり!? const getHint = (x, y) => { let cnt = 0; for (let i = y - 1; i <= y + 1; i++) { for (let j = x - 1; j <= x + 1; j++) { if (j < 0 || i < 0 || j >= w || i >= h) continue; cnt += fld[j + i * w]; } } return cnt; }; ノーヒントはつらいので、ヒントを計算する関数を作ります。 txt.value = getHint(j, i); txt.value = "?"; の替わりにヒントを設定して、今度こそできあがり!

あとは、いい具合にデザインを整えたり、タイムを出したり、フラグを立てられるようにしたり、連続して開くようにしたり、派手な演出を加えたり、初回爆弾を防いだり、クリアできない問題がでなくなる工夫をしたり、協力プレー・対戦プレーを加えたり、好きなように自由に改造しましょう!(→ 連続オープン対応版


「60行マインスイーパー」
src on ss.sabae.cc
ゲームの裏側が分かって遊ぶと、いつもの違ったアイデアが出てくるかも?


jigインターン、本日のアクティビティ、jigのエンジニアによるライブコーディング!IchigoJam webでのプログラミングも体験してもらいました。手軽に使える楽しい技術がたくさん!ガンガン創ろう!

links
- マインスイーパーを作って腕試し|jig.jp engineers
- 優しく解説、ゆうちょ口座読み替えウェブアプリを作ってみよう!
- 優しく解説、タイマーウェブアプリを作ってみよう!CSSでより美しく、jigインターン開始!

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS