Mafia (juga dikenal sebagai Werewolf) adalah gim pesta yang bermain kira-kira seperti ini:
- Permainan dimulai pada hari ke 0. Setelah setiap hari
n
datang malamn
. Setelah setiap malamn
datang seharin+1
. yaituD0, N0, D1, N1, D2, N2
... - Pada dini hari 0, tuan rumah diam-diam memilih pemain untuk mengisi peran tertentu:
- Sejumlah pemain menjadi mafia. Setiap malam, setiap mafioso memilih pemain. Pada subuh keesokan harinya, pemain yang dipilih oleh sebagian besar mafiosos terbunuh. Mereka secara permanen dihapus dari permainan dan peran mereka diungkapkan kepada publik. Selaras mafia.
- Beberapa pemain menjadi polisi. Setiap malam, setiap polisi memilih pemain. Pada subuh keesokan harinya, polisi menjadi sadar akan keselarasan para pemain itu. Village-aligned.
- Sejumlah pemain menjadi dokter. Setiap malam, setiap dokter memilih pemain. Jika pemain ini adalah pemain yang sama dengan yang dipilih mafia untuk dibunuh, tindakan mafia untuk malam itu dibatalkan. Village-aligned.
- Semua pemain yang tidak dipilih untuk peran lain adalah penduduk desa. Penduduk desa tidak memiliki kemampuan yang tidak dimiliki oleh seluruh kota. Village-aligned.
- Setiap hari kecuali hari 0, seluruh kota (yaitu, semua pemain yang hidup) memberikan suara untuk seorang pemain. Pada akhirnya, pemain itu dikeluarkan dari permainan dan peran mereka diungkapkan. (Pada hari 0, semua orang hanya kedinginan sampai malam hari.)
- Jika, pada titik mana pun, tidak ada mafiosos yang tersisa, permainan berakhir dengan semua pemain yang selaras dengan desa menang (termasuk yang mati).
- Jika, pada titik mana saja, pemain yang selaras dengan desa tidak melebihi jumlah pemain yang selaras mafia, permainan berakhir dengan semua pemain yang selaras mafia menang (termasuk yang mati).
Untuk tantangan ini, tujuan Anda adalah menulis bot untuk mengalahkan bot lain di Mafia!
Cara membuat bot yang berfungsi
Yang harus Anda berikan untuk saya adalah file bernama run
. Di dalam struktur direktori tempat tantangan ini terjadi, bot Anda akan tinggal di sini:
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/
The run
berkas, ketika dijalankan, akan membuat bot Anda melakukan hal tersebut. Penting untuk dicatat bahwa file ini tidak boleh memerlukan argumen baris perintah atau apa pun. Ini akan dijalankan persis seperti ./run
. Jika Anda perlu dieksekusi dengan cara yang berbeda, Anda harus mengatasinya dengan melakukan sesuatu seperti ini:
real_bot.py
#!/bin/python2
# code goes here
run
#!/bin/bash
./real_bot.py --flags --or --whatever
Satu hal penting yang perlu diperhatikan adalah bahwa semua input yang diterima bot Anda akan ditemukan dalam file from_server
dan program kontrol akan mencari output bot Anda to_server
. Saya memilih untuk melakukannya dengan cara ini sehingga bahasa apa pun yang dapat melakukan file I / O dapat berpartisipasi. Jika bahasa Anda membuatnya lebih mudah untuk bekerja dengan stdin dan stdout daripada file I / O, Anda mungkin ingin menulis run
file yang terlihat seperti ini:
#!/bin/bash
./real_bot.py < from_server > to_server
Ini akan membuatnya sehingga stdin berasal dari from_server
file dan stdout langsung menuju to_server
.
Bot Anda tidak akan tetap berjalan selama permainan. Sebaliknya, itu akan dijalankan ketika perlu membuat keputusan. Demikian juga, itu tidak akan diinformasikan ketika sudah mati, itu tidak akan berjalan lagi. Rencanakan ini dengan menyimpan apa pun yang ingin Anda ingat ke file dan membacanya nanti. Anda dapat membuat, menulis atau membaca dari file apa pun di folder bot Anda, tetapi Anda tidak boleh menulis atau membaca di mana pun di luar folder itu, termasuk akses jaringan atau apa pun . Jika bot Anda mengetahui sesuatu yang tidak diceritakan dari dalam folder, atau jika menyentuh apa pun yang tidak ada di dalam folder itu, bot Anda didiskualifikasi.
Cara membuat bot fungsional
Hari
Di awal permainan, file players
akan diisi dengan daftar semua pemain dalam game yang dibatasi-baris baru. Itu tidak akan diperbarui karena pemain meninggalkan permainan.
Pada dini hari 0, semua pemain akan menemukan pesan ini di from_server
file mereka :
Rise and shine! Today is day 0.
No voting will occur today.
Be warned: Tonight the mafia will strike.
Jika Anda adalah polisi, garis You are the cop
ditambahkan ke akhir. Dokter melihat You are the doctor
. Mafia melihat You are a member of the mafia.\nYour allies are:
dan daftar anggota mafia yang dibatasi baris baru, tidak termasuk pemain yang membaca pesan.
Di awal hari-hari lainnya, pesan ini akan muncul:
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
diganti dengan jumlah hari. victim
diganti dengan nama korban tadi malam, dan victim_role
merupakan salah satu dari:
a villager
a mafioso
the cop
the doctor
cop_target
adalah nama pemain yang diselidiki polisi tadi malam, dan target_alignment
entah itu village
atau mafia
. Akhirnya, remaining_players
adalah daftar pemain yang masih hidup dalam format ini:player1, player2, player3
Baris kedua dihilangkan jika tidak ada pembunuhan tadi malam, dan baris ketiga hanya ditampilkan kepada polisi.
Sebagai contoh,
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
Setelah pesan ini keluar dari jalan, hari dimulai! Setiap bot dapat melakukan 50 aksi sepanjang hari, di mana "aksi" memberikan suara untuk pemain atau mengatakan sesuatu dengan keras.
Untuk memilih pemain, tulis vote player_name
ke to_server
file Anda dan akhiri. Untuk memilih untuk tidak membunuh siapa pun, tulis vote no one
. Saat Anda memilih, semua pemain (termasuk Anda) akan melihat your_bot votes to kill your_selection
. Suara diabaikan pada hari ke 0.
Sejumlah pesan yang telah ditentukan dapat dikirim ke semua pemain. Id dari setiap pesan yang mungkin tercantum di sini:
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?
Semua pesan ini kecuali lima yang pertama mengacu pada pemain tertentu. Untuk mengatakan salah satu pesan itu, tulis say message_id player_name
. Untuk salah satu dari lima pesan pertama, cukup tulis say message_id
. Anda dapat menambahkan argumen ketiga opsional untuk keduanya, menentukan nama pemain yang Anda ajak bicara (semua pemain masih bisa membacanya, tetapi mereka akan tahu siapa penerima yang dimaksud).
Ketika bot Anda mengatakan pesan, semua pemain membaca your_bot says "message"
, di mana message
pesan itu terkait dengan id yang Anda tulis. Jika pesan menyertakan subjek, satu karakter spasi dan subjek dimasukkan langsung setelah akhir pesan. Jika itu termasuk penerima, nama mereka, satu titik dua dan satu karakter spasi dimasukkan segera sebelum pesan.
Pada akhirnya, semua pemain yang hidup dijalankan untuk terakhir kalinya untuk melihat hasil pemungutan suara. Jika seorang pemain dipilih, ini ditulis:
The town has killed player_name!
They were a villager
... atau a mafioso
, atau the cop
, atau the doctor
.
Jika tidak ada pemain yang dipilih, ini ditulis sebagai gantinya:
The town opted to lynch no one today.
Ketika controller mengirim pesan-pesan ini, ia mengabaikan respons dari pemain. Hari sudah berakhir.
Malam
Pada malam hari, semua orang kecuali penduduk desa bisa menggunakan kekuatan mereka.
Mafia:
Anda akan membaca It is night. Vote for a victim.
. Ketika ini terjadi, keluarkan nama pemain yang ingin Anda bunuh.
Polisi:
Anda akan membaca It is night. Who would you like to investigate?
. Ketika ini terjadi, keluarkan nama pemain yang ingin Anda periksa.
Dokter:
Anda akan membaca It is night. Who would you like to save?
. Ketika ini terjadi, keluarkan nama pemain yang ingin Anda lindungi.
Setelah ini, hari berikutnya dimulai seperti biasa.
Anda dapat menyelamatkan diri hanya sekali per game.
Informasi Umum
- Game tidak akan berjalan tanpa 6 pemain atau lebih.
- Sepertiga pemain, dibulatkan ke bawah, akan menjadi mafia. Satu pemain akan menjadi dokter, dan satu pemain akan menjadi polisi. Semua pemain lain adalah penduduk desa.
- Ikatan dalam pemungutan suara desa atau mafia semalam diselesaikan secara acak.
- Nama bot harus + tanda hubung alfanumerik dan garis bawah.
- Dilarang menggunakan pengetahuan kode lawan secara langsung. Secara teori, saya harus bisa menempatkan bot Anda melawan bot yang belum pernah Anda lihat sebelumnya dan membuatnya tampil sebanding.
- Sayangnya, jika saya tidak bisa menjalankan program Anda menggunakan perangkat lunak bebas (seperti bir), saya harus membatalkannya.
- Saya berhak untuk mendiskualifikasi pengajuan jika saya yakin itu berbahaya. Ini termasuk, tetapi tidak terbatas pada penggunaan waktu, memori, atau ruang untuk menjalankan yang berlebihan. Saya sengaja membiarkan batasnya lunak, tetapi ingat: Saya menjalankan ini di komputer rumah saya, bukan komputer super, dan saya tidak ingin mendapatkan hasil yang membutuhkan waktu satu tahun. Saya tidak berharap harus menggunakan ini, karena standar saya cukup rendah. Ini pada dasarnya "jika saya pikir Anda sengaja menjadi penipu", dan jika Anda bisa meyakinkan saya kalau tidak saya akan membalikkan keputusan saya.
Mencetak gol
Setiap putaran, 100 permainan akan dijalankan (ini dapat meningkat karena lebih banyak bot bergabung untuk menjaga ukuran sampel cukup besar, tetapi secara teori itu tidak akan mempengaruhi apa pun). Saya akan mencatat berapa kali setiap bot menang sebagai penduduk desa dibandingkan dengan berapa kali bot bermain sebagai penduduk desa, dan sama untuk mafia. Bot villager_ratio
adalah number of games won as villager / number of games played as villager
, dan mafia_ratio
sama tetapi s/villager/mafia/g
. Skor bot adalah (villager_ratio - mean villager_ratio) + (mafia_ratio - mean mafia_ratio)
.
Contoh bot
Randy the Robot bukanlah pemain mafia yang baik. Randy mengabaikan hampir semua hal, secara acak memilih apa yang akan dikatakan, siapa yang harus dipilih, dan siapa yang harus ditargetkan dengan kekuatan malam.
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
Pengendali
@undergroundmonorail menulis program kontrol untuk tantangan ini, tersedia di sini .
Anda memiliki satu bulan untuk kode dan menyerahkan jawaban, saya akan memberikan bot yang menang (pemecah dasi tingkat menang tertinggi adalah suara) setidaknya 50 reputasi hadiah (tergantung pada berapa banyak rep yang bisa saya dapatkan dalam sebulan)
Berikut ini skrip wrapper, dibuat oleh @Blacksilver, untuk digunakan dengan bahasa yang dikompilasi:
#!/bin/bash
run="./a.out"
compile="gcc bot.c"
if [ -e $run ]; then
$run
else
$compile
$run
fi
Menempatkan ini dalam run
.
Posting ini ditulis oleh @undergroundmonorail (saya membuat beberapa suntingan).
Dia memberikannya di sini kepada siapa saja yang ingin menyelesaikan dan mempostingnya.