Lass uns Mafia spielen!

42

Mafia (auch bekannt als Werewolf) ist ein Partyspiel, das ungefähr so ​​spielt:

  • Das Spiel beginnt am Tag 0. Nach jedem Tag nkommt eine Nacht n. Nach jeder Nacht nkommt ein Tag n+1. dh D0, N0, D1, N1, D2, N2...
  • Zu Beginn von Tag 0 wählt ein Host heimlich Spieler aus, die bestimmte Rollen ausfüllen sollen:  
    • Einige Spieler werden zur Mafia. Jede Nacht wählt jeder Mafioso einen Spieler. Zu Beginn des nächsten Tages wird der Spieler getötet, der von den meisten Mafiosos ausgewählt wurde. Sie werden dauerhaft aus dem Spiel entfernt und ihre Rolle wird öffentlich bekannt gegeben. Mafia ausgerichtet.  
    • Einige Spieler werden Polizisten. Jede Nacht wählt jeder Polizist einen Spieler. Zu Beginn des nächsten Tages wird der Cop auf die Ausrichtung des Spielers aufmerksam. Dorforientiert.  
    • Einige Spieler werden zu Ärzten. Jede Nacht wählt jeder Arzt einen Spieler. Wenn dieser Spieler derselbe ist, den die Mafia getötet hat, werden die Aktionen der Mafia für diese Nacht abgebrochen. Dorforientiert.  
    • Alle Spieler, die nicht für eine andere Rolle ausgewählt wurden, sind Dorfbewohner. Dorfbewohner haben keine Fähigkeiten, die nicht von der ganzen Stadt geteilt werden. Dorforientiert.
  • Jeden Tag außer Tag 0 wählt die gesamte Stadt (dh alle lebenden Spieler) einen Spieler. Am Ende des Tages wird dieser Spieler aus dem Spiel entfernt und seine Rolle wird aufgedeckt. (Am Tag 0 chillt jeder bis zum Einbruch der Dunkelheit.)
  • Wenn zu irgendeinem Zeitpunkt keine Mafiosos mehr übrig sind, endet das Spiel mit einem Sieg aller dörflich ausgerichteten Spieler (einschließlich der Toten).
  • Wenn die Spieler mit Ausrichtung auf das Dorf zu irgendeinem Zeitpunkt nicht mehr als die Spieler mit Ausrichtung auf die Mafia sind, endet das Spiel, wenn alle Spieler mit Ausrichtung auf die Mafia siegreich sind (einschließlich der Toten).

Für diese Herausforderung ist es Ihr Ziel, einen Bot zu schreiben, um andere Bots bei Mafia zu schlagen!

Wie man einen funktionierenden Bot macht

Sie müssen mir nur eine Datei mit dem Namen liefern run. In der Verzeichnisstruktur, in der diese Herausforderung stattfinden wird, lebt Ihr Bot hier:

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/

Die runDatei, wenn sie ausgeführt wird , wird Sie bietet sein Ding. Es ist wichtig zu beachten, dass für diese Datei keine Befehlszeilenargumente oder ähnliches erforderlich sind. Es wird genauso ausgeführt wie ./run. Wenn Sie auf eine andere Weise ausgeführt werden müssen, müssen Sie dies folgendermaßen umgehen:

real_bot.py

#!/bin/python2

# code goes here

run

#!/bin/bash

./real_bot.py --flags --or --whatever

Ein wichtiger Punkt ist, dass alle Eingaben, die Ihr Bot erhält, in der Datei gefunden werden from_serverund das Steuerungsprogramm nach den Ausgaben Ihres Bots sucht to_server. Ich habe mich für diese Methode entschieden, damit jede Sprache, die Datei-E / A ausführen kann, teilnehmen kann. Wenn es in Ihrer Sprache einfacher ist, mit stdin und stdout zu arbeiten als mit Datei-E / A, möchten Sie möglicherweise eine runDatei schreiben , die wie folgt aussieht:

#!/bin/bash

./real_bot.py < from_server > to_server

Das wird es so machen, dass stdin aus der from_serverDatei kommt und stdout direkt zu geht to_server.

Ihr Bot bleibt für die Dauer des Spiels nicht aktiv. Stattdessen wird es ausgeführt, wenn eine Entscheidung getroffen werden muss. Ebenso wird es nicht informiert, wenn es tot ist, es wird einfach nicht mehr ausgeführt. Planen Sie dies, indem Sie alles, woran Sie sich erinnern möchten, in einer Datei speichern und später lesen. Sie können, schreiben oder lesen aus einer beliebigen Datei in Ihrem Bot Ordner erstellen, aber Sie können nicht schreiben oder lesen irgendwo außerhalb des Ordners, einschließlich Netzwerkzugriff oder irgendetwas . Wenn Ihr Bot etwas weiß, was ihm nicht aus dem Ordner mitgeteilt wurde, oder wenn es etwas berührt , das sich nicht in diesem Ordner befindet, wird Ihr Bot disqualifiziert.

Wie man einen funktionierenden Bot macht

Tag

Zu Beginn des Spiels wird die Datei playersmit einer durch Zeilenumbrüche getrennten Liste aller Spieler im Spiel gefüllt. Es wird nicht aktualisiert, wenn Spieler das Spiel verlassen.

Zu Beginn von Tag 0 finden alle Spieler diese Nachricht in ihrer from_serverDatei:

Rise and shine! Today is day 0.
No voting will occur today.
Be warned: Tonight the mafia will strike.

Wenn Sie der Cop sind, wird die Zeile You are the copan das Ende angehängt. Der Arzt sieht You are the doctor. Die Mafia sieht You are a member of the mafia.\nYour allies are:und eine durch Zeilenumbrüche getrennte Liste der Mafia-Mitglieder, mit Ausnahme des Spielers, der die Nachricht liest.

