Readme: マインスイーパ確率解析 (ver.2.0)

目次

  1. 概要

    マインスイーパの解きかけの盤面における各セルの地雷の確率を計算します。 基本は地道に全探索ですが、いろいろ工夫しているので結構高速で動きます。 理論的基礎はパズル的マインスイーパ攻略法研究 Study6を参考にしてください。

  2. 内容ファイル

  3. 動作対象

  4. 開発環境

  5. インストール・アンインストール

    インストールは配布アーカイブを解凍するだけ、アンインストールは上記内容ファイルをフォルダごと消すだけ。

  6. 使い方

    通常(mineprob.exeを利用・マインスイーパ画面読み込み)

    あらかじめマインスイーパはカラー表示にしておいてください。

    マインスイーパが起動している状態で「確率計算」ボタンを押すと マインスイーパの画面を読み取り、確率を計算して、結果がマインスイーパの画面に反映されます。 色と確率の関係は以下の通りです。

    ■青(#0000FF) 0%
    ■水色(#00FFFF) 10%
    ■黄緑(#00FF00) 20%
    ■黄色(#FFFF00) 50%
    ■赤(#FF0000) 100%

    これらの中間の確率なら、中間的な色になります。例えば5%なら■#007FFFです。 青っぽいほど確率が低い、緑っぽいほど平均的な確率、赤っぽいほど確率が高いと思ってください。 正確な確率は、セルにマウスを合わせると、確率解析のプログラムの確率欄に表示されます。

    「詳細をファイルに出力」をチェックすると、 計算結果が同じフォルダにテキストファイルで保存されています。 2007-10-13_12-05-06.txtみたいな名前で保存されます。

    一番下の大きいテキストエリアには確率計算の進行状況が出ます。 探索に時間がかかる場合は、探索状況が出力されます。 あまりにも時間がかかりそうな場合(滅多にないと思いますが)、 プログラムを強制終了するとかマインスイーパを一時的に最小化するとかの目安にしてください。

    マインスイーパの画面の再描画がかかるとせっかく計算してつけた色が消えます。「確率を再プロット」ボタンを押すと、同じ色で着色することができます。

    テキストファイルから確率を計算(mineprob.exeを利用)

    まずデータとなるテキストファイルを作成します。 テキストファイルの例としてdata1.txtを添付しているので参考にしてください。 1行目に半角数字で残り地雷数を書き、 2行目以降には012345678* (全角スペース)の11文字、または012345678fuの11文字(※1)を使って盤面の状態を記述してください。 0/0は周囲に地雷がないと確定しているセル(普通のマインスイーパ画面では窪んで数字が書かれないセル)、 */fは旗を立てているセル、  (全角スペース)/uは未確定のセルです。

    計算が終わると、GUI版と同様のファイル名のテキストファイルに結果を保存します。

    ※1 半角スペースが混じっていると無視します。 要するに出力されたファイルからコピペするだけでデータファイルが作れるようにしたいわけです。

    Rubyソースから起動

    Ruby, VisualuRuby(仮称)をインストールしておいてください。(開発環境と同じバージョンの方が安全です。)mineprob.exe同等のGUI版の他、CUI版が存在します。

    コマンドプロンプトでソーススクリプトのあるフォルダに移動し、GUI版の起動ならruby gui.rb、CUI版の起動ならruby cui.rb、と打てば起動します。あと、screen.rbを単体で起動すると画面定義ファイル(後述)を作成するのに便利かもしれません。screen.rbの単体起動の場合、ソースを開いて下の方を読んでください。

    CUI版(cui.rb)

    起動するとデータをどこから取得するか聞かれます。数字を入れてEnterを押してください。

    マインスイーパ画面の場合は、次にどの画面定義ファイルを使うか聞かれます。数字を入力したら、GUI版と同様マインスイーパの画面からセルの状態を取得して確率を計算します。

    テキストファイルの場合は、次にどのテキストファイルを読むか聞かれます。ファイル名を入力するとGUI版と同様にファイルに結果を書き出してくれます。

    画面定義ファイルの作成

    画面定義ファイルはYAML形式で作ります。YAMLの書き方自体についてはRubyist Magazine - プログラマーのための YAML 入門 (初級編)で勉強してください。

    ファイルの拡張子は必ずymlにして、実行ファイルと同じフォルダに置けばプログラムに読み込まれるようになります。

    YAMLがわかれば、付属のwinxp.ymlを見ればどういうように書くかおおよそ見当はつくと思いますが、一応解説します。 画面定義

  7. 権利義務等

  8. 更新履歴

    ver.2.0
    • 確率計算にグループ化を実装し高速化、探索を深さ優先から幅優先にする。 ついでに確率計算処理を派手に書き直す(見通しはだいぶ良くなった)。
    • ゼロ割系バグを大量処分。
    • 例外を捕捉する場所を増やしたので落ちることはだいぶ減ったはず。その後のエラーメッセージが手抜きだけど。
    • GUI版をしばらく使っているとプロットが白くなって、以後動かなくなるバグを修正。
    • GUI版とCUI版の機能をほとんど同じにする(GUI版のテキスト読み込み追加、CUI版の画面読み込みで確率の色をプロットするようになる)。 そのついでにCUI版はexe配布しないことに(GUI版も安定してきたことだし)。
    • 確率を再プロットするボタンの追加。
    • 画面を読み書きの定義をスクリプト内から画面定義ファイルに追いやって、違うマインスイーパ実装への拡張を簡単に。
    • readmeを画面定義ファイルの解説画像を貼りたいためだけにHTML化する。
    ver.2 beta 2
    • GUI版で色のプロットがだんだん重くなる+おかしくなる問題を修正。
    • 確率計算(というか計算の前処理)を間違えることがあるのを修正(+200%とか-50%とか出ることがあった)。
    • 「置いてある旗を信用しない」チェックをGUI版から削除(常にONにした)。
    ver.2 beta 1
    Rubyで一から作り直し。
    ver.1.01
    ソースをいじらなくてもログを参照可能にした。エラーにちょっと強くした。
    ver.1.0
    JavaScriptでとりあえず作ってみた。