Mafya (aynı zamanda Kurtadam olarak da bilinir) kabaca bu şekilde oynayan bir parti oyunudur:
- Oyun 0. günde başlar. Her gün
n
bir geceden sonran
. Her geceden sonran
bir gün geliyorn+1
. yaniD0, N0, D1, N1, D2, N2
... - O günün şafağında, bir ev sahibi gizlice bazı rolleri doldurmak için oyuncuları seçer:
- Bazı oyuncular mafya olur. Her gece, her mafya bir oyuncu seçer. Ertesi günün şafağında, en mafiosos tarafından seçilen oyuncu öldürülür. Oyundan kalıcı olarak çıkarılırlar ve rolleri halka açıklanır. Mafya hizalanır.
- Bazı oyuncular polis olur. Her gece, her polis bir oyuncu seçer. Ertesi günün şafağında, polis bu oyuncuların uyumunu fark eder. Köy hizalanmış.
- Bazı oyuncular doktor olur. Her gece, her doktor bir oyuncu seçer. Eğer bu oyuncu mafyanın öldürmeyi seçtiği oyuncuysa, mafya'nın o gece için yaptıkları iptaller. Köy hizalanmış.
- Başka bir rol için seçilmeyen tüm oyuncular köylülerdir. Köylülerin tüm kasaba tarafından paylaşılmayan hiçbir yeteneği yoktur. Köy hizalanmış.
- 0 gün hariç her gün, tüm kasaba (yani tüm yaşayan oyuncular) bir oyuncuya oy verir. Günün sonunda, bu oyuncu oyundan çıkarılır ve rolleri açıklanır. (0. Günde herkes akşama kadar ürperir.)
- Herhangi bir noktada, kalan mafiosos yoksa, oyun köyün hizalı tüm oyuncularının galip gelmesiyle sona erer (ölüler dahil).
- Eğer herhangi bir noktada köy hizasında olan oyuncular mafya hizalı oyuncuları geride bırakmazsa, oyun mafya hizalı tüm oyuncuların galip gelmesiyle sona erer (ölüler de dahil).
Bu meydan okuma için amacınız Mafya'daki diğer botları yenmek için bir bot yazmak!
Çalışan bir bot nasıl yapılır
Bana vermeniz gereken tek şey, adında bir dosya run
. Bu zorluğun gerçekleşeceği dizin yapısının içinde botunuz burada yaşayacak:
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
Dosya, çalıştırıldığında, bot onun şey yapacaktır. Bu dosyanın herhangi bir komut satırı argümanı veya başka bir şey gerektirmemesi gerektiğine dikkat etmek önemlidir. Aynen olduğu gibi çalıştırılacak ./run
. Farklı bir şekilde uygulanmanız gerekiyorsa, bunun gibi bir şey yaparak bunun üzerinde çalışmak zorundasınız:
real_bot.py
#!/bin/python2
# code goes here
run
#!/bin/bash
./real_bot.py --flags --or --whatever
Unutulmaması gereken önemli bir nokta, botunuzun aldığı tüm girişlerin dosyada from_server
bulunacağı ve kontrol programının botunuzun çıkışını aradığıdır to_server
. Bu şekilde yapmayı seçtim, böylece I / O dosyalarını yapabilen herhangi bir dilin katılabiliyordu. Diliniz stdin ve stdout ile çalışmayı dosya G / Ç'den daha kolay hale getirirse, run
şuna benzeyen bir dosya yazmak isteyebilirsiniz :
#!/bin/bash
./real_bot.py < from_server > to_server
Bu, stdin'in from_server
dosyadan geldiğini ve stdout'un doğrudan gittiğini sağlayacaktır to_server
.
Botunuz oyun süresince çalışmaya devam etmeyecek. Bunun yerine, bir karar vermesi gerektiğinde çalıştırılacaktır. Aynı şekilde, öldüğü zaman da bilgi verilmeyecek, artık çalıştırılmayacak. Hatırlamak istediğiniz herhangi bir şeyi bir dosyaya kaydederek ve daha sonra okuyarak bunu planlayın. Botunuzun klasöründeki herhangi bir dosyayı oluşturabilir, yazabilir veya okuyabilir, ancak ağ erişimi veya herhangi bir şey dahil, bu klasörün dışında hiçbir yerde yazamaz veya okuyamazsınız . Botunuz klasörün içinden söylenmediği bir şey biliyorsa veya klasörün içinde olmayan bir şeye dokunursa botunuz diskalifiye edilir.
Fonksiyonel bot nasıl yapılır
Gün
Oyunun başında, dosya oyunda players
yer alan tüm oyuncuların yeni satırlarla sınırlandırılmış bir listesi ile doldurulacaktır. Oyuncular oyundan ayrıldıkça güncellenmez.
0. Günün şafağında, tüm oyuncular bu mesajı from_server
dosyalarında bulacaklar :
Rise and shine! Today is day 0.
No voting will occur today.
Be warned: Tonight the mafia will strike.
Polis sizseniz, satır You are the cop
sonuna eklenir. Doktor görüyor You are the doctor
. Mafya You are a member of the mafia.\nYour allies are:
mesajı okur ve oyuncu hariç yeni satırla ayrılmış bir mafya üyesi listesi görür .
Diğer tüm günlerin şafağında, bu mesaj görünecektir:
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
Günün numarası ile değiştirilir. victim
dün geceki kurbanın adı ile değiştirildi ve victim_role
bunlardan biri:
a villager
a mafioso
the cop
the doctor
cop_target
polis dün gece araştırdık oyuncunun adıdır ve target_alignment
ya bir village
ya mafia
. Son olarak, remaining_players
bu formatta hala canlı olan oyuncuların bir listesi:player1, player2, player3
Dün gece öldürülmediyse ikinci satır atlandı ve üçüncü satır sadece polise gösterildi.
Örneğin,
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
Bu mesaj yolun dışına çıktığında, gün başlıyor! Her bot, gün boyunca 50 eylem yapabilir; burada bir "eylem" bir oyuncuya oy verir veya yüksek sesle bir şeyler söyler.
Bir oyuncuya oy vote player_name
vermek için to_server
dosyanıza yazıp sonlandırın. Kimseyi öldürmemeye oy vermek için yaz vote no one
. Oy verdiğinizde, tüm oyuncular (siz dahil) görür your_bot votes to kill your_selection
. Oylar 0. günde yok sayılır.
Tüm oyunculara önceden tanımlanmış birkaç mesaj gönderilebilir. Her olası mesajın kimliği burada listelenmiştir:
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?
İlk beşi dışında bu mesajların tümü belirli bir oyuncuya atıfta bulunuyor. Bu mesajlardan birini söylemek için yazın say message_id player_name
. İlk beş mesajdan biri için, sadece yazın say message_id
. Konuştuğunuz oyuncunun adını belirterek, her ikisine de isteğe bağlı üçüncü bir argüman ekleyebilirsiniz (tüm oyuncular hala okuyabilir, ancak amaçlanan alıcının kim olduğunu bilirler).
Botunuz bir mesaj söylediğinde, tüm oyuncular okur your_bot says "message"
, message
yazdığınız kimliğinizle ilgili mesaj nerede ? Mesaj bir konu içeriyorsa, bir boşluk karakteri ve konu doğrudan mesajın sonundan sonra eklenir. Bir alıcı içeriyorsa, adları, bir iki nokta üst üste ve bir boşluk karakteri mesajın hemen önüne eklenir.
Günün sonunda, tüm canlı oyuncular oyların sonucunu görmek için son kez koşarlar. Bir oyuncu oy kullandıysa, bu yazılır:
The town has killed player_name!
They were a villager
... veya a mafioso
, veya the cop
, veya the doctor
.
Hiçbir oyuncu oy kullanmadıysa, bunun yerine bu yazılır:
The town opted to lynch no one today.
Kumanda bu mesajları gönderdiğinde, oyuncuların verdiği herhangi bir cevabı yok sayar. Gün bitti.
Gece
Geceleri, köylüler dışındaki herkes güçlerini kullanabiliyor.
Mafya:
Okuyacaksın It is night. Vote for a victim.
. Bu olduğunda, öldürmek istediğiniz oyuncunun adını yazınız.
Polis:
Okuyacaksın It is night. Who would you like to investigate?
. Bu olduğunda kontrol etmek istediğiniz oyuncunun adını yazınız.
Doktor:
Okuyacaksın It is night. Who would you like to save?
. Bu olduğunda, korumak istediğiniz oyuncunun adını yazınız.
Bundan sonra, ertesi gün normal olarak başlar.
Oyun başına sadece bir kez kendini kurtarabilirsin.
Genel bilgi
- Oyun 6 veya daha fazla oyuncu olmadan çalışmaz.
- Yuvarlanan oyuncuların üçte biri mafya olacak. Bir oyuncu doktor olacak ve bir oyuncu polis olacak. Diğer tüm oyuncular köylülerdir.
- Köy oyunda veya mafya gecesinde oylarda bağlar rastgele belirlendi.
- Bot isimleri alfanümerik + tire ve alt çizgi olmalıdır.
- Rakibin kod bilgisini doğrudan kullanmak yasaktır. Teorik olarak, botunuzu daha önce hiç görmediğiniz botlara karşı koyabilmeli ve karşılaştırmalı olarak çalışmasını sağlamalıyım.
- Ne yazık ki, yalnızca ücretsiz (birada olduğu gibi) yazılımı kullanarak programınızın çalışmasını engelleyemezsem, diskalifiye etmek zorunda kalacağım.
- Kötü niyetli olduğuna inanıyorsam, herhangi bir kaydı diskalifiye etme hakkını saklı tutarım. Bu, çalıştırılacak çok fazla zaman, bellek veya alan kullanımı içerir, ancak bunlarla sınırlı değildir. Kasıtlı olarak limiti yumuşak bıraktım, ama unutma: Bunu ev bilgisayarımda çalıştırıyorum, bir süper bilgisayarda değil, sonuç almak için bir yıl almak istemiyorum. Standartları oldukça düşük olduğu için bunu kullanmak zorunda beklemiyorum. Bu temelde "bilerek bi sik olduğunuzu düşünüyorsanız" ve beni başka türlü ikna ederseniz kararımı tersine çeviririm.
puanlama
Her turda 100 oyun oynanacak (bu, örneklem büyüklüğünü yeterince büyük tutmak için daha fazla bot birleştirdikçe artabilir, fakat teoride hiçbir şeyi etkilemeyecek). Her bir botun kaç defa bir köylü olarak oynadığına kıyasla bir köylü olarak kazandığını ve bunun mafya için de aynı olduğunu kaydedeceğim. Bir bot en villager_ratio
olduğunu number of games won as villager / number of games played as villager
ve mafia_ratio
aynı ama s/villager/mafia/g
. Bir botun puanı (villager_ratio - mean villager_ratio) + (mafia_ratio - mean mafia_ratio)
.
Örnek bot
Randy Robot, iyi bir mafya oyuncusu değil. Randy, ne söyleyeceğini, kime oy vereceğini ve gece güçleriyle kimi hedef alacağını seçerek rastgele her şeyi görmezden geliyor.
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
kontrolör
@ undergroundmonorail, bu görev için burada bulunan bir kontrol programı yazdı .
Cevaplamak ve cevap vermek için bir ayınız var, kazanan botu (en yüksek kazanma oranı kırıcı oylar) en az 50 itibar ödülü vereceğim (bir ayda ne kadar rep kazanabileceğime bağlı olarak)
Derleme dilleri ile kullanmak için @ Blacksilver tarafından yapılan bir sarma komut dosyası İşte:
#!/bin/bash
run="./a.out"
compile="gcc bot.c"
if [ -e $run ]; then
$run
else
$compile
$run
fi
Bunu içine koy run
.
Bu yazı @ undergroundmonorail tarafından yazılmıştır (Birkaç düzenleme yaptım).
Bitirmek ve göndermek isteyen herkese burada pes etti.