Adaptive Minesweeper開発日記

14 Minesweeper Variants, Bombe, Minesweeper spoiled by AI

14 Minesweeper Variants やら、Bombe やら、Minesweeper spoiled by AI やらをプレイ中、運要素が存在しないマインスイーパーというより、運要素が存在するがなるべく低確率でミスになるようなところを踏む ことに焦点を当てたマインスイーパーを作ってみたら面白そうというアイデアが降り注ぐ。

その時偶然近くで使われてた単語、adaptiveがピッタリ当てはまったので、 Adaptive Minesweeperというタイトルに。

 n番煎じ?

既出かどうかは調べてない。調べる気がでないし、もしダブってるのを知ったらモチベーションが無くなるだけなので。

開発環境

御存知の通り、マインスイーパーは 充足可能性問題 なので(多分)、NP完全である(多分)。 Web上で公開するにはJavascriptは少々非力である。そこでRustを使って、Webassemblyで組む。

https://github.com/Nishinoyama/adaptive-minesweeper

フロントエンドも公開しようと思ったが、なんか npm の create-app をしたら、もとプロジェクトで使われてたgitファイルが含まれていて、これpushしていいのか?になってわからなくなり、ほったらかしに。

第一段階、バニラマインスイーパ

とりあえず、non-adaptiveなマインスイーパーを作って遊ぼうになるのがサガ。 こんなもん、イェローコーダーにかかれば楽ちんよ。なおメンテナンス性。

あまりにもトリビアルだったので、スクショはない。

なお、コーディングにおいて、GitHub Copilot君はとてもお世話になった。面倒だけプログラミングとかを全てやってくれた。

第二段階、適応的化

適応的化、英語で adaptivization????

ここから実装が爆発し始める(早すぎ) マインスイーパーのプレイヤーがあるマスをクリックして開けるのときの処理をイメージし、次のフローで組んだ。

  1. すべてのマスは「非確定」とする
  2. あるマスを数字とともに、「確定-空」として確定させる。(確定させることが論理的に不可能の場合、処理は終了する)
  3. 確定した「非確定」マスの周りを「ヒントマス」として管理する。
  4. ヒントマスを「空」か「爆弾」かで総当りし、一意に定まる場合、そのマスを確定させる。

なお、2.で決定する数字はフロントに委ね、そのフロントエンドはランダムな数を選んでいる。(バックで副作用持たせたくないよ~)

性格が悪いので、数字はたまに 「?」と表記され、ノーヒントになったりする。最悪。

また、その数字が正しいか正しくないかの判定は総当たりで行われており、非確定マスが増えると指数関数的に計算時間量が増える。最悪。

あれ?

なんか数年前にこの記事書いていたらしい(下書きに眠ってた)。軽く加筆/修正したのでポイしよう(?)

SPÉCIESLE開発日記

Wordle, Worldle, ポケモンWordle

Wordle やら ポケモンWordle やら Worldle やらをプレイ中、 Worldle は世界各国を位置を元に球面上空間に落とし込んでいるWordleがあるならば、 ポケモンをそれら種族値を元に6次元ユークリッド空間に落とし込んだ Wor(l)dle を作ってみたら面白そうというアイデアが降り注ぐ。

ポケモン(pokémon)の種(species)族と接尾辞leの命名規則に従ってSpéciesleというタイトルに。*1

 n 番煎じ?

既出かどうかは調べてない。調べる気がでないし、もしダブってるのを知ったらモチベーションが無くなるだけなので。

ゲーム性が確立(?)するまで

初期段階 8/8

本家 Worldle と同じ回答と答えの(ユークリッド)距離を教える形にしていた。 Worldle では国のシルエットがわかるように、答えのポケモン種族値だけ表示していた。

初期 8/9 ピクシーぽかったがどうみてもヤドラン
これでは流石に難易度が高すぎた。まあ、全部の種族値を知っているポケモンマスターはeasyなんだろうけど。 種族値表示は最終的に無くすつもりだったので難易度は崩壊するのが目に見えた。

初期2 8/9

距離と各種族値の近さのインジケーターを表示させた。誤差10以内なら黄色、ピッタリで緑、そうでなければ灰色。これでWordleっぽさが出た。

初期2 馬鹿じゃねえの(嘲笑)
なお、画像は種族値が表示されているが、緑判定を得られるまで隠されている。

最終 8/10

回答したポケモン種族値を表示させた。また、ヒントとして答えの種族値の総和を表示させる形にし、難易度のしるしを見えるようにした。

最終(総和表示無し) 8/11 4世代まで
最終(総和表示あり) 8/11 それはそう

既知のバグ

同一種族値

いや、想定してました。最終的な扱いは、同一種族値ならどのポケモンでも正解にするにして回避した。

100-100-100-100-100-100とかが典型例。
100-100-100-100-100-100とかが典型例。 78-84-78-109-85-100、50-35-55-25-25-15などもダブっている。何のポケモンなのかは読者への課題とする。

同種の別種族値

想定外でした…(なんで?) 冒頭で述べたとおり、種族値というネーミングから種族だけでそれが唯一に決まる思ってたらそうではない。 未解決。最悪…

世代ごとで更新される種族値

想定内だが、これで例外を打つのは不可能なので最新世代に基づくという注釈をかけることで解決する予定。

異常難易度

🙃🙃🙃🙃🙃🙃

遊ぼう

そんな Spéciesle はここからプレイ可能である。プレイするたびに答えとなるポケモンは変わる。是非。

終わり。

*1:これは大事故で、ポケモンは種によって種族値が決まるわけではない。例えばデオキシスのフォルム別など。ってことは種族値っていう語彙の選択がバグっている…ってコト!?なお種族値の英名は(base) stats なので Statslé などが一番しっくり来たかも(後悔)

ぬいぐるみを抱こう!

ぬいぐるみを抱こう

こんばんは。アホです。ぬいぐるみを抱いていたらすごい安心することが分かったので、このブログの投稿に至りました。ついでにMarkdown記法のテストでもあります。

今も胸元にイルカのぬいぐるみが鎮座して居ます。むちゃくちゃ柔らかいので緩衝材*1にもなります。

本記事は今感じたぬいぐるみ抱擁効果をつらつらと執筆していきます。

*1:精神的にも物理的にも

続きを読む

【閲覧注意】6日目の記事の3章の無制限版

!!!閲覧注意!!!

何も考えず書いた結果、奈😁/良,🙄.高/🤗専 A.d/v,😛e/n.t/ Ca/l.e,😇,n/d.a,,r から切り離すべきと判断しました(検索避け)

はてな匿名ダイアリーに書いているようなレベル。マジで痛いので心してから読んで下さい。キツいと感じたらすぐブラウザバックを。

⏬⏬⏬⏬⏬⏬⏬⏬⏬⏬⏬⏬⏬⏬⏬⏬

続きを読む

こいつついにセグ木を自力で使ってACしやがった

通った瞬間の記憶がない(大嘘)

こいつついにセグ木を自力で使ってACしやがった

問題の問題(PCK2018Pre11)https://onlinejudge.u-aizu.ac.jp/challenges/sources/PCK/Prelim/0390?year=2018

問題を見た瞬間、結合律が頭をよぎる。結合律→セグ木の発想。あとは実装するだけ。

ライブラリのセグ木バグってて草

バグ治療に1時間以上かかっとるやんけ!こんなんACちゃうわボケ

お前に足りないのは解くスピードだ

早解き出来ないと門前払いですよ!

今回のコンテストhttps://atcoder.jp/contests/jsc2019-qualで自分に足りないものがはっきりわかったんだね、早解き力、これだ。

続きを読む