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.
la source
Réponses:
zoulou
run
Pas tout ce que j'espérais. Je peux finir par le peaufiner de temps en temps.
Comment ça marche v1.0
Garde le numéro du jour, qui est en vie, qui est mort, qui est mafieux, qui est aligné avec le village, les rôles, les votes / messages du jour en cours et les votes / messages globaux.
Nuit
une. Mafia - Votez pour tout villageois qui a voté contre la mafia (au hasard) si possible, sinon un villageois au hasard.
b. Cop - Enquêter sur toute personne d'alignement inconnu.
c. Docteur - Sauvez le premier tour, puis sauvez le flic s'il est connu (je ne pense pas qu'il puisse le savoir à ce jour), sauvez le villageois s'il est connu (probablement ne le sait pas non plus), sinon sauvez une personne au hasard.
journée
une. Si quelqu'un a parlé directement à un message, répondez-y (réponses limitées possibles).
b. Mafia - Votez pour le villageois qui a le plus de votes.
c. Villageois avec une personne connue alignée sur la mafia vivante - votez pour mafioso.
ré. Villageois dont la seule morte est connue - votez pour un robot aléatoire qui n'a jamais voté pour le mafieux.
e. Villageois avec flic connu - votez pour un bot aléatoire pour lequel le flic a voté.
F. Villageois avec des morts alignés sur des villages connus - votez pour un bot aléatoire qui a voté pour les morts.
g. Villageois avec voix contre - vote pour le plus haut bot actuellement aligné, non voté.
la source
L'exemple de code ne fonctionnant pas pour moi, j'utilise Python 3 et j'ai donc modifié le
main.py
fichier pour le faire fonctionner.Voici donc ma version corrigée pour Python 3, je n’avais jamais programmé en Python, alors c’est peut-être un code horrible mais ça marche :)
run.sh
:randy.py
:Quelques choses que j'ai apprises en faisant ce travail (et ce n'était pas clair pour moi dans la description)
print
ne fait rien avec le jeu c'est comme unconsole.log
jsinput()
bloque le programme en cours d'exécution, il peut être bon pour le débogage étape par étapefrom_server
etto_server
est effacé à chaque tour.Ctrl+C
combinaison, ce qui est ennuyeux.la source
run.sh
.< from_server > to_server
soit nécessaire car j'ai codé en dur les noms de fichiers dans le code. le moteur de jeu appelle simplement./run
sans tuyaux. doncinput()
etprint()
ne fonctionne pas avec le jeu.mayn.py
ligne 57:os.system('./run')
randy.py
été écrit en Python 2 , ce qui a causé les problèmes../start
le dossier d'origine ou vous avez besoin d'une version python 3 dumain.py
Le logicien
Fantaisie, longue bande de code python que je ne vais pas expliquer (bien que ce ne soit pas joué au golf), à part le fait qu'il conserve des listes "d'amis" et d '"ennemis" qui sont initialement peuplés sur la base d'une enquête du hasard et / ou du flic. . Attention: ne mentez pas en présence du logicien.
la source
run.sh
standard (faire des tests)Survivaliste (v 1.0)
Synopsis
Le survivant survit simplement brutalement au jeu en réprimandant tous ceux qui osent l’accuser, qu’il soit mafieux ou non.
Logique
Si vous survivez jusqu'à la fin du jeu, vous gagnez quoi qu'il arrive. Par conséquent, vous survivez à tout prix.
Histoire
Les troupes ont marché à travers la forêt sombre et humide.
"Lieutenant, où marchons-nous?" La jeune recrue ne s’est apparemment pas endurcie aux atrocités, pensa le commandant. Tant pis. Il répondit par un brusque "pour détruire l'ennemi".
Au village, le commandant ennemi buvait et riait avec les autres officiers du club lorsqu'un éclaireur se précipita pour annoncer la nouvelle. "Il y a une colonne de plusieurs centaines de mètres qui défile pour nous dans la forêt de Yulin! Rassemblez les troupes!"
Le commandant de l'ennemi, manifestement en état d'ébriété, dit de façon inattendue: "Je n'ai reçu aucun rapport d'autres éclaireurs." L'éclaireur (futur survivant) pensa, alors je devrai rassembler les troupes moi-même . Après avoir raconté l’histoire aux autres éclaireurs, ils sont revenus ensemble en disant qu’ils avaient vu des troupes ennemies. Le commandant n'a toujours pas cru en disant: "Je vous ordonne de cesser le dépistage. Il n'y a pas de troupes ennemies".
Les éclaireurs ont décidé de prendre leurs armes pour sauver la communauté. Ils ont réussi à atteindre leurs positions au moment où l'ennemi est arrivé en force dans le village. "CHARGE!" cria le commandant de l'embuscade. "Brûlez les maisons! Brûlez les maisons! Tuez tout le monde, y compris les femmes et les enfants! "
Les éclaireurs ont sauvé toute leur armée. Ils attendaient des promotions, des récompenses et des médailles. Au lieu de cela, ils ont obtenu une cour martiale truquée pour mutinerie, condamnation, 10 ans de prison, destitution déshonorante de l'armée et exil.
Il y a un ancien âgé au conseil municipal de Salem, dans le Massachusetts. La légende raconte qu'il a fondé la ville. Lorsque vous le rencontrez dans son chalet isolé dans la forêt, ne laissez pas le scintillement de ses yeux vous faire croire qu'il est en paix. Si vous l'accusez, il vous perdra devant la ville.
Vétéran
Code (je suis un débutant en python, je ne sais pas si le code est bon)
la source
or
au lieu de||
? L'avez-vous testé? En outre, vous devriez probablement indiquer qu'il s'agit de Python 2.Avatar
Avatar "aléatoirement" choisit un joueur au début et le concentre sans relâche pour le reste du tour.
Ce n'est pas une référence à une émission de télévision animée portant le même nom.
Télécharger le tar de tous les fichiers requis
Changelog
stdout
, seulement àstderr
.Pour supprimer
stderr
aussi, ajoutez2>/dev/null
à la fin durun
fichier.Cela nécessite
mafia.c
etmafia.h
, bibliothèques que j'ai écrites, dans le même répertoire.Ceux-ci sont inclus dans le téléchargement, avec un Makefile et un script d'exécution.
FAIRE
Pendant que je suis ici, je vais soumettre le non-bot, Steve:
la source
avatar
,erebus
,leviathan
etragnarok
from_server
fichier de mon bot n'est pas en cours d'écriture. Avez-vous eu à définir des autorisations spécifiques ou quelque chose?Léviathan
Leviathan parcourt tous les lecteurs du
players
fichier et les cible un par un.Télécharger
Comme avec Avatar, il nécessite
mafia.c
etmafia.h
dans le même répertoire.Ceux-ci sont inclus dans le téléchargement, avec un Makefile et un script d'exécution.
la source