Zu Beginn aller anderen Tage erscheint diese Meldung:

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`

dayNumberwird durch die Nummer des Tages ersetzt. victimwird durch den Namen des Opfers der letzten Nacht ersetzt und victim_roleist einer von:

  • a villager
  • a mafioso
  • the cop
  • the doctor

cop_targetist der Name des Spielers, den der Polizist letzte Nacht untersucht hat, und target_alignmentist entweder villageoder mafia. Schließlich remaining_playersist eine Liste der Spieler, die in diesem Format noch am Leben sind:player1, player2, player3

Die zweite Zeile entfällt, wenn letzte Nacht keine Tötung stattgefunden hat, und die dritte Zeile wird nur dem Polizisten angezeigt.

Zum Beispiel,

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

Sobald diese Nachricht aus dem Weg ist, beginnt der Tag! Jeder Bot kann 50 Aktionen pro Tag ausführen, wobei eine "Aktion" einen Spieler wählt oder etwas lautes sagt.

Um für einen Spieler zu stimmen, schreibe vote player_namein deine to_serverDatei und beende sie. Um abzustimmen, niemanden zu töten, schreiben Sie vote no one. Wenn Sie abstimmen, werden alle Spieler (einschließlich Sie) sehen your_bot votes to kill your_selection. Stimmen werden am Tag 0 ignoriert.

Eine Reihe vordefinierter Nachrichten kann an alle Spieler gesendet werden. Die ID jeder möglichen Nachricht ist hier aufgelistet:

 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?

Alle diese Nachrichten mit Ausnahme der ersten fünf beziehen sich auf einen bestimmten Spieler. Um eine dieser Nachrichten auszusprechen, schreiben Sie say message_id player_name. Schreiben Sie für eine der ersten fünf Nachrichten einfach say message_id. Sie können beiden optional ein drittes Argument hinzufügen und dabei den Namen eines Spielers angeben, mit dem Sie sprechen (alle Spieler können es weiterhin lesen, aber sie wissen, wer der beabsichtigte Empfänger ist).

Wenn Ihr Bot eine Nachricht sagt, lesen alle Spieler your_bot says "message", wo messagesich die Nachricht befindet, die mit der von Ihnen geschriebenen ID verknüpft ist. Wenn die Nachricht einen Betreff enthält, werden ein Leerzeichen und der Betreff direkt nach dem Ende der Nachricht eingefügt. Wenn es einen Empfänger enthält, werden dessen Name, ein Doppelpunkt und ein Leerzeichen unmittelbar vor der Nachricht eingefügt.

Am Ende des Tages laufen alle lebenden Spieler ein letztes Mal, um das Ergebnis der Abstimmung zu sehen. Wenn ein Spieler abgewählt wurde, heißt es:

The town has killed player_name!
They were a villager

... oder a mafioso, oder the cop, oder the doctor.

Wenn kein Spieler abgewählt wurde, heißt es stattdessen:

The town opted to lynch no one today.

Wenn der Controller diese Nachrichten sendet, ignoriert er alle Antworten von Spielern. Der Tag ist vorbei.

Nacht

Nachts können alle außer den Dorfbewohnern ihre Kräfte einsetzen.

Mafia:

Du wirst lesen It is night. Vote for a victim.. Geben Sie in diesem Fall den Namen des Spielers aus, den Sie töten möchten.

Polizist:

Du wirst lesen It is night. Who would you like to investigate?. Geben Sie in diesem Fall den Namen des Players aus, den Sie überprüfen möchten.

Arzt:

Du wirst lesen It is night. Who would you like to save?. Geben Sie in diesem Fall den Namen des Players aus, den Sie schützen möchten.

Danach beginnt der nächste Tag wie gewohnt.

Du darfst dich nur einmal pro Spiel retten.

Allgemeine Information

  • Das Spiel läuft nicht ohne 6 oder mehr Spieler.
  • Ein Drittel der Spieler, abgerundet, wird Mafia sein. Ein Spieler wird ein Arzt sein, und ein Spieler wird ein Polizist. Alle anderen Spieler sind Dorfbewohner.
  • Stimmengleichheit bei der Dorfwahl oder bei der Wahl der Mafia über Nacht wird nach dem Zufallsprinzip geregelt.
  • Bot-Namen müssen alphanumerisch + Bindestriche und Unterstriche sein.
  • Es ist verboten, die Kenntnis des Codes des Gegners direkt zu nutzen. Theoretisch sollte ich in der Lage sein, Ihren Bot gegen Bots auszuspielen, die Sie noch nie gesehen haben, und eine vergleichbare Leistung zu erzielen.
  • Leider muss ich Ihr Programm disqualifizieren, wenn ich Ihr Programm nicht mit ausschließlich kostenloser (wie bei Bier) Software zum Laufen bringen kann.
  • Ich behalte mir das Recht vor, Einsendungen zu disqualifizieren, wenn ich sie für böswillig halte. Dies beinhaltet, ist aber nicht beschränkt auf die Verwendung von zu viel Zeit, Speicher oder Speicherplatz. Ich habe das Limit absichtlich weich gelassen, aber denke daran: Ich starte dies auf meinem Heimcomputer, nicht auf einem Supercomputer, und ich möchte nicht, dass es ein Jahr dauert, bis Ergebnisse erzielt werden. Ich erwarte nicht, dass ich das benutzen muss, da meine Standards ziemlich niedrig sind. Das ist im Grunde genommen "wenn ich denke, dass du absichtlich ein Arschloch bist" und wenn du mich davon überzeugen kannst, dass ich sonst meine Entscheidung rückgängig mache.

Wertung

In jeder Runde werden 100 Spiele ausgetragen (dies kann sich erhöhen, wenn sich mehr Bots anschließen, um die Stichprobengröße groß genug zu halten, theoretisch hat dies jedoch keine Auswirkungen). Ich werde aufzeichnen, wie oft jeder Bot als Dorfbewohner gewinnt, im Vergleich dazu, wie oft er als Dorfbewohner spielt, und dasselbe gilt für die Mafia. Ein Bot villager_ratioist number of games won as villager / number of games played as villager, und mafia_ratioist das gleiche, aber s/villager/mafia/g. Die Punktzahl eines Bots ist (villager_ratio - mean villager_ratio) + (mafia_ratio - mean mafia_ratio).

Beispiel bot

Randy the Robot ist kein guter Mafia-Spieler. Randy ignoriert so ziemlich alles und wählt zufällig aus, was er sagen möchte, wen er wählen möchte und wen er mit Nachtkräften anvisieren möchte.

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

Regler

@undergroundmonorail hat ein Steuerungsprogramm für diese Herausforderung geschrieben, das hier verfügbar ist .

Sie haben einen Monat Zeit, um die Antworten zu codieren und einzureichen. Ich gebe dem siegreichen Bot (bei Stimmen mit der höchsten Gewinnquote handelt es sich um Stimmen) mindestens eine Reputationsprämie von 50 (abhängig davon, wie viel Repräsentanten ich in einem Monat verdienen kann).


Hier ist ein Wrapper-Skript von @Blacksilver zur Verwendung mit kompilierten Sprachen:

#!/bin/bash

run="./a.out"
compile="gcc bot.c"

if [ -e $run ]; then
        $run
else
        $compile
        $run
fi

Setzen Sie dies in run.


Dieser Beitrag wurde von @undergroundmonorail geschrieben (ich habe einige Änderungen vorgenommen).

Er gab es hier an alle weiter, die es fertigstellen und posten wollten.

Christopher
quelle
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Martin Ender

Antworten:

3

Zulu-

run

#!/usr/bin/env php
<?php
error_reporting(E_ERROR|E_WARNING|E_PARSE);

$self = basename(__DIR__);

$msgids = array(
    "No",
    "Yes",
    "I am the cop",
    "I am the doctor",
    "I am a normal villager",
    "I trust this player:",
    "I think this player is suspicious:",
    "I think this player is the cop:",
    "I think this player is the doctor:",
    "I think this player is a normal villager:",
    "I think this player is mafia:",
    "Do you think this player is mafia?",
    "I tried to save this player:",
    "I successfully saved this player:",
    "I investigated this player and found that they were mafia-aligned:",
    "I investigated this player and found that they were village-aligned:",
    "Will you please use your power on this player tonight?"
);
$msgids = array_flip($msgids);

if(!file_exists('./from_server')){
    die;
}
$in = file('from_server');
if(count($in) && strpos($in[0],'day 0.') !== false){
    $game = array(
        'day'               =>0,
        'players'           =>array(),
        'alive'             =>array(),
        'dead'              =>array(),
        'mafia'             =>array(),
        'village'           =>array(),
        'cop'               =>'',
        'doctor'            =>'',
        'votes'             =>array(),
        'messages'          =>array(),
        'currentvotes'      =>array(),
        'currentmessages'   =>array()
    );
    $playersfile = file('players');
    foreach($playersfile as $name){
        $game['players'][trim($name)] = 1;
        $game['alive'][trim($name)] = 1;
        $game['votes'][trim($name)] = array();
        $game['messages'] = array();
    }
    $allies = false;
    foreach($in as $line){
        if($allies){
            if(array_key_exists(trim($line),$game['players'])){
                $game['mafia'][trim($line)] = 1;
            }
        }
        else if(strpos($line,"You are the cop") !== false){
            $game['cop'] = $self;
            $game['village'][$self] = 1;
        }
        else if(strpos($line,"You are the doctor") !== false){
            $game['doctor'] = $self;
            $game['village'][$self] = 1;
        }
        else if(strpos($line,"member of the mafia") !== false){
            $game['mafia'][$self] = 1;
        }
        else if(strpos($line,"allies are:") !== false && $game['mafia'][$self]){
            $allies = true;
        }
    }
    if(!$game['mafia'][$self]){
        $game['village'][$self] = 1;
    }
    else{
        foreach($game['players'] as $name=>$g){
            if(!$game['mafia'][$name]){
                $game['village'][$name] = 1;
            }
        }
    }
    $out = json_encode($game);
    write('myinfo',$out);
}
else{
    $myinfo = file_get_contents('myinfo');
    $game = json_decode($myinfo,true);
    if(count($in) && strpos($in[0],"town has killed") !== false){
        $e = explode(" ",trim($in[0]));
        $dead = trim($e[4],'!');
        unset($game['alive'][$dead]);
        $game['dead'][$dead] = 1;
        $e = explode(" ",trim($in[1]));
        $allegiance = trim($e[3],".");
        $game[$allegiance][$dead] = 1;
    }
    else if(count($in) && strpos($in[0],"town opted to") !== false){
        //
    }
    else if(count($in) && strpos($in[0],"night") !== false){
        if(strpos($in[0],"victim") !== false){
            $voted = false;
            if($game['day'] > 0){
                $possible = array();
                foreach($game['alive'] as $name=>$g){
                    if(!$game['mafia'][$name]){
                        foreach($game['votes'][$name] as $for){
                            if($voted && $game['mafia'][$for]){
                                $possible[] = $name;
                            }
                        }
                    }
                }
                if(count($possible)){
                    shuffle($possible);
                    write('to_server',$possible[0]);
                    $voted = 1;
                }               
            }
            if(!$voted){
                while($rand = array_rand($game['alive'])){
                    if(!$game['mafia'][$rand]){
                        write('to_server',$rand);
                        $voted = 1;
                        break;
                    }
                }
            }
        }
        else if(strpos($in[0],"investigate") !== false){
            $possible = array();
            foreach($game['alive'] as $name=>$g){
                if(!$game['village'][$name] && !$game['mafia'][$name] && $game['doctor'] != $name){
                    $possible[] = $name;
                }
            }
            if(count($possible)){
                shuffle($possible);
                write('to_server',$possible[0]);
            }
        }
        else if(strpos($in[0],"save") !== false){
            if($game['day'] == 0){
                write('to_server',$self);
            }
            else{
                if($game['cop'] != '' && $game['alive'][$game['cop']]){
                    write('to_server',$game['cop']);
                }
                else{
                    $voted = false;
                    foreach($game['alive'] as $name=>$g){
                        if($game['village'][$name] && $name != $self){
                            write('to_server',$name);
                            $voted = true;
                            break;
                        }
                    }
                    if(!$voted){
                        while($rand = array_rand($game['alive'])){
                            if($rand != $self){
                                write('to_server',$rand);
                                break;
                            }
                        }
                    }
                }
            }
        }
    }
    else if(count($in) && strpos($in[0],"Dawn of day") !== false){
        $e = explode(" ",trim($in[0]));
        $game['day'] = trim($e[3],".");
        foreach($in as $line){
            if(strpos($line,"was killed") !== false){
                $e = explode(" ",trim($line));
                $dead = $e[2];
                if(strpos($line,"the cop") !== false){
                    $game['cop'] = $dead;
                    $game['village'][$dead] = 1;
                }
                else if(strpos($line,"the doctor") !== false){
                    $game['doctor'] = $dead;
                    $game['village'][$dead] = 1;
                }
                else if(strpos($line,"a villager") !== false){
                    $game['village'][$dead] = 1;
                }
                else if(strpos($line,"a mafioso") !== false){
                    $game['mafia'][$dead] = 1;
                }
                unset($game['alive'][$dead]);
                $game['dead'][$dead] = 1;
            }
            else if(strpos($line,"Investigations showed") !== false){
                $e = explode(" ",trim($line));
                $name = $e[3];
                $align = trim($e[5]);
                $e = explode("-",$align);
                $game[$e[0]][$name] = 1;
            }
        }
        $game['currentvotes'] = array();
        $game['currentmessages'] = array();
        foreach($game['alive'] as $name=>$g){
            $game['currentvotes'][$name] = '';
        }
    }
    else{
        foreach($in as $line){
            if(strpos($line," has voted to lynch no one") !== false){
                $e = explode(" ",trim($line));
                $game['votes'][$e[0]][] = false;
                $game['currentvotes'][$e[0]] = false;
            }
            else if(strpos($line," has voted to ") !== false){
                $e = explode(" ",trim($line));
                $game['votes'][$e[0]][] = trim($e[5]," .");
                $game['currentvotes'][$e[0]] = trim($e[5]," .");
            }
            else if(strpos($line," says ") !== false){
                foreach($msgids as $msg=>$id){
                    $chk = preg_match('/([^\s]+) says "(([^\s]+)[:,] )?'.preg_quote($msg).'( ([^\s]+))?"/',$line,$matches);
                    if($chk){
                        //                                  said by     said to     said  said about
                        $game['messages'][]         = array($matches[1],$matches[3],$msg, $matches[5]);
                        $game['currentmessages'][]  = array($matches[1],$matches[3],$msg, $matches[5]);
                    }
                }
            }
        }
        $written = false;
        $convo = array();
        foreach($game['currentmessages'] as $msg){
            if($msg[1] == $self){
                $convo[$msg[0]] = $msg;
            }
            else if($msg[0] == $self && $msg[1] != ''){
                unset($convo[$msg[1]]);
            }
        }
        if(count($convo)){
            foreach($convo as $c){
                if($msgids[$c[2]] == 11){
                    if($game['mafia'][$msg[3]]){
                        write('to_server',"say 1 ".$msg[0]);
                        $written = true;
                        break;
                    }
                    else if($game['village'][$msg[3]]){
                        write('to_server',"say 0 ".$msg[0]);
                        $written = true;
                        break;
                    }
                    else{
                        write('to_server',"say 11 ".$msg[0]);
                        $written = true;
                        break;
                    }
                }
                else if($msgids[$c[2]] == 16){
                    write('to_server',"say 0 ".$msg[0]);
                    $written = true;
                }
                else{
                    write('to_server',"say 4 ".$msg[0]);
                    $written = true;
                }
            }
        }
        if(!$written){
            $currentvote = false;
            if(array_key_exists($self,$game['currentvotes'])){
                $currentvote = $game['currentvotes'][$self];
            }
            if($game['mafia'][$self]){
                $votes = @array_count_values($game['currentvotes']);
                if($votes && count($votes)){
                    arsort($votes);
                    foreach($votes as $name=>$number){
                        if($game['village'][$name]){
                            if($currentvote != $name){
                                write('to_server','vote '.$name);
                                $written = true;
                                break;
                            }
                        }
                    }
                }
            }
            else{
                if(count($game['mafia'])){
                    foreach($game['mafia'] as $name=>$g){
                        if($game['alive'][$name]){
                            $written = true;
                            if($currentvote != $name){
                                write('to_server','vote '.$name);
                            }
                            break;
                        }
                    }
                    if(!$written){
                        foreach($game['mafia'] as $name=>$g){
                            $non = $game['alive'];
                            unset($non[$self]);
                            if(array_key_exists($name,$game['votes'])){
                                foreach($game['votes'][$name] as $vote){
                                    if(array_key_exists($vote,$non)){
                                        unset($non[$vote]);
                                    }
                                }
                            }
                            if(count($non)){
                                $rand = array_rand($non);
                                write('to_server','vote '.$rand);
                                $written = true;
                                break;
                            }
                        }
                    }
                }
                if(!$written && $game['cop']){
                    $possible = array();
                    foreach($game['votes'][$game['cop']] as $name){
                        if($game['alive'][$name] && $name != $self){
                            $possible[] = $name;
                        }
                    }
                    if(count($possible)){
                        shuffle($possible);
                        write('to_server','vote '.$possible[0]);
                        $written = true;
                    }
                }
                if(!$written && count($game['dead'])){
                    foreach($game['dead'] as $name=>$g){
                        if($game['village'][$name]){
                            $v = array();
                            foreach($game['votes'] as $voted=>$arr){
                                if($game['alive'][$voted] && in_array($name,$arr)){
                                    $v[$voted] = 1;
                                }
                            }
                            unset($v[$self]);
                            if(count($v)){
                                $rand = array_rand($v);
                                write('to_server','vote '.$rand);
                                $written = true;
                                break;
                            }
                        }
                    }
                }
                if(!$written){
                    $votes = @array_count_values($game['currentvotes']);
                    if($votes && count($votes) && array_key_exists($self,$votes)){
                        arsort($votes);
                        foreach($votes as $name=>$number){
                            if(!$game['village'][$name]){
                                if($name != $self){
                                    write('to_server','vote '.$name);
                                    $written = true;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    $myinfo = json_encode($game);
    write('myinfo',$myinfo);
}

function write($filename,$data){
    $fh = fopen($filename,"wb+");
    if($fh){
        $bytes = fwrite($fh,$data);
        fclose($fh);
    }
}

Nicht alles, was ich mir erhofft hatte. Ich kann es gelegentlich zwicken enden.

Wie es funktioniert v1.0

Verfolgt die Tagesnummer, wer lebt, wer ist tot, wer ist Mafia, wer ist dörflich ausgerichtet, Rollen, Stimmen / Nachrichten des aktuellen Tages und allgemeine Stimmen / Nachrichten.

  1. Nacht

    ein. Mafia - Stimmen Sie für jeden Dorfbewohner ab, der (zufällig) gegen die Mafia gestimmt hat, andernfalls für einen zufälligen Dorfbewohner.

    b. Cop - Untersuchen Sie jeden, dessen Ausrichtung unbekannt ist.

    c. Doktor - Sparen Sie sich zuerst, und speichern Sie dann den Polizisten, falls bekannt (ich glaube nicht, dass er dies jemals wissen kann).

  2. Tag

    ein. Wenn jemand eine Nachricht direkt an sich selbst gerichtet hat, antworten Sie ihm (begrenzte Antworten möglich).

    b. Mafia - Wähle den Dorfbewohner mit den meisten Stimmen.

    c. Dorfbewohner mit einem lebendigen Mafia-Bündnis bekannt - stimme für Mafioso.

    d. Dorfbewohner mit nur toter Mafia bekannt - stimmen Sie für einen zufälligen Bot, der noch nie für das Mafioso gestimmt hat.

    e. Dorfbewohner mit Cop bekannt - stimmen Sie für einen zufälligen Bot, für den der Cop gestimmt hat.

    f. Dorfbewohner mit Toten Dorfbewohner bekannt - stimmen Sie für einen zufälligen Bot, der für die Toten gestimmt hat.

    G. Dorfbewohner mit Gegenstimmen - Stimme für den derzeit höchsten nicht dörflich ausgerichteten Bot ab.

Jo.
quelle
1
Warten Sie, was macht das?
SIGSTACKFAULT
1
Na, es spielt natürlich Mafia! :)
Jo.
Ich meine die Strategie.
SIGSTACKFAULT
6

Der Beispielcode hat bei mir nicht funktioniert, ich benutze Python 3, also habe ich die main.pyDatei geändert , damit es funktioniert.

Also hier ist meine feste Version für Python 3, ich habe noch nie zuvor in Python programmiert, also ist es vielleicht ein schrecklicher Code, aber es funktioniert :)

run.sh:

#!/bin/bash

./randy.py < from_server > to_server

randy.py:

#!/usr/bin/env python3

import random

with open('players') as f:
    p = f.read().split() + ['no one']

with open('from_server') as f:
    fs = f.read().split()

msg = ""
day = True
try:
    line = fs[0]
    if line.endswith(('?', 'victim.')):
        day = False
    if not day:
        msg = (random.choice(p))
    else:
        if random.random() > 0.5:
            if random.random() > 0.5:
                msg = ('vote {}'.format(random.choice(p)))
            else:
                id = random.randint(0, 17)
                msg = ('say {}{}'.format(id, (' ' + random.choice(p)) if id > 4 else ''))

    with open('to_server', 'w') as f:
        f.write(msg)
    print(msg)
except: pass

Ein paar Dinge, die ich gelernt habe, während ich diese Arbeit gemacht habe (und es war mir in der Beschreibung nicht klar)

  • printtut nichts mit dem Spiel, es ist wie ein console.login js
  • input() blockiert das Programm läuft es kann gut für das schrittweise Debuggen sein
  • from_serverund to_serverwird jede Runde gelöscht.
  • Es ist unmöglich, das Skript mit einer Ctrl+CKombination zu stoppen , was ärgerlich ist.
Peter
quelle
Willkommen bei PPCG! Toller erster Beitrag! Hoffe du bleibst dabei! Ich habe Ihren Beitrag bearbeitet, um eine funktionierende Syntaxhervorhebung zu erhalten, und der Konsistenz halber a run.sh.
Freitag,
1
Danke! Ich bin mir nicht sicher, ob < from_server > to_serverdas notwendig ist, da ich Dateinamen im Code fest codiert habe. Die Game Engine ruft einfach ./runohne Pipes auf. so input()und print()funktionierte nicht mit dem spiel. mayn.pyZeile 57:os.system('./run')
Peter
2
Wie haben Sie den Controller zum Laufen gebracht? Ich kann es nicht herausfinden. Können Sie einen Beispielaufruf bereitstellen?
22.
Hinweis: Das Original randy.pywurde in Python 2 geschrieben , was die Probleme verursachte.
SIGSTACKFAULT
für controller musst du ./startaus dem original ordner oder du brauchst eine python 3 version vonmain.py
Peter
5

Der Logiker

#!/usr/bin/env python3
import sys
import os
import re
import random
from types import SimpleNamespace
def chooseSet(set):
    return random.choice(list(set))
sys.stdin = open("from_server")
sys.stdout = open("to_server","w")
def saveData(data):
    with open("gameData.txt", "w") as datafile:
        datafile.write(repr(data.__dict__))
MY_NAME = os.path.basename(os.getcwd())
opener = input()
DATABASES = ("targets","herd","mafiosos","guilty","innocent","unlikely", "requests",
            "selfvotes","players","used_roles")
ALLOW_SELF = ("players", "mafiosos")
LIESPERROLE = {"cop": ("I am the cop",
                "I investigated this player and found that they were mafia-aligned",
                "I investigated this player and found that they were village-aligned"),
              "doctor": ("I am the doctor",
                   "I tried to save this player",
                   "I successfully saved this player"
                   )
        }
#1: At the beginning of the game, parse beginning of day 0
if opener == "Rise and shine! Today is day 0.":
    #Next two lines are completely predetermined and hold no data
    assert input() == "No voting will occur today."
    assert input() == "Be warned: Tonight the mafia will strike."
    data = SimpleNamespace(cop=False, doctor=False, queued=[],askers={})
    for datum in DATABASES:
        setattr(data, datum, set())
    try:
        nextline = input()
        if nextline == "You are a member of the mafia.":
            data.mafiosos.add(MY_NAME)
            assert input() == "Your allies are:"
            while True:
                data.mafiosos.add(input())
        elif nextline == "You are the doctor":
            data.doctor = True
            data.used_roles.add("doctor")
        elif nextline == "You are the cop":
            data.cop = True
            data.used_roles.add("cop")
    except EOFError:
        #villager, or ran out of mafiosos to add
        pass
    with open("players") as playersfile:
        data.players = set(playersfile.read().strip().splitlines())
    saveData(data)
    exit()
with open("gameData.txt") as datafile:
    data = SimpleNamespace(**eval(datafile.read().strip()))
#2: Beginning of day nonzero
if opener.startswith("Dawn of day"):
    data.requests.clear()
    data.selfvotes.clear()
    data.askers.clear()
    data.voted = False
    try:
        while True:
            nextline = input()
            victim = re.match("Last night, (.*) was killed. They were (?:a|the) (.*).", nextline)
            if victim:
                victim, role = victim.groups()
                #remove dead people from lists
                for datum in DATABASES:
                    getattr(data, datum).discard(victim)
                if role == "cop" or role == "doctor":
                    data.used_roles.add(role)
                continue
            investigated = re.match("Investigations showed that (.*) is (.*)-aligned.", nextline)
            if investigated:
                assert data.cop
                who = investigated.group(1)
                if investigated.group(2) == "mafia":
                    data.guilty.add(who)
                    data.unlikely.discard(who)
                else:
                    data.targets.discard(who)
                    data.herd.discard(who)
                    data.innocent.add(who)
                    data.unlikely.add(who)
                continue
    except EOFError:
        pass
#3: We're being told some messages / news
elif " says " in opener or " voted " in opener:
    message = opener
    acted = question = False
    try:
        while True:
            if " voted " in message:
                message = "<vote against>"
                speaker, subject = re.match("(.*) has voted to lynch (.*)", message).groups()
                target = None
            else:
                speaker, target, message, subject = \
                    re.match("(.*) says \"(?:(.*), )?([^:\?]+)(?:[:\?]\s*(.*))?\"",
                             message).groups()
            if speaker == MY_NAME:
                continue
            BAD_MESSAGES = ("<vote against>", "I think this player is mafia",
                            "I investigated this player and found that they were mafia-aligned",
                            "I think this player is suspicious")
            GOOD_MESSAGES = ("I think this player is the cop",
                             "I think this player is the doctor",
                             "I think this player is a normal villager",
                             "I trust this player",
                             "I investigated this player and found that they were village-aligned")
            OUTS = "I am the cop", "I am the doctor"
            LIES = ()
            for role in data.used_roles:
                LIES += LIESPERROLE[role]
            if message == "Yes" or message == "No":
                if question and not target:
                    target = chooseSet(data.askers)
                if target in data.askers:
                    BAD_MESSAGES += "Yes",
                    GOOD_MESSAGES += "No",
                    subject = data.askers[target]
            if message in LIES and speaker not in data.mafiosos and speaker not in data.innocent:
                # What you just said is false, and I know it!
                data.unlikely.discard(speaker)
                data.targets.add(speaker)
                if subject and subject not in (data.unlikely.union(data.mafiosos)):
                    data.targets.add(subject)
            elif message in BAD_MESSAGES:
                if speaker in data.guilty:
                    #mafiosos rarely turn on eachother
                    data.unlikely.add(subject)
                    data.targets.discard(subject)
                elif speaker in data.unlikely:
                    #believe the herd, especially people who we trust
                    data.herd.add(subject)
                elif subject in data.unlikely:
                    #how dare you speak against players likely to be village-aligned!
                    data.targets.add(speaker)
                elif subject == MY_NAME or subject in data.mafiosos:
                    #DON'T ATTACK ME (or my fellow mafiosos)
                    data.targets.add(speaker)
                else:
                    #believe the herd
                    data.herd.add(subject)
                if not acted and message == "<vote against>":
                    if subject == MY_NAME:
                        data.selfvotes.add(speaker)
                        if len(data.selfvotes) >= (len(data.players)-len(data.mafiosos))/3:
                            if data.cop:
                                print("say 2")
                                #give a data point to prove it
                                if random.random() > .5 and data.guilty:
                                    data.queued.append("say 14 %s" % chooseSet(data.guilty))
                                elif data.innocent:
                                    data.queued.append("say 15 %s" % chooseSet(data.innocent))
                            else:
                                print("say 4") #Don't out myself if I'm the doctor
                                # and just lie if I'm a mafioso
                            acted = True
                    else:
                        data.selfvotes.discard(speaker)
            elif message in OUTS and data.mafiosos and speaker not in data.unlikely:
                data.targets.add(speaker) #Kill the fools who boast!
            elif message in GOOD_MESSAGES:
                chance = random.random() < .1 - (speaker in data.targets) / 20
                if speaker in data.guilty: #Mafia liars
                    if subject not in data.unlikely:
                        data.targets.add(subject)
                elif subject == MY_NAME and chance:
                    if speaker in data.targets:data.targets.remove(speaker)
                    data.unlikely.add(speaker)
                elif speaker in data.unlikely or chance:
                    data.unlikely.add(subject)
            elif message == "Do you think this player is mafia":
                if subject == MY_NAME:
                    data.targets.append(speaker)
                if target == MY_NAME or not target:
                    if speaker in data.guilty:
                        data.queued.append("say 14 %s %s" % (subject, speaker))
                    elif speaker in data.innocent:
                        data.queued.append("say 15 %s %s" % (subject, speaker))
                    elif subject in data.targets or subject in data.herd:
                        data.queued.append("say 1 %s" % (speaker))
                    elif subject in data.unlikely:
                        data.queued.append("say 0 %s" % (speaker))
                    if data.cop:
                        data.requests.add(subject)
                data.askers[speaker] = subject
                question = True
            elif target == MY_NAME and message == "Will you please use your power on this player tonight":
                data.requests.add(subject)
            message = input()
    except EOFError:
        pass
    for datum in DATABASES:
        if datum in ALLOW_SELF: continue
        getattr(data, datum).discard(MY_NAME)
    chance = random.random()
    if data.queued:
        print(data.queued.pop())
    elif chance < .1:
        target = chooseSet(data.targets or data.players)
        if target != MY_NAME:
            print("say 10 %s" % target)
            data.askers[MY_NAME] = target
    elif chance < .3 and data.targets:
        print("say 6 %s" % chooseSet(data.guilty or data.targets))
    elif chance < .5 and data.unlikely:
        print("say 5 %s" % chooseSet(data.innocent or data.unlikely))
    elif chance < .6 and not data.voted:
        target = chooseSet(data.guilty or data.targets or data.herd or data.players)
        if target not in data.mafiosos and target != MY_NAME:
            print("vote %s" % target)
        data.voted = True
    elif chance < .8:
        #do nothing
        pass
    elif chance < .9:
        #Confuse everybody
        print("say 1")
        data.queued.append("say 0")
######################
#4: End of day
elif "has killed" in opener:
    victim = re.match("The town has killed (.*)!", opener)
    if not victim:
        exit()
    victim = victim.group(1)
    #remove dead people from lists
    for datum in DATABASES:
        getattr(data, datum).discard(victim)
    role = input()
    role = re.match("They were (?:a|the) (.*)", role).group(1)
    if role == "cop" or role == "doctor":
        data.used_roles.add(role)
    #Misc: purge people from lists if too large
    for list in data.unlikely, data.targets, data.herd:
        while len(list) > len(data.players)/3:
            list.pop()
    for player in data.innocent:
        data.unlikely.add(player)
elif opener == "The town opted to lynch no one today.":
    #Do nothing
    pass
#5: Night
elif "night" in opener:
    if not data.mafiosos and data.requests and random.random() > .5:
        print(chooseSet(data.requests))
    if data.doctor:
        print(chooseSet(data.unlikely or data.players))
    else:
        while True:
            try:
              target = (data.targets or data.herd).pop()
            except KeyError:
              target = chooseSet(data.players)
            if target in data.mafiosos or target == MY_NAME:
                continue
            print(target)
            break
else:
    raise ValueError("Unknown message")
saveData(data)

Ein ausgefallener, langer Haufen Python-Code, den ich nicht erklären werde (obwohl er nicht zum Golfen geeignet ist). Außerdem enthält er Listen mit "Freunden" und "Feinden", die ursprünglich auf der Grundlage von Zufalls- und / oder Cop-Ermittlungen ausgefüllt wurden . Warnung: Nicht in Anwesenheit des Logikers liegen.

Pfeffer
quelle
Ist Ihr run.shder Standard (einige Tests)
Stan Strum
Nein, meine run.sh könnte nur "run.py" ohne die üblichen Eingangs- und Ausgangsleitungen sein, aber der Standard würde funktionieren.
Paprika
1
Das sieht sehr ähnlich aus wie das, was ich geschrieben hätte, hätte ich die Zeit und Neigung.
Draco18s
Aus irgendeinem Grund denke ich, dass der Logiker bei den anderen Bots nicht so gut abschneidet. Keiner der anderen Bots meldet Ermittlungen von Polizisten
JavaScriptCoder
1
... und ich merke Monate später, dass meine Antwort fälschlicherweise davon ausgeht, dass es nur einen Polizisten / Arzt geben kann.
Paprika
4

Überlebenskünstler (v 1.0)

Zusammenfassung

Survivalist überlebt das Spiel einfach brutal, indem er jeden beschimpft, der es wagt, ihn anzuklagen, unabhängig davon, ob er eine Mafia ist oder nicht.

Logik

Wenn Sie bis zum Ende des Spiels überleben, gewinnen Sie, egal was passiert. Sie überleben also um jeden Preis.

Hintergrundgeschichte

Die Truppen marschierten durch den dunklen, feuchten Wald.

"Lieutenant, wohin marschieren wir?" Der junge Rekrut hatte sich anscheinend nicht auf Gräueltaten festgelegt, dachte der Kommandant. Naja. Er antwortete mit einem schroffen "um den Feind zu zerstören".

Im Dorf trank und lachte der feindliche Kommandeur zusammen mit den anderen Offizieren im Club, als ein Kundschafter mit den Nachrichten hereinkam. "Es gibt eine mehrere hundert Meter lange Kolonne, die für uns durch den Yulin-Wald marschiert! Versammelt die Truppen!"

Der offensichtlich betrunkene feindliche Kommandant sagte unerwartet: "Ich habe keine Berichte von anderen Pfadfindern erhalten." Der Späher (später Survivalist) dachte, dann muss ich die Truppen selbst versammeln . Nachdem sie den Pfadfinderkollegen die Geschichte erzählt hatten, kamen sie wieder zusammen und sagten, sie hätten feindliche Truppen gesehen. Der Kommandant glaubte immer noch nicht und sagte: "Ich befehle Ihnen, das Aufklären einzustellen. Es gibt keine feindlichen Truppen."

Die Pfadfinder beschlossen, ihre Waffen zu beschaffen, um die Gemeinschaft zu retten. Sie schafften es, zu ihren Positionen zu gelangen, als der Feind im Dorf eintraf. "AUFLADEN!" schrie der Kommandeur des Hinterhalts. "VERBRENNEN SIE DIE HÄUSER! VERBRENNEN SIE DIE HÄUSER! TÖTEN SIE JEDEN, EINSCHLIESSLICH DER FRAUEN UND DER KINDER! "

Die Späher retteten ihre gesamte Armee. Sie erwarteten Beförderung, Auszeichnungen und Medaillen. Stattdessen erhielten sie ein manipuliertes Kriegsgericht wegen Meuterei, Verurteilung, 10 Jahren Gefängnis, unehrenhafter Entlassung aus dem Militär und dem Exil.


Es gibt einen alten Ältesten im Stadtrat von Salem, Massachusetts. Der Legende nach hat er die Stadt gegründet. Wenn Sie ihn in seinem abgelegenen Häuschen draußen im Wald treffen, lassen Sie sich durch das Funkeln in seinen Augen nicht zu, dass Sie denken, er sei friedlich. Wenn Sie ihn beschuldigen, wird er Sie vor der Stadt ruinieren.

Der Veteran lachte in der Dunkelheit. Keine Angst vor der Dunkelheit. Angst vor Monstern unter dem Bett? Der Mann mit der Hand am Pistolenabzug lachte nervös. Er hatte vor nichts Angst, hatte er sich gesagt. Sicher, er war ein ehemaliger Kriegsheld, aber er war so an Überfälle und lebensbedrohliche Situationen gewöhnt, dass der Mann einfach nur neurotisch wurde. Sein Abzugsfinger zuckte bei einfachen Schatten; Sein Herzschlag beschleunigte sich mit jedem kleinen Geräusch. Ja, er hatte solche Todesangst. Wie konnte er das nicht, wenn so viele Menschen auf schreckliche Weise starben? Alles, was er wusste, als er entführt wurde und auf wundersame Weise seinen Feinden entkam, war, dass es keine Gnade gab.

Veteran


Code (Ich bin ein Anfänger in Python, nicht sicher, ob der Code gut ist)

#!/bin/python2

import random

with open('players') as f:
    p = f.read().split() + ['no one']


day = True
target = "survivalist"
role = "villager"
try:
    line = raw_input()
    if "You are the cop" in line:
        role = "cop"
    else if "You are the doctor" in line:
        role = "doctor"
    else if "You are a member of the mafia" in line:
        role = "mafia"

    if line.endswith(('?', 'victim.')):
        day = False
    if not day:
        if target == "survivalist":
            print random.choice(p)
        else if role == mafia || role == sheriff:
            print target
        else if role == doctor:
            print random.choice(p)
    else:
        if "survivalist" in line && ("I think this player is suspicious:" in line || 
        "I think this player is mafia:" in line ||
        "I investigated this player and found that they were mafia-aligned:")):
            print 'say 0'
            if role == "villager" || role == "mafia":
                print 'say 4'
            else if role == "cop":
                print 'say 2'
            else if role == "doctor"
                print 'say 3'
            target = line.split(" ")[0]
            print 'vote ' + target

        else if target != "survivalist":
            print 'say 6 ' + target
            print 'vote ' + target
    else:
        pass

except: pass
JavaScriptCoder
quelle
Meinten Sie orstatt ||? Hast du es getestet? Außerdem sollten Sie wahrscheinlich darauf hinweisen, dass es Python 2 ist.
Solomon Ucko
3

Benutzerbild

Avatar wählt zu Beginn "zufällig" einen Spieler aus und fokussiert ihn unerbittlich für den Rest der Runde.

Dies ist kein Hinweis auf eine ähnlich benannte animierte TV-Show.

Es ist eine EVE Online-Aktualisierung.

Laden Sie tar aller erforderlichen Dateien herunter

Änderungsprotokoll

  • v1 Geburtstag
  • v2 Protokolliert nichts an stdout, nur an stderr.
    Um dies zu unterdrücken stderr, fügen Sie 2>/dev/nullam Ende der runDatei hinzu.
/*  Casting his sight on his realm, the Lord witnessed
    The cascade of evil, the torrents of war.
    Burning with wrath, He stepped 
    down from the Heavens
    To judge the unworthy,
    To redeem the pure.

    -The Scriptures, Revelation Verses 2:12
*/

#include <stdlib.h>
#include <stdio.h>
#include "mafia.h"

int getRandomNumber(){
    return 4; // Chosen by a fair dice roll.
              // Garunteed to be random.
}


void day0(){
    char * target = get_player(getRandomNumber()-1)->name;
    fprintf(stderr, "Target: `%s'\n", target);
    FILE * f = fopen("target", "w");
    if(!f){exit(1);}
    fprintf(f, "%s", target);
    fclose(f);
}


