Edited at

量子オセロというゲームを作りました


はじめに

プログラミングを独学で勉強中の大学院生です。

量子オセロというゲームを作ったので、その実装を行いました。

「プログラミング初心者がpythonの勉強がてら、オセロAIを作ってみた」をリファクタリングさせていただいたを一部参考にさせていただきました。

Windows10, Chromeでのみテストしています。

こちらで遊べます。


注:当初はてなブログに書いていた記述をこちらに移動しました。

量子人狼や量子将棋を知っているでしょうか。量子人狼であれば役職や生死を、量子将棋であれば駒を重ね合わせとして扱うような新しいゲームです。詳しくは、各自調べていただくとして、こんな感じの""量子ゲーム""を作りたいなと思いました。

そして一つの可能性に気付きました。オセロです。量子大富豪も考えたのですが、「マスクメン」の劣化にしかならなかったので、諦めました。


ルール

基本は通常のオセロ同じです。大きく違うのは、石の色が重ね合わせの状態にあることです。

まず、初期配置を考えます。オセロのルールをあまり弄りたくなかったので、中央に4つ石を置くというルールはそのままです。ただ石は量子化されているので、



の16通りの状態があります。先手が、右上の石のさらに右上の位置に石を打つとします。



の8通りの場合、石を返すことができないため、石を置けませんが、以下の8通りは石を返すことができ、石を置けます。ここで注意しておきたいのは、持ち石も量子化されているため、相手の色を置いて返すことができる場合も含むということです。



そして、実際に置いた結果が次の通りです。



先ほど持ち石が量子化されていると書きましたが、自分の色と相手の色が等確率だと勝負がつかないので、自分の色が相手の色より1.2倍でやすいことにし、対称性を崩しています。(盤の確率比は左上から、5:5:6:6:5:5:6:6となります。)

そして、このような複数の状態の重ね合わせを表わす手段として、それぞれの石が黒である確率(%)を用いています。例えば先ほど置いた石について計算する(存在比をそれぞれ足して比をとる)と、黒:白 = 24:20 = 6:5となることがわかります。つまり黒である確率は、6÷11×100≒55%となるので、55が表示されます。実際、下の図のようになります。グレーの丸は50を意味し、黒と白が22:22=1:1であることと合致します。

表記は0は白丸、1〜49は数字をそのまま白色で、50はグレーの丸、51〜99は数字をそのまま黒色で、100は黒丸で表わすことにしました。



次に後手が、白が1.2倍で表になりやすい量子石を置き、といった感じで手番を交代し、ゲームを進めていきます。

試合終了時、黒である確率が51以上の石を黒石、49以下の石を白石として扱い、石の数が多い方が勝ちです。