LINE人狼プログラム(python)

(追記:はじめに なんかこの記事アクセスが多いので書いておくと、プログラムの中身は変数を入れ替えるだけのPython習いたて小学生か?って内容なので全く参考にならないと思います。)

 

 えー、毎度すみません。これもがっつり身内向けです。

 python人狼GM処理用コードを書いたので使えるもんなら使ってみろ。俺には無理だ。バグとか見つけてもそっとしておいてくれ。

 動作環境はAndroid(5.0.2)端末、QPython3というアプリケーションで書いて動かしました。Numpyとか使ってないので結構汎用性はあると思います(適当)

 

 まずは役職一覧について。

15人村
役職一覧


─────────────────────────────
村人陣営10(実質9)

占い師1 ○
毎晩1人を占います。
初日のみ3人選んでください。妖狐を除いた人からランダムに結果を教えます。この時どの3人を選んだかのCOは禁止です。

霊媒師1 ○
吊られた人の色がわかります。

黒騎士1 ●
毎晩1人を選んでその人を襲撃から守ります。
占い、霊媒結果は黒です。

見習い占い師1 ○
最初は能力がありません。
占い師が死んだ朝に占いができるようになったというアナウンスが入り、次の夜から占いができます。

犬1 ●
ゲーム開始時に1人選んでその人の飼い犬になります。
自分が生きている間、選ばれた人は騎士の護衛と同じ効果を受けます。要するに襲撃無効です。
ただし、毎晩主人を噛むかどうか選択できます。この襲撃は騎士の護衛を無視し、呪われ、人狼も噛めますが妖狐は噛むことができません。(失敗扱いになる)

逃亡者1 ○
1日目以降夜の時間に1人選び、その人のところに逃亡します。
この時、自分への襲撃・自分への護衛を無効にします。
逃亡先が襲撃された場合、その人と一緒に死亡します。
ただし、逃亡先が犬の主人だった場合、及び逃亡先が護衛されている場合は自分も生き残ります。
人狼のところに逃亡したとき、及び犬が主人を噛むタイミングで犬・主人のところに逃亡した場合は死亡します。
呪われの覚醒に鉢合わせた場合も同様です。

わがままな村人1 ○
「村人」とアナウンスされます。
1位が同数の投票が起こったとき、この人の投票先の人が吊られます。この人が1位の人に投票していなかった場合は決選投票を行います。
例、Aさん4票、Bさん4票でわがままな村人がAさんに投票していたらAさんが処刑されます。どちらにも投票していなかった場合は決選投票です。

呪われた村人1 ○→●
「村人」とアナウンスされます。
人狼に襲撃されても死なず、人狼として覚醒し、人狼部屋に入ります。
この時の色の変化は他の処理より優先されます。
騎士、犬に護衛されている場合は噛まれたものとして扱いません。

村人2 ○
頑張れ。

─────────────────────────────
人狼陣営4

人狼3 ●
人狼部屋で相談できます。毎晩1人を襲撃できます。

狂人1 ○
人狼の味方です。特殊能力は特に無いです。


─────────────────────────────
妖狐陣営1(実質2)

妖狐1 ○
占われると死亡し、襲撃を無効化します。
ゲーム開始時に村人陣営からランダムに1人を魅了し、妖狐陣営に引き入れます。妖狐部屋に入ります。
選ばれた人は勝利条件が妖狐陣営のものになります。
この時呪われた村人を選んだ場合は呪いを上書きするので元々の能力を失います。
魅了された人は妖狐が死亡したときに同時に死亡します。

─────────────────────────────


ゲーム終了条件は①狼が全滅、②狼の数が村人の数と同数になる、で、これらが起こったときに妖狐が生存していれば妖狐陣営の勝利、それ以外ならば①の時は村人陣営の勝利、②の時は人狼陣営の勝利です。②について、狂人と魅了された人は村人としてカウントされ、狐はどちらにもカウントされません。

 続いてコードです。これ最終的に勝利条件判別処理も入れれたら良かったなぁ……

 あとsankashaっていうリストは元々参加者の名前が入ってたのですがこのブログに載せるにあたって消しました。使いたい人は各々入れてね。

vol = "vol.54"
PL = 15
print(vol)

day = input("何日目?")

#役職番号振り
#今だから言うけど0スタートの方が良かったし次からそうしてくれ
#mura=1 wolf=2 uranai=3 reibai=4 kishi=5 kyojin=6 fox=7 wagamama=8 dog=9
#cursed=10 escaper=11 minarai=12

#色
color = ["○","●","○","○","●","○","○","○","●","○","○","○"]

#毎回変わる部分
ya = [8,2,1,2,3,10,2,7,1,9,12,6,4,5,11]
sankasha = [" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "]

tohyo = [0]*PL
tohyor = [0]*PL
kodo = [0]*8

#犬の飼い主
inukai = 1
#狐の相方
haitoku = 12

#変数の定義
y=0
goei=0
uranai=0
toke=0
dog=0
tobo=0
toboshi=0
cc=0
DL = [0]*PL


