マフィア(ウェアウルフとも呼ばれます)は、おおよそ次のようにプレイするパーティーゲームです。
- ゲームは0日目から始まり
n
ますn
。毎日が夜になります。毎晩夜n
が来るとn+1
。すなわちD0, N0, D1, N1, D2, N2
... - 0日目の夜明けに、ホストは特定の役割を満たすためにプレイヤーを密かに選択します。
- 一部のプレイヤーがマフィアになります。毎晩、すべてのマフィアがプレイヤーを選びます。翌日の夜明けに、ほとんどのマフィアが選んだプレイヤーが殺されます。それらはゲームから永久に削除され、その役割は公開されます。マフィアアライン。
- 一部のプレイヤーは警官になります。毎晩、各警官はプレイヤーを選択します。翌日の夜明けに、警官はプレイヤーのアライメントを認識します。村に沿って。
- 一部のプレイヤーは医者になります。毎晩、各医師はプレーヤーを選択します。このプレイヤーがマフィアが殺すことを選んだプレイヤーと同じ場合、その夜のマフィアの行動はキャンセルされます。村に沿って。
- 別の役割に選ばれていないプレイヤーはすべて村人です。村人には、町全体で共有されていない能力はありません。村に沿って。
- 0日目を除く毎日、町全体(つまり、すべての生きているプレイヤー)がプレイヤーに投票します。一日の終わりに、そのプレイヤーはゲームから削除され、その役割が明らかになります。(0日目は、誰もが日暮れまで冷えます。)
- いずれかの時点でマフィアが残っていない場合、村に所属するすべてのプレイヤーが勝者(死者を含む)でゲームは終了します。
- いずれかの時点で、村に所属するプレイヤーがマフィアに所属するプレイヤーよりも多くない場合、ゲームはマフィアに所属するすべてのプレイヤーが勝利(死者を含む)して終了します。
このチャレンジの目標は、マフィアで他のボットに勝つためにボットを書くことです!
動作するボットの作り方
あなたが私に提供しなければならないのは、というファイルだけですrun
。このチャレンジが行われるディレクトリ構造内で、ボットはここに住んでいます:
start
controller/
tmp/
players/ # You are here!
some_bot/ # Let's pretend you're some_bot.
to_server
from_server
players
run # This is what you give me
mafia-game-bot/
skynet/
このrun
ファイルは、実行されると、ボットにその働きをさせます。このファイルはコマンドライン引数などを必要としないことに注意することが重要です。として正確に実行され./run
ます。別の方法で実行する必要がある場合は、次のようなことを実行して回避する必要があります。
real_bot.py
#!/bin/python2
# code goes here
run
#!/bin/bash
./real_bot.py --flags --or --whatever
注意すべき重要なことは、ボットが受け取るすべての入力がファイル内にfrom_server
あり、制御プログラムがでボットの出力を探すことですto_server
。ファイルI / Oを実行できるすべての言語が参加できるように、この方法を選択しました。言語がファイルI / Oよりもstdinとstdoutでの作業を容易にする場合、run
次のようなファイルを作成することができます。
#!/bin/bash
./real_bot.py < from_server > to_server
これにより、stdinがfrom_server
ファイルから取得され、stdoutがに直接移動しto_server
ます。
あなたのボットはゲーム中は走り続けません。代わりに、決定を下す必要があるときに実行されます。同様に、死んだときに通知されず、実行されなくなります。覚えておきたいことはすべてファイルに保存し、後で読むことでこれを計画します。ボットのフォルダー内の任意のファイルを作成、書き込み、または読み取ることができますが、そのフォルダー以外の場所(ネットワークアクセスなど)で書き込みまたは読み取りを行うことはできません。あなたのボットが知っている場合は、何もそれがフォルダ内部から語られなかったこと、またはそれが触れた場合は何もそのフォルダ内にない、あなたのボットは失格とされます。
機能的なボットの作り方
日
ゲームの開始時に、ファイルplayers
はゲーム内のすべてのプレイヤーの改行区切りリストで満たされます。プレイヤーがゲームを終了しても更新されません。
0日目の夜明けには、すべてのプレイヤーがfrom_server
ファイル内にこのメッセージを見つけます。
Rise and shine! Today is day 0.
No voting will occur today.
Be warned: Tonight the mafia will strike.
あなたが警官の場合、行You are the cop
は最後に追加されます。医者は見たYou are the doctor
。マフィアはYou are a member of the mafia.\nYour allies are:
、メッセージを読んでいるプレーヤーを除いて、マフィアメンバーの改行区切りリストを確認します。
他のすべての日の夜明けに、次のメッセージが表示されます。
Dawn of day `day_number`.
Last night, `victim` was killed. They were `victim_role`.
Investigations showed that `cop_target` is `target_alignment`-aligned.
These players are still alive: `remaining_players`
dayNumber
は日数に置き換えられます。victim
は、昨夜の被害者の名前に置き換えられ、次のvictim_role
いずれかです。
a villager
a mafioso
the cop
the doctor
cop_target
は、警官が昨夜調査したプレーヤーの名前で、またはのtarget_alignment
いずれvillage
かmafia
です。最後に、remaining_players
この形式でまだ生きているプレイヤーのリストです:player1, player2, player3
昨夜殺害がなかった場合、2行目は省略され、3行目は警官にのみ表示されます。
例えば、
Dawn of day 42.
Last night, Xyzzy was killed. They were a villager.
Investigations showed that Randy is mafia-aligned.
These players are still alive: Randy, CopBot, JohnDoe, Steve
このメッセージが途切れると、その日が始まります!各ボットは1日を通して50のアクションを実行できます。「アクション」はプレイヤーに投票したり、何かを大声で言ったりします。
プレーヤーに投票するにはvote player_name
、to_server
ファイルに書き込んで終了します。誰も殺さないと投票するには、と書いてくださいvote no one
。投票すると、すべてのプレイヤー(あなたを含む)が表示されますyour_bot votes to kill your_selection
。投票は0日目に無視されます。
多数の事前定義されたメッセージをすべてのプレイヤーに送信できます。考えられる各メッセージのIDは次のとおりです。
0: No
1: Yes
2: I am the cop
3: I am the doctor
4: I am a normal villager
5: I trust this player:
6: I think this player is suspicious:
7: I think this player is the cop:
8: I think this player is the doctor:
9: I think this player is a normal villager:
10: I think this player is mafia:
11: Do you think this player is mafia?
12: I tried to save this player:
13: I successfully saved this player:
14: I investigated this player and found that they were mafia-aligned:
15: I investigated this player and found that they were village-aligned:
16: Will you please use your power on this player tonight?
最初の5つを除くこれらのメッセージはすべて、特定のプレーヤーに関するものです。それらのメッセージの1つを言うには、と書きsay message_id player_name
ます。最初の5つのメッセージの1つについては、単に書き込みsay message_id
ます。これらの両方にオプションの3番目の引数を追加して、会話しているプレーヤーの名前を指定することができます(すべてのプレーヤーはそれを読むことができますが、目的の受信者が誰であるかはわかります)。
ボットがメッセージを言うと、すべてのプレイヤーがを読みますyour_bot says "message"
。ここmessage
で、書いたIDに関連付けられたメッセージがあります。メッセージに件名が含まれる場合、1つのスペース文字と件名がメッセージの終わりの直後に挿入されます。受信者が含まれる場合は、名前、コロン、スペース文字がメッセージの直前に挿入されます。
一日の終わりに、投票の結果を見るために、すべての生きているプレーヤーが最後にもう一度実行されます。プレイヤーが投票された場合、これは次のように書かれます。
The town has killed player_name!
They were a villager
...またはa mafioso
、またはthe cop
、またはthe doctor
。
プレイヤーが投票されなかった場合、これは代わりに記述されます:
The town opted to lynch no one today.
コントローラーがこれらのメッセージを送信すると、プレーヤーからの応答は無視されます。一日が終わりました。
夜
夜になると、村人を除く全員が自分の力を使うようになります。
マフィア:
あなたは読むでしょうIt is night. Vote for a victim.
。この場合、殺したいプレイヤーの名前を出力します。
警官:
あなたは読むでしょうIt is night. Who would you like to investigate?
。この場合、確認するプレーヤーの名前を出力します。
医師:
あなたは読むでしょうIt is night. Who would you like to save?
。この場合、保護したいプレーヤーの名前を出力します。
この後、通常どおり翌日が始まります。
ゲームごとに1回だけ保存できます。
一般情報
- ゲームは6人以上のプレイヤーなしでは実行されません。
- プレイヤーの3分の1は切り捨てられ、マフィアになります。1人のプレイヤーが医者になり、1人のプレイヤーが警官になります。他のすべてのプレイヤーは村人です。
- 村の投票またはマフィアの一晩の投票は、ランダムに解決されます。
- ボット名は、英数字+ダッシュとアンダースコアでなければなりません。
- 相手のコードの知識を直接使用することは禁じられています。理論的には、これまで見たことのないボットに対してボットを配置し、同等のパフォーマンスを発揮できるはずです。
- 残念なことに、もしも独占的に無料の(ビールのように)ソフトウェアを使用してプログラムを実行できない場合は、失格にする必要があります。
- 悪意があると思われる場合、提出物を失格にする権利を留保します。これには、実行に時間、メモリ、またはスペースを過度に使用することが含まれますが、これらに限定されません。私は意図的に制限をソフトのままにしましたが、覚えておいてください:私はこれをスーパーコンピューターではなく自宅のコンピューターで実行しているので、結果を得るのに1年かかりたくありません。私の基準はかなり低いので、これを使用する必要はありません。これは基本的に「あなたが意図的にペニスをしていると思うなら」であり、そうでなければ私を納得させることができれば、私は私の決定を覆します。
得点
各ラウンドでは、100ゲームが実行されます(サンプルサイズを十分に大きくするためにより多くのボットが参加すると増加する可能性がありますが、理論上は何にも影響しません)。村人としてプレイする回数と比較して、村人として各ボットが勝つ回数を記録します。マフィアについても同様です。ボットvillager_ratio
はnumber of games won as villager / number of games played as villager
でありmafia_ratio
、同じですが、s/villager/mafia/g
です。ボットのスコアは(villager_ratio - mean villager_ratio) + (mafia_ratio - mean mafia_ratio)
です。
ボットの例
Randy the Robotはマフィアの良いプレイヤーではありません。ランディはほとんど何も無視して、何を言うか、誰に投票するか、誰が夜の力で標的にするかをランダムに選択します。
run.sh
:
#!/bin/bash
./randy.py < from_server > to_server
randy.py
:
#!/usr/bin/env python
import random
with open('players') as f:
p = f.read().split() + ['no one']
day = True
try:
line = raw_input()
if line.endswith(('?', 'victim.')):
day = False
if not day:
print random.choice(p)
else:
if random.random() > 0.5:
if random.random() > 0.5:
print 'vote {}'.format(random.choice(p))
else:
id = random.randint(0, 17)
print 'say {}{}'.format(id, (' ' + random.choice(p)) if id > 4 else '')
except: pass
コントローラ
@undergroundmonorailは、このチャレンジの制御プログラムを作成しました。こちらから入手できます。
コーディングして回答を提出するのに1か月かかります。勝ったボット(最高の勝率のタイブレーカーは投票です)に少なくとも50の評判バウンティを与えます(1か月でどれだけの担当者を獲得できるかによって異なります)
@Blacksilverが作成した、コンパイルされた言語で使用するラッパースクリプトを次に示します。
#!/bin/bash
run="./a.out"
compile="gcc bot.c"
if [ -e $run ]; then
$run
else
$compile
$run
fi
これを入れrun
ます。
この投稿は@undergroundmonorailによって書かれました(私はいくつかの編集を行いました)。