int main(){
    get_players();
    int cycle = get_cycle(day0);
    FILE * out = fopen("to_server", "w");
    if(!out){exit(1);}
    FILE * targetF = fopen("target", "r");
    if(!targetF){exit(1);}

    char target[64];

    fscanf(targetF, "%s", target);

    fprintf(stderr, "Target: %s\n", target);

    if(cycle == 0){
        // night
        fprintf(out,"%s\n", target);
        fprintf(stderr, "> Voting to kill %s\n", target);
        exit(0);
    } else if (cycle > 0) {
        // day
        fprintf(out, "vote %s\n", target);
        fprintf(stderr, "> Voting to lynch %s\n", target);
        exit(0);
    } else if (cycle == -1) {
        fprintf(stderr, "> saying 6, 10 at %s\n", target);
        fprintf(out, "say 6 %s\n", target);
        fprintf(out, "say 10 %s\n", target);
    }
}

Es erfordert mafia.cund mafia.hBibliotheken, die ich geschrieben habe, in demselben Verzeichnis.

Diese sind zusammen mit einem Makefile und einem Ausführungsskript im Download enthalten.

MACHEN

  • Hören Sie auf, gegen das Ziel zu stimmen, wenn es getötet oder gelyncht wurde.

Während ich hier bin, werde ich den Nicht-Bot Steve einreichen:

