Mafia (noto anche come Werewolf) è un gioco di società che gioca all'incirca in questo modo:
- Il gioco inizia il giorno 0. Dopo ogni giorno
n
arriva una notten
. Dopo ogni notten
arriva un giornon+1
. cioèD0, N0, D1, N1, D2, N2
... - All'alba del giorno 0, un host sceglie segretamente i giocatori per ricoprire determinati ruoli:
- Un certo numero di giocatori diventa la mafia. Ogni notte, ogni mafioso sceglie un giocatore. All'alba del giorno successivo, il giocatore scelto dal maggior numero di mafiosi viene ucciso. Vengono definitivamente rimossi dal gioco e il loro ruolo viene rivelato pubblicamente. Mafia-allineati.
- Alcuni giocatori diventano poliziotti. Ogni notte, ogni poliziotto sceglie un giocatore. All'alba del giorno successivo, il poliziotto viene a conoscenza dell'allineamento di quel giocatore. Village-allineati.
- Un certo numero di giocatori diventa medico. Ogni notte, ogni medico sceglie un giocatore. Se questo giocatore è lo stesso giocatore che la mafia ha scelto di uccidere, le azioni della mafia per quella notte vengono annullate. Village-allineati.
- Tutti i giocatori che non sono scelti per un altro ruolo sono abitanti del villaggio. I villici non hanno abilità che non sono condivise da tutta la città. Village-allineati.
- Ogni giorno tranne il giorno 0, l'intera città (cioè tutti i giocatori viventi) vota per un giocatore. Alla fine della giornata, quel giocatore viene rimosso dal gioco e il loro ruolo viene rivelato. (Il giorno 0, tutti si rilassano fino al calar della notte.)
- Se, in qualsiasi momento, non ci sono mafiosi rimanenti, il gioco termina con tutti i giocatori allineati al villaggio vittoriosi (inclusi i morti).
- Se, in qualsiasi momento, i giocatori allineati al villaggio non superano in numero i giocatori allineati alla mafia, il gioco termina con tutti i giocatori allineati alla mafia vittoriosi (inclusi i morti).
Per questa sfida, il tuo obiettivo è quello di scrivere un robot per battere altri robot in Mafia!
Come creare un robot funzionante
Tutto quello che dovete fornire per me è un file chiamato run
. All'interno della struttura di directory in cui si svolgerà questa sfida, il tuo bot vivrà qui:
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/
Il run
file, una volta eseguito, farà sì che il tuo bot faccia la sua parte. È importante notare che questo file non deve richiedere argomenti della riga di comando o altro. Verrà eseguito esattamente come ./run
. Se devi essere eseguito in un modo diverso, dovrai aggirare il problema facendo qualcosa del genere:
real_bot.py
#!/bin/python2
# code goes here
run
#!/bin/bash
./real_bot.py --flags --or --whatever
Una cosa importante da notare è che tutti gli input ricevuti dal tuo bot saranno trovati nel file from_server
e il programma di controllo cercherà l'output del tuo bot to_server
. Ho scelto di farlo in questo modo in modo che qualsiasi lingua in grado di eseguire l'I / O dei file sia in grado di partecipare. Se la tua lingua semplifica il lavoro con stdin e stdout rispetto agli I / O dei file, potresti voler scrivere un run
file simile al seguente:
#!/bin/bash
./real_bot.py < from_server > to_server
Questo lo farà in modo che stdin provenga dal from_server
file e stdout vada direttamente a to_server
.
Il tuo bot non rimarrà in esecuzione per la durata del gioco. Invece, verrà eseguito quando deve prendere una decisione. Allo stesso modo, non verrà informato quando è morto, semplicemente non verrà più eseguito. Pianifica questo salvando tutto ciò che vuoi ricordare in un file e leggendolo in seguito. È possibile creare, scrivere o leggere da qualsiasi file nella cartella del proprio bot, ma non è possibile scrivere o leggere ovunque al di fuori di quella cartella, incluso l'accesso alla rete o altro . Se il tuo bot sa qualcosa che non è stato detto all'interno della cartella o se tocca qualcosa che non è all'interno di quella cartella, il tuo bot viene squalificato.
Come creare un bot funzionale
Giorno
All'inizio del gioco, il file players
verrà riempito con un elenco delimitato da una nuova riga di tutti i giocatori nel gioco. Non verrà aggiornato man mano che i giocatori lasciano il gioco.
All'alba del giorno 0, tutti i giocatori troveranno questo messaggio nel loro from_server
file:
Rise and shine! Today is day 0.
No voting will occur today.
Be warned: Tonight the mafia will strike.
Se sei il poliziotto, la linea You are the cop
viene aggiunta alla fine. Il dottore vede You are the doctor
. La mafia vede You are a member of the mafia.\nYour allies are:
e un elenco delimitato da newline di membri della mafia, escluso il giocatore che legge il messaggio.
All'alba di tutti gli altri giorni, apparirà questo messaggio:
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
viene sostituito con il numero del giorno. victim
viene sostituito con il nome della vittima della scorsa notte ed victim_role
è uno dei seguenti:
a villager
a mafioso
the cop
the doctor
cop_target
è il nome del giocatore su cui il poliziotto ha indagato ieri sera ed target_alignment
è village
o mafia
. Infine, remaining_players
è un elenco di giocatori che sono ancora vivi in questo formato:player1, player2, player3
La seconda riga viene omessa se non è stata uccisa la notte scorsa e la terza riga viene mostrata solo al poliziotto.
Per esempio,
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
Una volta che questo messaggio è finito, la giornata inizia! Ogni bot può compiere 50 azioni durante il giorno, in cui una "azione" sta votando un giocatore o dicendo qualcosa ad alta voce.
Per votare un giocatore, scrivi vote player_name
sul tuo to_server
file e termina. Per votare per non uccidere nessuno, scrivi vote no one
. Quando voti, vedranno tutti i giocatori (incluso te) your_bot votes to kill your_selection
. I voti vengono ignorati il giorno 0.
Un numero di messaggi predefiniti può essere inviato a tutti i giocatori. L'ID di ogni possibile messaggio è elencato qui:
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?
Tutti questi messaggi, tranne i primi cinque, si riferiscono a un giocatore specifico. Per dire uno di quei messaggi, scrivi say message_id player_name
. Per uno dei primi cinque messaggi, basta scrivere say message_id
. Puoi aggiungere un terzo argomento opzionale a entrambi, specificando il nome di un giocatore con cui stai parlando (tutti i giocatori possono ancora leggerlo, ma sapranno chi è il destinatario previsto).
Quando il tuo bot dice un messaggio, tutti i giocatori leggono your_bot says "message"
, dov'è message
il messaggio associato con l'id che hai scritto. Se il messaggio include un oggetto, uno spazio e l'oggetto vengono inseriti direttamente dopo la fine del messaggio. Se include un destinatario, il loro nome, i due punti e uno spazio sono inseriti immediatamente prima del messaggio.
Alla fine della giornata, tutti i giocatori viventi vengono lanciati un'ultima volta per vedere il risultato del voto. Se un giocatore è stato eliminato, questo è scritto:
The town has killed player_name!
They were a villager
... o a mafioso
, o the cop
, o the doctor
.
Se nessun giocatore è stato eliminato, viene invece scritto:
The town opted to lynch no one today.
Quando il controller invia questi messaggi, ignora qualsiasi risposta dei giocatori. La giornata è finita
Notte
Di notte, tutti tranne gli abitanti del villaggio usano il loro potere.
Mafia:
Leggerai It is night. Vote for a victim.
. Quando ciò accade, genera il nome del giocatore che desideri uccidere.
Poliziotto:
Leggerai It is night. Who would you like to investigate?
. Quando ciò accade, emetti il nome del giocatore che desideri controllare.
Medico:
Leggerai It is night. Who would you like to save?
. Quando ciò accade, genera il nome del giocatore che desideri proteggere.
Dopo questo, il giorno successivo inizia normalmente.
Puoi salvarti solo una volta per partita.
Informazione generale
- Il gioco non funzionerà senza 6 o più giocatori.
- Un terzo dei giocatori, arrotondato per difetto, sarà mafioso. Un giocatore sarà un medico e un giocatore sarà un poliziotto. Tutti gli altri giocatori sono abitanti del villaggio.
- I legami nel voto del villaggio o nel voto durante la notte della mafia vengono risolti casualmente.
- I nomi dei bot devono essere alfanumerici + trattini e trattini bassi.
- È vietato utilizzare direttamente la conoscenza del codice dell'avversario. In teoria, dovrei essere in grado di mettere il tuo bot contro i robot che non hai mai visto prima e farlo comparare.
- Purtroppo, se non riesco a far funzionare il tuo programma utilizzando esclusivamente software gratuito (come nella birra), dovrò squalificarlo.
- Mi riservo il diritto di squalificare qualsiasi invio se ritengo che sia dannoso. Ciò include, ma non si limita all'utilizzo eccessivo di tempo, memoria o spazio per l'esecuzione. Ho lasciato intenzionalmente il limite, ma ricorda: sto eseguendo questo sul mio computer di casa, non un supercomputer, e non voglio ottenere risultati che impiegheranno un anno. Non mi aspetto di doverlo usare, poiché i miei standard sono piuttosto bassi. Questo è fondamentalmente "se penso che tu sia un coglione apposta", e se puoi convincermi altrimenti invertirò la mia decisione.
punteggio
Ad ogni round, verranno lanciati 100 giochi (questo può aumentare quando più bot si uniscono per mantenere la dimensione del campione abbastanza grande, ma in teoria ciò non influirà su nulla). Annuncerò quante volte ogni bot vince come villico rispetto a quante volte gioca come villico e lo stesso per la mafia. Un bot villager_ratio
è number of games won as villager / number of games played as villager
ed mafia_ratio
è lo stesso ma s/villager/mafia/g
. Il punteggio di un bot è (villager_ratio - mean villager_ratio) + (mafia_ratio - mean mafia_ratio)
.
Esempio di bot
Randy the Robot non è un buon giocatore di mafia. Randy ignora praticamente tutto, scegliendo a caso cosa dire, chi votare e chi prendere di mira con poteri notturni.
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
controllore
@undergroundmonorail ha scritto un programma di controllo per questa sfida, disponibile qui .
Hai un mese per programmare e consegnare le risposte, darò al bot vincente (il più alto tasso di vincita è il voto) almeno un premio di 50 reputazione (a seconda di quanto rappresentante posso guadagnare in un mese)
Ecco uno script wrapper, creato da @Blacksilver, da usare con i linguaggi compilati:
#!/bin/bash
run="./a.out"
compile="gcc bot.c"
if [ -e $run ]; then
$run
else
$compile
$run
fi
Metti questo run
.
Questo post è stato scritto da @undergroundmonorail (ho apportato alcune modifiche).
Lo ha lasciato qui a chiunque volesse finire e pubblicarlo.