Mafia (également connu sous le nom de loup-garou) est un jeu de société qui se joue à peu près comme ceci:
- Le jeu commence le jour 0. Après chaque jour
n
vient une nuitn
. Après chaque nuitn
vient un journ+1
. c'est à direD0, N0, D1, N1, D2, N2
... - À l'aube du jour 0, un hôte choisit secrètement des joueurs pour remplir certains rôles:
- Un certain nombre de joueurs deviennent la mafia. Chaque nuit, chaque mafieux choisit un joueur. À l'aube du lendemain, le joueur choisi par le plus grand nombre de mafieux est tué. Ils sont définitivement retirés du jeu et leur rôle est révélé publiquement. Mafia-aligné.
- Un certain nombre de joueurs deviennent des flics. Chaque soir, chaque flic choisit un joueur. À l'aube du lendemain, le policier prend conscience de l'alignement de ses joueurs. Aligné au village.
- Un certain nombre de joueurs deviennent des médecins. Chaque nuit, chaque médecin choisit un joueur. Si ce joueur est le même joueur que la mafia a choisi de tuer, les actions de la mafia pour cette nuit sont annulées. Aligné au village.
- Tous les joueurs qui ne sont pas choisis pour un autre rôle sont des villageois. Les villageois n'ont aucune capacité qui ne soit partagée par toute la ville. Aligné au village.
- Tous les jours sauf le jour 0, toute la ville (c'est-à-dire tous les joueurs vivants) vote pour un joueur. À la fin de la journée, ce joueur est retiré du jeu et son rôle est révélé. (Au jour 0, tout le monde frissonne jusqu'à la nuit.)
- Si, à un moment quelconque, il ne reste aucun mafieux, le jeu se termine par la victoire de tous les joueurs alignés au village (y compris les morts).
- Si, à un moment quelconque, les joueurs alignés au village ne sont pas plus nombreux que les joueurs alignés à la mafia, le jeu se termine par la victoire de tous les joueurs alignés à la mafia (y compris les morts).
Pour ce défi, votre objectif est d'écrire un bot pour battre d'autres robots à la Mafia!
Comment faire un bot de travail
Tout ce que vous avez à me fournir est un fichier appelé run
. Dans la structure de répertoires où se déroulera ce défi, votre bot vivra ici:
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/
Le run
fichier, une fois exécuté, fera en sorte que votre bot fasse son travail. Il est important de noter que ce fichier ne doit nécessiter aucun argument de ligne de commande ou quoi que ce soit. Il sera exécuté exactement comme ./run
. Si vous devez être exécuté différemment, vous devrez contourner le problème en procédant comme suit:
real_bot.py
#!/bin/python2
# code goes here
run
#!/bin/bash
./real_bot.py --flags --or --whatever
Une chose importante à noter est que toutes les entrées que votre bot reçoit seront trouvées dans le fichier from_server
et le programme de contrôle cherchera la sortie de votre bot dans to_server
. J'ai choisi de le faire de cette manière pour que toute langue capable de gérer des fichiers puisse participer. Si votre langue facilite l'utilisation de stdin et de stdout par rapport aux E / S de fichier, vous pouvez écrire un run
fichier qui ressemble à ceci:
#!/bin/bash
./real_bot.py < from_server > to_server
Cela fera en sorte que stdin provienne du from_server
fichier et que stdout ira directement à to_server
.
Votre bot ne fonctionnera pas pendant la durée de la partie. Au lieu de cela, il sera exécuté lorsqu'il devra prendre une décision. De même, il ne sera pas informé quand il sera mort, il ne sera plus exécuté. Planifiez cela en enregistrant tout ce que vous voulez rappeler dans un fichier et en le lisant plus tard. Vous pouvez créer, écrire ou lire à partir de n’importe quel fichier du dossier de votre bot, mais vous ne pouvez pas écrire ou lire ailleurs que dans ce dossier, y compris un accès réseau ou autre . Si votre bot sait quoi que ce soit qui ne l'a pas été dit à l'intérieur du dossier, ou s'il touche tout ce qui ne se trouve pas à l'intérieur de ce dossier, votre bot est disqualifié.
Comment faire un bot fonctionnel
journée
Au début du jeu, le fichier players
sera rempli avec une liste délimitée par des lignes et contenant tous les joueurs du jeu. Il ne sera pas mis à jour lorsque les joueurs quitteront la partie.
À l'aube du jour 0, tous les joueurs trouveront ce message dans leur from_server
dossier:
Rise and shine! Today is day 0.
No voting will occur today.
Be warned: Tonight the mafia will strike.
Si vous êtes le flic, la ligne You are the cop
est ajoutée à la fin. Le docteur voit You are the doctor
. La mafia voit You are a member of the mafia.\nYour allies are:
une liste de membres de la mafia délimitée par une nouvelle ligne, à l'exclusion du lecteur qui lit le message.
À l'aube de tous les autres jours, ce message apparaîtra:
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
est remplacé par le numéro du jour. victim
est remplacé par le nom de la victime de la nuit dernière et victim_role
fait partie de:
a villager
a mafioso
the cop
the doctor
cop_target
est le nom du joueur sur lequel le flic a enquêté la nuit dernière, et target_alignment
est l'un village
ou l' autre mafia
. Enfin, remaining_players
est une liste de joueurs qui sont encore en vie dans ce format:player1, player2, player3
La deuxième ligne est omise s'il n'y a pas eu de tueries hier soir, et la troisième ligne n'est montrée qu'au flic.
Par exemple,
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
Une fois que ce message est passé, la journée commence! Chaque bot peut effectuer 50 actions tout au long de la journée, lorsqu'une "action" consiste à voter pour un joueur ou à dire quelque chose à haute voix.
Pour voter pour un joueur, écrivez vote player_name
dans votre to_server
fichier et terminez. Pour voter pour ne tuer personne, écrivez vote no one
. Lorsque vous voterez, tous les joueurs (y compris vous) verront your_bot votes to kill your_selection
. Les votes sont ignorés au jour 0.
Un certain nombre de messages prédéfinis peuvent être envoyés à tous les joueurs. L'identifiant de chaque message possible est répertorié ici:
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?
Tous ces messages, à l’exception des cinq premiers, font référence à un joueur spécifique. Pour dire un de ces messages, écrivez say message_id player_name
. Pour l’un des cinq premiers messages, écrivez simplement say message_id
. Vous pouvez ajouter un troisième argument facultatif aux deux, en spécifiant le nom du joueur avec lequel vous parlez (tous les joueurs peuvent toujours le lire, mais ils sauront qui est le destinataire souhaité).
Lorsque votre bot dit un message, tous les joueurs lisent your_bot says "message"
, où se message
trouve le message associé à l'identifiant que vous avez écrit. Si le message comprend un objet, un espace et l'objet sont insérés directement après la fin du message. S'il comprend un destinataire, son nom, un caractère deux-points et un espace sont insérés immédiatement avant le message.
À la fin de la journée, tous les joueurs en vie sont exécutés une dernière fois pour voir le résultat du vote. Si un joueur a été éliminé, ceci est écrit:
The town has killed player_name!
They were a villager
... ou a mafioso
, ou the cop
, ou the doctor
.
Si aucun joueur n'a été éliminé, ceci est écrit à la place:
The town opted to lynch no one today.
Lorsque le contrôleur envoie ces messages, il ignore toutes les réponses des joueurs. La journée est finie.
Nuit
La nuit, tout le monde sauf les villageois utilise son pouvoir.
Mafia:
Vous lirez It is night. Vote for a victim.
. Lorsque cela se produit, indiquez le nom du joueur que vous souhaitez tuer.
Flic:
Vous lirez It is night. Who would you like to investigate?
. Lorsque cela se produit, indiquez le nom du lecteur que vous souhaitez vérifier.
Médecin:
Vous lirez It is night. Who would you like to save?
. Lorsque cela se produit, indiquez le nom du lecteur que vous souhaitez protéger.
Après cela, le jour suivant commence normalement.
Vous ne pouvez vous sauver qu'une fois par match.
Informations générales
- Le jeu ne fonctionnera pas sans 6 joueurs ou plus.
- Un tiers des joueurs, arrondis à la baisse, seront des mafieux. Un joueur sera un médecin et un joueur sera un flic. Tous les autres joueurs sont des villageois.
- Les liens dans le vote du village ou le vote de la mafia au jour le jour sont réglés au hasard.
- Les noms de bot doivent être alphanumériques + tirets et traits de soulignement.
- Il est interdit d'utiliser directement la connaissance du code de l'adversaire. En théorie, je devrais être capable de mettre votre bot contre des bots que vous n'avez jamais vus et de le faire fonctionner de manière comparable.
- Malheureusement, si je ne parviens pas à faire fonctionner votre programme avec un logiciel exclusivement gratuit (comme dans Beer), je devrai le disqualifier.
- Je me réserve le droit de disqualifier toute soumission si je la considère comme malveillante. Cela inclut, sans toutefois s'y limiter, l'utilisation excessive de temps, de mémoire ou d'espace pour s'exécuter. J'ai volontairement laissé la limite souple, mais rappelez-vous: j'utilise ce logiciel sur mon ordinateur personnel, pas sur un superordinateur, et je ne veux pas que les résultats prennent un an. Je ne m'attends pas à devoir utiliser ceci, car mes normes sont assez basses. Ceci est fondamentalement "si je pense que vous êtes une bite à dessein", et si vous pouvez me convaincre du contraire, je reviendrai sur ma décision.
Notation
À chaque tour, 100 parties seront jouées (ceci peut augmenter si davantage de bots se joignent pour que l'échantillon soit suffisamment grand, mais en théorie cela n'affectera rien). Je vais enregistrer le nombre de fois où chaque bot gagne en tant que villageois par rapport au nombre de fois où il joue en tant que villageois, et le même pour la mafia. Un bot villager_ratio
est number of games won as villager / number of games played as villager
, et mafia_ratio
est le même mais s/villager/mafia/g
. Le score d'un bot est (villager_ratio - mean villager_ratio) + (mafia_ratio - mean mafia_ratio)
.
Exemple bot
Randy the Robot n'est pas un bon joueur de la mafia. Randy ignore pratiquement tout, choisissant au hasard quoi dire, pour qui voter et pour qui cibler avec des pouvoirs nocturnes.
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
Manette
@undergroundmonorail a écrit un programme de contrôle pour ce défi, disponible ici .
Vous avez un mois pour coder et donner des réponses, je donnerai au bot gagnant (le nombre de votes ayant le plus fort taux de victoire) au moins 50 primes de réputation (en fonction du nombre de représentants que je peux gagner en un mois)
Voici un script de wrapper, créé par @Blacksilver, à utiliser avec les langages compilés:
#!/bin/bash
run="./a.out"
compile="gcc bot.c"
if [ -e $run ]; then
$run
else
$compile
$run
fi
Mettez ceci dans run
.
Cet article a été écrit par @undergroundmonorail (j'ai apporté quelques modifications).
Il l'a donné ici à quiconque voulait finir et l'afficher.