それでは毛玉諸君、これにて失敬

日々の精進を備忘録的に綴ります。

バックギャモンにおけるヒット確率とエンター確率の可視化(Python)

2年前くらいからバックギャモンに凝っていて、BackgammonAceでしこしこレート上げに勤しんでます。

将棋や囲碁と違い、すべてをダイスの出目に委ねて与えられた選択肢の中で最適ムーブを選択するというゲーム性が、自分の人生っぽくてしっくりくるのです。

レートも人生の如く低迷していますが。。
ここ最近はテキストを購入して勉強に励んでいます。

 

で、バックギャモンでは確率を常に考えてプレイする必要があります。

ダイス2個の出目の確率計算なので暗算でもできますが、今回はPythonのグラフ作成の練習としてヒット確率とエンター確率を計算し、グラフを作成しました。

ヒット確率

def hit(pt):
    cnt = 0
    for dice1 in range(1,7):
        for dice2 in range(1,7):
            if dice1 == pt or dice2 == pt or dice1+dice2== pt:
                cnt +=1
            elif dice1 == dice2:
                for i in range(1,5):
                    if dice1*i == pt:
                        cnt += 1
                        break
    return cnt/36*100

引数を相手のブロットとの距離としてヒット確率を計算する関数を用意。

hit(7) #相手のブロットが7pt離れた場所にあるときのヒット確率
#出力 16.666666666666664

この関数を用いて横軸に距離、縦軸にヒット確率を持つグラフを作成。

import numpy as np
import matplotlib.pyplot as plt
hit_per = {}
for num in range(1,25):
    hit_per[num] = hit(num)
plt.bar(hit_per.keys(), hit_per.values())
plt.xlabel("distance of blot")
plt.ylabel("hit probability")
plt.show()

f:id:ko_ya346:20190915180250p:plain
ダイレクトショット(~6ptまで)のヒット確率が高いことが分かります。
7pt以降は20%以下と確率が一気に下がるので、スロットを行う際は7pt以上の位置に置くことを意識したいです。
まぁいくら離れてても平気でヒットされるがありますけどね。
そういう時は相手の強運を褒め称えましょう。
ヒットされる可能性があるならば、それはヒットするのです。

マーフィーの法則 - Wikipedia


エンター確率


ヒットされた駒を盤上に戻すエンターの確率を見てみましょう。
相手のインナーボードにあるポイントの数によってエンター確率が変わります。
まずは駒が1つバー上にある時のエンター確率を可視化してみます。

def enter(point_num):
    return (1-(point_num/6)**2)*100
enter_per = {}
for i in range(1, 7):
    enter_per[i] = enter(i)
enter_per
plt.bar(enter_per.keys(), enter_per.values())
plt.xlabel("number of point at opponent inner board")
plt.ylabel("enter probability")
plt.show()

f:id:ko_ya346:20190915182153p:plain
ポイントが3か所以下であればエンター確率は7割以上あります。
基本的に安全といっていいでしょう。


問題はダブルヒットされた場合のエンター確率です。
1個だけエンター、2個ともエンターする確率をそれぞれ検証します。

point_num = [1,2,3,4,5,6]
enter_one = []
enter_two = []
for i in point_num:
    enter_one.append((i/6)*(6-i)/6*100)
    enter_two.append(((6-i)/6)**2*100)

plt.bar(np.array(point_num)+0.2, enter_two, label="two enter", width = 0.2)
plt.bar(point_num, enter_one, label="one enter", width = 0.2)
plt.xlabel("number of point at opponent inner board")
plt.ylabel("enter probability")
plt.legend()
plt.show()

f:id:ko_ya346:20190915182456p:plain
ポイントが2か所の場合で2個ともエンターする確率は50%以下、
3か所だと30%以下で、2個ともエンターする確率はかなり低くなりました。
勝率計算はまだ出来ませんが、キューブアクションの良い判断材料になるのではないでしょうか。
自分のインナーボードにポイントが複数ある場合は積極的にダブルヒットを狙っていきたいですね。

おわりに

ヒット確率とエンター確率を可視化することで理解が深まりました。
特に2個オンザバーしている場合の2個ともエンターする確率が感覚以上に低く衝撃でした。
あとmatplotlibの基本的な使い方を学べるいい教材にもなりました。