自動マインスイーパーを作りました
はじめに
マインスイーパーというゲームを知っていますか?
マインスイーパーとは、格子状のマスのうちのどこかに地雷が埋まっており、マスの周りにいくつ地雷があるか、という情報のみを元に地雷原を突破していくゲームです。 Windowsマシンに標準搭載されていたこともあり、名前はよく知られていると思います。
僕はこのマインスイーパーが昔から大好きで、暇つぶしにいつもやっています。 といっても、やっているのはPCのソフトではなくiPhoneアプリの方です。
色々なマインスイーパーアプリをインストールして試してきましたが、このアプリが一番動作が快適です。 自分の実力としては、上級のベストが58秒といったところです。このマインスイーパーですが、言ってしまえば単純作業の繰り返しです。 もちろん頭を使う推論も時には必要なのですが、基本的にはやることは単純です。 それなので、単純作業はパソコンに任せてどうしても人間の頭が必要な時だけ考えたい!と思い、自動でマインスイーパーを解くというアプリを製作しました。
自動マインスイーパー
こちらが自動マインスイーパーのURLです。 最近githubの使い方を覚えたので、試しにgithubでアプリを公開してみました。
マインスイーパー (Google Chromeでしか動作を保証しません)
左クリック、右クリック、左右同時クリックともにちゃんと動作します。 また、自動化ボタンを押すことで、ある程度盤面を自動で開くことができます。 難易度は初級からマニア級まで選択することができ、自動化の際の速度も5段階で選択することができます。
実装に苦労した点
苦労したところは、左右同時クリックの実装です。 JavaScriptでは左右同時クリックのイベントが起こる際は、必ずそのイベントの直前にクリックか右クリックのイベントも起こってしまうのです。 これを解決するために、まずクリックイベントが起こった際に数ミリ秒待ち、その後にその間に左右同時クリックイベントが起こっているか確認し、起こっていたらそれを実行、起こっていなかったら左or右クリックを実行、といった風に実装しました。 この方法だとマスを押した時間とマスが開く時間にラグが生じてしまうため、タイムアタックに影響が出てしまうかもしれません。 この辺はもっと良い実装方法があるかもしれないですね。
今後の展望
今の自動化は2つの動作を繰り返すことで実装しています。
- 旗を立てられるところに全て立てる
- 左右同時クリックで開けられるところを全て開ける
しかしこれでは推論で開けられる箇所を開けることができません。 そのため、そこを改良し自動でよりたくさん開けられるようにするのが一番の課題です。 この点については、知り合いの東大生が推論のできる自動マインスイーパーを作成したらしいです。 そのコードを見ながら今後作っていこうかなーなんて思っています。
それでは!
はじめに
こんばんは、うえしゅうと申します。 初めましての方は初めまして。
毎日ネットサーフィンをし続ける中、アウトプットって大切だよなあと思い、新しく技術系の事を書くブログを立ち上げました。 毎日更新を目標に頑張っていきたいと思います。
自己紹介
HN
ネットの中ではうえしゅうというハンドルネームでやっています。 中学生の頃から変えていないのですが、意外と他人と被らなくて重宝しています。
趣味
趣味はルービックキューブの早解きです。 だいたい10秒くらいで解けます。 一発芸としてとても使えるので、皆さんもやってみてはいかがでしょうか。 解き方はこのサイトがわかりやすいです→http://tribox.com/3x3x3/solution/
書くこと
毎日ネットサーフィンをしていて面白かったサイト、気になる情報などを紹介していきたいと思います。 技術系ブログと題しているので、プログラミングの話とかガジェットの話とかになると思います。 また、自分で作ったプログラムなどがあればそれも紹介していきます。
それでは!