Mafia (Wrewolf라고도 함)는 대략 다음과 같은 파티 게임입니다.
- 게임은 0 일에 시작합니다. 매일
n
밤이되면n
. 매일 밤마다n
온다n+1
. 즉D0, N0, D1, N1, D2, N2
... - 0 일 새벽에 호스트는 비밀리에 특정 역할을 수행 할 플레이어를 선택합니다.
- 일부 플레이어는 마피아가됩니다. 매일 밤, 모든 마피 오소는 플레이어를 선택합니다. 다음 날 새벽, 가장 많은 마피아 오가 선택한 플레이어가 죽습니다. 그들은 게임에서 영구적으로 제거되고 그들의 역할이 공개됩니다. 마피아 정렬.
- 일부 플레이어는 경찰이됩니다. 매일 밤, 각 경찰은 플레이어를 선택합니다. 다음 날 새벽, 경찰은 선수들의 정렬을 알게됩니다. 마을 정렬.
- 몇몇 플레이어는 의사가됩니다. 매일 밤, 각 의사는 선수를 선택합니다. 이 플레이어가 마피아가 죽이기로 선택한 플레이어와 동일하면 그날 밤 마피아의 행동이 취소됩니다. 마을 정렬.
- 다른 역할로 선정되지 않은 모든 선수는 주민입니다. 마을 사람들은 도시 전체에서 공유하지 않는 능력이 없습니다. 마을 정렬.
- 매일 0 일을 제외한 모든 도시 (즉, 모든 살아있는 플레이어)가 플레이어에게 투표합니다. 하루가 끝나면 해당 플레이어가 게임에서 제거되고 역할이 공개됩니다. (0 일째에는 모든 사람이해질 무렵까지만 차가워집니다.)
- 어떤 시점에서 남아있는 마피아가 없다면, 게임은 모든 마을 정렬 플레이어가 승리 한 것으로 끝납니다 (죽은 자 포함).
- 어느 시점에서든, 마을 정렬 플레이어가 마피아 정렬 플레이어 수보다 많지 않으면, 게임은 모든 마피아 정렬 플레이어로 승리합니다 (죽은 자 포함).
이 도전에 대한 목표는 Mafia에서 다른 봇을 이길 봇을 작성하는 것입니다!
작동 로봇을 만드는 방법
당신은 모든 이 나를 위해 공급이라는 파일입니다 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
지난 밤에 킬이 없으면 두 번째 줄은 생략되고 세 번째 줄은 경찰에게만 표시됩니다.
예를 들어
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
이 메시지가 끝나면 하루가 시작됩니다! 각 봇은 하루 종일 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 개를 제외한 모든 메시지는 특정 플레이어를 나타냅니다. 이러한 메시지 중 하나를 말하려면을 쓰십시오 say message_id player_name
. 처음 다섯 개의 메시지 중 하나에 대해서는을 쓰십시오 say message_id
. 대화중인 플레이어의 이름을 지정하여 두 가지 모두에 선택적인 세 번째 인수를 추가 할 수 있습니다 (모든 플레이어는 여전히 읽을 수 있지만 대상 수신자는 누구인지 알 수 있습니다).
봇이 메시지를 말하면 모든 플레이어는을 읽습니다 your_bot says "message"
. 여기에서 message
작성한 ID와 관련된 메시지가 있습니다. 메시지에 제목이 포함 된 경우 메시지 끝 바로 뒤에 공백 문자 하나와 제목이 삽입됩니다. 수신자가 포함 된 경우, 이름, 콜론 및 공백 문자가 메시지 바로 앞에 삽입됩니다.
마지막 날에, 모든 살아있는 선수들은 투표 결과를보기 위해 마지막으로 한 번 달리게됩니다. 플레이어가 투표를했다면 다음과 같이 쓰여집니다.
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?
입니다. 이 경우 보호하려는 플레이어의 이름을 출력하십시오.
그 후 다음 날은 정상적으로 시작됩니다.
게임당 한 번만 자신을 저장할 수 있습니다.
일반 정보
- 6 명 이상의 플레이어가 없으면 게임이 실행되지 않습니다.
- 반올림 한 플레이어의 3 분의 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)
입니다.
봇 예제
랜디 로봇은 좋은 마피아 선수가 아닙니다. 랜디는 거의 모든 것을 무시하고, 무엇을 말할 것인지, 누가 투표 할 것인지, 야권을 가진 사람을 무작위로 선택합니다.
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 사용할 수,이 문제에 대한 제어 프로그램을 작성 여기 .
당신은 한 달 동안 코드를 작성하고 답변을 제출할 것입니다. 나는 우승 봇 (최고의 승률 타이 브레이커가 투표합니다)에게 최소 50 명의 평판 현상금을 줄 것입니다 (한 달에 얼마나 많은 담당자를 얻을 수 있는지에 따라 다름)
컴파일 된 언어와 함께 사용하기 위해 @Blacksilver에서 만든 래퍼 스크립트는 다음과 같습니다.
#!/bin/bash
run="./a.out"
compile="gcc bot.c"
if [ -e $run ]; then
$run
else
$compile
$run
fi
에 넣으십시오 run
.
이 게시물은 @undergroundmonorail에 의해 작성되었습니다 (몇 가지 편집했습니다).
그는 그것을 끝내고 게시하고 싶은 누군가에게 여기 에 그것을 포기 했다.