#役職逆引き
#この部分、本当は要らないんじゃない?
for i in range(PL):
    c = ya[i]
    if c == 11:
        tobosha = i
    elif c == 10:
        cursed = i
    elif c == 12:
        minarai = i
    elif c == 4:
        reibaishi = i
    elif c == 7:
        fox = i
        
m = input("見習い覚醒なら1 ")
n = input("呪われ覚醒なら1 ")
if m == "1":
    ya[minarai] = 3
if n == "1":
    ya[cursed] = 2

#誰かループ処理に詳しい人直して
for i in range (100000):
    w = input("vote(input 0) or attack(input 1) or brake(input 999)")

#投票
    if w == "0":
        xx = int(input("PL No."))
        x = xx-1
        tohyo[x] = int(input("Who voted? or dead?(imput 0)"))
        if tohyo[x] == 0:
            tohyor[x] = "死亡"
            DL[x] = 2
            print (tohyor)
        else:
            tohyor[x] = str(xx)+sankasha[int(x)]+"→"+str(tohyo[x])+sankasha[tohyo[x]-1]
            print (tohyor)
        
#逃亡者
            if ya[x] == 11:      
                toboshi = 0
                tobo = int(input("Where escape? No."))-1
                kodo[1] = "逃亡→" + str(tobo+1)
                if ya[tobo] == 2:
                    toboshi = 1

#騎士
            elif ya[x] == 5:
                goei = int(input("Who guard? No.")) -1
                kodo[2] = "護衛→" + str(goei+1)

#占い
            elif ya[x] == 3:
                toke = 0
                uranai = int(input("Who uranai? No."))-1
                kekka= color[ya[uranai]-1]

                if ya[uranai] == 7:
                    kekka = "○(溶け)"
                    toke = 1
                    
                elif ya[uranai] == 10:
                    cc = 1

                kodo[4] = "占い→" + str(uranai+1) + "→" + kekka

#犬
            elif ya[x] == 9:
                dog = input("attack? yes→input(1) ")
                if dog == "1":
                    dogr = "噛む"
                else:
                    dogr = "噛まない"
                kodo[7] = "犬→" + dogr

#わがまま
            elif ya[x] == 8:
                kodo[6] = "わがまま→" + str(tohyo[x])

            print(kodo)

#襲撃
    elif w=="1":
        y = int(input("Who?"))-1
        kodo[3] = "襲撃→" + str(y+1) 
        print(kodo)

    elif w=="999":
        if 0 in tohyor:
             print("empty vote error")
        else:
            break

    else:
#これに意味はない
        a=1

#全員分集まってからの処理
tokuhyo = [0]*PL
for i in range (PL):
    toku = tohyo.count(i+1)
    if not toku == 0:
        tokuhyo[i] = str(i+1) + sankasha[i] + "→" + str(toku) + "票"

tokuhyor = [i for i in tokuhyo if not i == 0]

print(" ")
print(" ".join(tokuhyor))
print(" ")
tsuri = int(input("吊り(無しなら0)→"))
if not tsuri == 0:
    kodo[0]="吊り→"+str(tsuri)

#襲撃が通るかどうか
miss = 0
if (not kodo[7] == 0 and y == inukai) or y == goei:
    kodo[3] = "襲撃→" + str(y+1) + "(失敗)"
    miss = 1
elif ya[y] == 10:
    kodo[3] = "襲撃→" + str(y+1) + "(覚醒)"
    ya[cursed] = 2
    miss = 1
    
    if cc == 1:
        kodo[4] = "占い→" + str(uranai+1) + "→●(覚醒)"
   

#霊媒
if not tohyo[reibaishi] == 0:
    kodo[5] = "霊媒→" + color[ya[tsuri-1]-1]


#最後

if ya[tsuri-1] == 7:
    toke = 1
if miss == 0:
    DL[y] = 1
    if tobo == y:
        DL[tobosha] = 1 
if toboshi == 1:
    DL[tobosha] = 1
if dog == "1":
    DL[inukai] = 1
if toke == 1:
    DL[uranai] = 1
if DL[fox] > 0 and DL[haitoku] < 2:
    DL[haitoku] = 1

if not tsuri == 0:
    DL[tsuri-1] = 1
    
print(" ")
print(day + "日目")
print(" ")
tohyorr = [i for i in tohyor if not i == "死亡"]
print(" ".join(tohyorr))
print(" ")
if not tsuri == 0:
    print("投票の結果、【" + str(tsuri) + sankasha[tsuri-1] + "】が追放されました。")
    print(" ")
kodor = [i for i in kodo if not i == 0]
print(" ".join(kodor))
print(" ")
#発表時は吊りを除外する

DLr = ""
for i in range (PL):
    if DL[i] == 1:
        DLr = DLr + str(i+1) + sankasha[i]

print("死亡→"+DLr)

 

 英語も日本語もPythonもガバガバで恥ずかしいな。