SIGSTACKFAULT
quelle
FYI, ich nenne dibs auf avatar, erebus, leviathanundragnarok
SIGSTACKFAULT
"Dies ist kein Hinweis auf eine ähnlich benannte animierte TV-Show." ist es ein Verweis auf den Film?
Stan Strum
@ StanStrum Nein, ist es nicht.
SIGSTACKFAULT
Die from_serverDatei meines Bots wird nicht geschrieben. Mussten Sie bestimmte Berechtigungen oder etwas festlegen?
23.
1
Hinweis für Neugierige: Die hier genannten Schriftstellen sind die der Amarr von EVE Online. Es gibt eine Offenbarung 2:12 in der Bibel, die jedoch etwas anders lautet.
DLosc
2

Leviathan

Leviathan durchläuft alle Player in der playersDatei und wählt sie nacheinander aus.

Herunterladen

/*  Citizens of the State, rejoice!

    Today, a great milestone has been achieved by our glorious leaders.
    A stepping stone in the grand story of our empire has been traversed.
    Our individual fears may be quietened;
    the safety of our great nation has been secured.

    Today, unyielding, we have walked the way of the warrior.
    In our hands have our fates been molded.
    On the Leviathan's back will our civilization be carried home
    and the taint of the Enemy purged from our souls.

    Rejoice, citizens! Victory is at hand.

    -Caldari State Information Bureau Pamphlet, YC 12
*/

