人狼ゲームの勝率計算をやってみた【Python】

「人狼ゲームって、確率ゲームじゃないのかな。推理する意味があるのかなぁ。」

そんな疑問に答えます!

今回は人狼ゲームを確率で計算してみることにしました。

なお、僕は人狼ゲーム好きな理系人間です。

「アルティメット人狼」や「人狼最大トーナメント」など、人狼ゲームをYouTubeやニコニコ動画でよく観ています。実際にプレイするのは年に一回友人と楽しむ程度で低レベルプレイヤーです。数年前に1度だけ対面人狼会に参加したことがあるのですが、皆さん上手すぎて、僕はただただ混乱する村人でした。人狼アプリもあるのでやってみたのですが、見知らぬ人と代わる代わるプレイするのは続かず。

相変わらずプレイヤーとしてはダメダメですが、普段は研究者として生計を立てつつ、サイエンス・エバンジェリストとして科学技術を世間に伝えるための教育活動もしています。記事の信頼性が担保できるかと思います。

それではいきましょう!

人狼ゲーム = 論理ゲーム×ブラフゲーム

人狼ゲームとは、村人陣営が人狼を追放していくため推理をおこなうゲームです。僕が大学生の頃に流行り始めた気がします。

推理が重要になるゲームで、村人陣営が協力して推理を進めます。しかし、村人陣営に混ざっている人狼陣営がブラフ(はったり)を言うことによって、村人陣営を混乱させていきます。占い師や霊媒師といった特殊能力を持つプレイヤーが、村人陣営に情報を共有することで村人陣営の推理を加速させ、勝率を上げていくゲームになっています。

詳しいルールについては、こちらのページをみてください。(人狼TLPTとは、役を演じながら人狼ゲームをプレイする公演です。YouTube動画でみせてもらったりしましたが、今度ぜひ観にいきたいです。)

「人狼は確率じゃない!推理するものだ!」といわれるそうです。本当かなぁ、と疑ってしまった僕は、今回実際にプログラムを作成し、計算してみることにしました。

今回はシステム上可能なパターンを進めていき、勝率を計算してみます。つまり、推理を全くしないでゲームした場合に何が起きるのかを確認してみようというわけです。

人狼プログラム

今回、人狼ゲームで村が勝利する確率を計算するプログラムを作成しました。推理を全くしないでランダムに処刑していきます。詳細は後ほど説明します。

計算では、よくプレイされる『13人村(人狼3、騎士1)』というレギュレーションについて計算してみました。100,000回ゲームをおこない、勝率を計算します。コンピュータだからできることですね。

さて、肝心の結果ですが、村の勝率 26%となりました。なるほど、やはり村が不利という設定になっているようです。

計算した結果は以下です。よく人狼2、騎士1の11人村や13人村が遊ばれていることから、村の勝率は20~50 %がゲームバランスが良いと考えられているようです。

計算結果のまとめ

プレイヤー人数/人狼/騎士/村の勝率
131066 %
131170 %
132039 %
132144 %
133021 %
133126 %
111063 %
111167 %
112035 %
112140 %
91060 %
91163 %
92030 %
92135 %

詳しいコードの説明

それではコードを確認していきましょう。ここからはプログラミングができる理系の方向けですね。

使用した言語はpythonです。人狼ゲームで村が勝利する確率を計算するプログラムを作成しました。ここで、推理を全くしないでランダムで人狼ゲームをプレイした場合ですので、人狼、騎士、村人の役職だけを考慮します。推理はしないので、占い師や霊媒師は村人と同じ扱いになります。変数はそれぞれローマ字で書いたのでかっこ悪いのはお許しください。(もしバグなど見つけたら教えてください)

#Jinro-calcuration
import random
import numpy


num = 10**5
count = 0

for i in range(num):
    number = 13
    jinro = 1
    kishi = 0
    murabito = number - jinro - kishi

    #one-game
    for j in range(number):

        #day-time
        if random.random()<(jinro/(murabito+jinro+kishi)):
            jinro -= 1
        elif jinro/(murabito+jinro+kishi) < random.random()  < ((jinro+kishi)/(murabito+jinro+kishi)):
            kishi -= 1
        else:
            murabito -= 1

        if jinro >= (murabito+kishi):
            print("Jinro Win", "(mura:",murabito+kishi,", jinro:",jinro,")")
            break
        elif jinro == 0:
            print("Mura Win", "(mura:",murabito+kishi,", jinro:",jinro,")")
            count += 1
            break

        #night
        if kishi >= 1:
            if random.random()<(kishi/(murabito+kishi)):
                kishi -= 1
            else:
                if kishi >= 1:
                    if random.random()>(1/(murabito+kishi)):
                        murabito -= 1
        else:
                murabito -= 1
        

print("Mura Win Ratio: ", count/num*100, "%")

結論

やはり、推理が重要ということですね。確率で攻めていくと基本的には村陣営が負けやすくなっていきます。役職者の情報を頼りに、人狼陣営のブラフに惑わされずに推理していくことで、勝率を上げていくというわけです。

結論ですが、人狼は推理で勝つゲーム!

当たり前のことでしたでしょうか笑

最後に

コロナ自粛で暇していましたのでプログラムを書いて計算してみました。(この記事、需要があるのだろうか…。)

人狼ゲームを遊ぶと、いつも全ての可能性を追ってしまって、頭の中が大混乱してしまうのですよね。推理をしないと、村陣営が負ける可能性が高いというわけですね。確率論で進めると負けるわけです。これで割り切って、推理を進められる気がします。改めて、色んな人狼動画を観たくなりました。

今度は「村人に間違いない」と信じられる人を村人陣営が見つけられた場合の計算もしてみたいと思います。ではまた。

あと、一緒に人狼やってくれる方、募集しています。