Most explosive

もっとも爆発的

受賞者:Yusuke Endoh

引用元:https://www.ioccc.org/2020/endoh1/prog.c

審査員・作者による説明:https://www.ioccc.org/2020/endoh1/index.html

動作

半自動マインスイーパ。

$ gcc -o prog prog.c -lncurses

$ ./prog
1クリックだけで広がった様子
図:1クリックだけで広がった様子

端末で起動し、マウスクリックすると普通のマインスイーパのようにマスを開いて機雷の有無を調べる。 数字が出たら、その周りの8セルのうちその数だけ機雷があるということを意味する。 Rを押したら現在のゲームを捨てて新しいゲームを開始する。 Qで終了。

特徴は、簡単な推論でわかるところは自動的にやってくれてしまうところ。 上記の画面は、1クリックしただけで勝手に広がりきったところ。

初期配置を指定することもできる。

$ ./prog ioccc.txt
機雷の配置を指定して実行した様子
図:機雷の配置を指定して実行した様子

デモ動画。

図:作者によるデモ動画(引用元:https://www.youtube.com/watch?v=3SLf94gqUy0

解説

マインスイーパをプレイするときは、ふつう、次の2種類のアクションとなる。

  1. 機雷がなさそうなマスを第六感で選んでヒントを得る
  2. ヒントをもとに機雷がないマスを特定していく

しかし、(2)の方は間違いやすく、時間の無駄。こういう作業は機械にやらせるべき。 ということで、局所的な推論で機雷の有無が決定するマスを自動的に特定していく機能を備えたマインスイーパ。

ふつうのマインスイーパでも0のマスを開いた場合は自動的に周りのマスを開いてくれるものが多い。 その推論をもうちょっと賢くしたとも言える。

次の4つのルールに基づいて自動的に推論する。

言葉ではわかりにくいと思うが、hint.textに例付きで書かれているので参照されたい。 コード上ではこれらのルールを単一の規則にまとめて表現している。