14 Minesweeper Variants, Bombe, Minesweeper spoiled by AI
14 Minesweeper Variants やら、Bombe やら、Minesweeper spoiled by AI やらをプレイ中、運要素が存在しないマインスイーパーというより、運要素が存在するがなるべく低確率でミスになるようなところを踏む ことに焦点を当てたマインスイーパーを作ってみたら面白そうというアイデアが降り注ぐ。
その時偶然近くで使われてた単語、adaptiveがピッタリ当てはまったので、 Adaptive Minesweeperというタイトルに。
番煎じ?
既出かどうかは調べてない。調べる気がでないし、もしダブってるのを知ったらモチベーションが無くなるだけなので。
開発環境
御存知の通り、マインスイーパーは 充足可能性問題 なので(多分)、NP完全である(多分)。 Web上で公開するにはJavascriptは少々非力である。そこでRustを使って、Webassemblyで組む。
https://github.com/Nishinoyama/adaptive-minesweeper
フロントエンドも公開しようと思ったが、なんか npm の create-app をしたら、もとプロジェクトで使われてたgitファイルが含まれていて、これpushしていいのか?になってわからなくなり、ほったらかしに。
第一段階、バニラマインスイーパー
とりあえず、non-adaptiveなマインスイーパーを作って遊ぼうになるのがサガ。 こんなもん、イェローコーダーにかかれば楽ちんよ。なおメンテナンス性。
あまりにもトリビアルだったので、スクショはない。
なお、コーディングにおいて、GitHub Copilot君はとてもお世話になった。面倒だけプログラミングとかを全てやってくれた。
第二段階、適応的化
適応的化、英語で adaptivization????
ここから実装が爆発し始める(早すぎ) マインスイーパーのプレイヤーがあるマスをクリックして開けるのときの処理をイメージし、次のフローで組んだ。
- すべてのマスは「非確定」とする
- あるマスを数字とともに、「確定-空」として確定させる。(確定させることが論理的に不可能の場合、処理は終了する)
- 確定した「非確定」マスの周りを「ヒントマス」として管理する。
- ヒントマスを「空」か「爆弾」かで総当りし、一意に定まる場合、そのマスを確定させる。
なお、2.で決定する数字はフロントに委ね、そのフロントエンドはランダムな数を選んでいる。(バックで副作用持たせたくないよ~)
性格が悪いので、数字はたまに 「?」と表記され、ノーヒントになったりする。最悪。
また、その数字が正しいか正しくないかの判定は総当たりで行われており、非確定マスが増えると指数関数的に計算時間量が増える。最悪。
あれ?
なんか数年前にこの記事書いていたらしい(下書きに眠ってた)。軽く加筆/修正したのでポイしよう(?)