#include <stdio.h>
#include <stdlib.h>
#include "mafia.h"

void day0(){
    FILE * index = fopen("idx", "w");

    fprintf(index,"0");

    fclose(index);
}

int main(){
    get_players();
    int i, cycle = get_cycle(day0);

    FILE * out = fopen("to_server", "w");
    FILE * idx = fopen("idx", "r");

    fscanf(idx, "%d", &i);
    fclose(idx);

    char * target;
    target = get_player(i)->name;

    fprintf(stderr, "Idx: %d\n", i);
    fprintf(stderr, "Target: %s\n", target);

    if(cycle > 0){
        idx = fopen("idx", "w");
        i++;
        i = i%NPLAYERS;
        fprintf(idx, "%d", i);
        fprintf(out, "vote %s\n", target);
    } else if (cycle == -1) {
        printf("> saying 6, 10 at %s\n", target);
        fprintf(out, "say 6 %s\n", target);
        fprintf(out, "say 10 %s\n", target);
    }

    fclose(out);
}

Wie bei Avatar benötigt es mafia.cund mafia.him selben Verzeichnis.

Diese sind zusammen mit einem Makefile und einem Ausführungsskript im Download enthalten.

SIGSTACKFAULT
quelle
:) Hinzufügen Survivalist, sobald ich damit fertig bin
JavaScriptCoder