चलो माफिया खेलते हैं!


42

माफिया (वेयरवोल्फ के रूप में भी जाना जाता है) एक पार्टी गेम है जो इस तरह मोटे तौर पर खेलता है:

  • खेल दिन 0 पर शुरू होता है। हर दिन nएक रात के बाद आता है n। हर रात के बाद nएक दिन आता है n+1। यानी D0, N0, D1, N1, D2, N2...
  • दिन के भोर में, एक मेजबान चुपके से कुछ भूमिकाएं भरने के लिए खिलाड़ियों का चयन करता है:  
    • कुछ संख्या में खिलाड़ी माफिया बन जाते हैं। हर रात, हर माफियाओ एक खिलाड़ी चुनता है। अगले दिन भोर में, सबसे माफियाओ द्वारा चुने गए खिलाड़ी को मार दिया जाता है। उन्हें स्थायी रूप से खेल से हटा दिया जाता है और उनकी भूमिका सार्वजनिक रूप से सामने आ जाती है। माफिया गठबंधन।  
    • कुछ संख्या में खिलाड़ी पुलिस बन जाते हैं। हर रात, प्रत्येक पुलिस वाला एक खिलाड़ी चुनता है। अगले दिन भोर में, पुलिस को खिलाड़ियों के संरेखण के बारे में पता चलता है। गांव गठबंधन।  
    • कुछ संख्या में खिलाड़ी डॉक्टर बन जाते हैं। हर रात, प्रत्येक डॉक्टर एक खिलाड़ी चुनता है। यदि यह खिलाड़ी वही खिलाड़ी है जिसे माफिया ने मारने के लिए चुना है, तो उस रात माफिया की कार्रवाई रद्द कर दी जाती है। गांव गठबंधन।  
    • अन्य भूमिका के लिए चुने गए सभी खिलाड़ी ग्रामीण नहीं हैं। ग्रामीणों की कोई क्षमता नहीं है जो पूरे शहर द्वारा साझा नहीं की जाती है। गांव गठबंधन।
  • हर दिन 0 को छोड़कर, पूरे शहर (यानी सभी जीवित खिलाड़ी) एक खिलाड़ी के लिए वोट करते हैं। दिन के अंत में, उस खिलाड़ी को खेल से हटा दिया जाता है और उनकी भूमिका का पता चला जाता है। (दिन 0 पर, हर कोई बस रात में ठिठुरता है।)
  • अगर, किसी भी बिंदु पर, शेष माफियाओस नहीं हैं, तो खेल सभी गांव-संरेखित खिलाड़ियों के विजयी (मृतकों सहित) के साथ समाप्त होता है।
  • अगर, किसी भी बिंदु पर, गाँव-संरेखित खिलाड़ी माफिया-संरेखित खिलाड़ियों से आगे नहीं निकलते हैं, तो खेल सभी माफिया-संरेखित खिलाड़ियों के विजयी (मृतकों सहित) के साथ समाप्त होता है।

इस चुनौती के लिए, आपका लक्ष्य माफिया पर अन्य बॉट को हराकर बॉट लिखना है!

वर्किंग बॉट कैसे बनाएं

मेरे लिए आपको जो भी आपूर्ति करनी है वह एक फाइल है run। निर्देशिका संरचना के अंदर जहां यह चुनौती होगी, आपका बॉट यहां रहेगा:

start
controller/
tmp/
players/               # You are here!
    some_bot/          # Let's pretend you're some_bot.
        to_server
        from_server
        players
        run            # This is what you give me
    mafia-game-bot/
    skynet/

runफ़ाइल, जब मार डाला, अपने बॉट अपने काम करते हैं कर देगा। यह नोट करना महत्वपूर्ण है कि इस फ़ाइल को किसी भी कमांड लाइन तर्क या किसी भी चीज़ की आवश्यकता नहीं होनी चाहिए। इसे ठीक वैसे ही चलाया जाएगा ./run। यदि आपको एक अलग तरीके से निष्पादित करने की आवश्यकता है, तो आपको कुछ इस तरह से काम करना होगा:

real_bot.py

#!/bin/python2

# code goes here

run

#!/bin/bash

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

ध्यान देने वाली एक महत्वपूर्ण बात यह है कि आपके बॉट द्वारा प्राप्त सभी इनपुट फ़ाइल में मिल जाएंगे from_serverऔर कंट्रोल प्रोग्राम आपके बॉट के आउटपुट को खोजेगा to_server। मैंने इसे इस तरह से चुना ताकि कोई भी भाषा जो I / O फाइल कर सके, भाग ले सके। यदि आपकी भाषा फ़ाइल I / O की तुलना में स्टडिन और स्टडआउट के साथ काम करना आसान बनाती है, तो आप runउस फ़ाइल को लिखना चाह सकते हैं जो इस प्रकार है:

#!/bin/bash

./real_bot.py < from_server > to_server

इससे यह ऐसा हो जाएगा कि स्टडिन from_serverफ़ाइल से आता है और स्टडआउट सीधे जाता है to_server

खेल की अवधि के लिए आपका बॉट चालू नहीं रहेगा। इसके बजाय, इसे तब चलाया जाएगा जब इसे निर्णय लेने की आवश्यकता होगी। इसी तरह, यह मृत होने पर सूचित नहीं किया जाएगा, यह अभी नहीं चलाया जाएगा। किसी भी चीज़ को आप किसी फ़ाइल में याद रखना चाहते हैं और बाद में उसे पढ़कर इसके लिए योजना बनाएं। आप अपने बॉट के फ़ोल्डर में किसी भी फ़ाइल से बना सकते हैं, लिख सकते हैं या पढ़ सकते हैं , लेकिन आप उस फ़ोल्डर के बाहर कहीं भी नहीं पढ़ या पढ़ सकते हैं , जिसमें नेटवर्क एक्सेस या कुछ भी शामिल है । यदि आपके बॉट को कुछ भी पता है कि इसे फ़ोल्डर के अंदर से नहीं बताया गया था, या यदि वह उस फ़ोल्डर के अंदर कुछ भी नहीं छूता है, तो आपका बॉट अयोग्य है।

फंक्शनल बॉट कैसे बनाते हैं

दिन

गेम की शुरुआत में, फ़ाइल गेम playersमें सभी खिलाड़ियों की एक नई-सीमांकित सूची से भर जाएगी। इसे अपडेट नहीं किया जाएगा क्योंकि खिलाड़ी खेल छोड़ देंगे।

दिन 0 की सुबह, सभी खिलाड़ियों को अपनी from_serverफ़ाइल में यह संदेश मिलेगा :

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

यदि आप पुलिस वाले हैं, तो लाइन You are the copको अंत तक जोड़ दिया जाता है। डॉक्टर देखता है You are the doctorYou are a member of the mafia.\nYour allies are:संदेश पढ़ने वाले खिलाड़ी को छोड़कर, माफिया सदस्यों की माफिया सदस्यों की नई-नई सीमांकित सूची देखता है ।

अन्य सभी दिनों में, यह संदेश दिखाई देगा:

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दिन की संख्या के साथ बदल दिया जाता है। victimपिछली रात के शिकार के नाम के साथ बदल दिया गया है, और victim_roleइनमें से एक है:

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

cop_targetउस खिलाड़ी का नाम है जिसे पुलिस ने कल रात जांच की थी, और या target_alignmentतो है । अंत में, उन खिलाड़ियों की सूची है जो इस प्रारूप में अभी भी जीवित हैं:villagemafiaremaining_playersplayer1, player2, player3

दूसरी पंक्ति को छोड़ दिया जाता है यदि कल रात कोई मार नहीं थी, और तीसरी पंक्ति केवल पुलिस को दिखाई जाती है।

उदाहरण के लिए,

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

एक बार जब यह संदेश समाप्त हो जाता है, तो दिन शुरू हो जाता है! प्रत्येक बॉट दिन भर में 50 क्रिया कर सकता है, जहां "एक्शन" एक खिलाड़ी को वोट दे रहा है या जोर से कुछ कह रहा है।

किसी खिलाड़ी को वोट करने के लिए, vote player_nameअपनी to_serverफ़ाइल पर लिखें और समाप्त करें। किसी को न मारने के लिए वोट देना, लिखना vote no one। जब आप मतदान करेंगे, तो सभी खिलाड़ी (आप सहित) देखेंगे your_bot votes to kill your_selection। वोट 0 दिन पर नजरअंदाज कर दिया जाता है।

सभी खिलाड़ियों को कई पूर्व-निर्धारित संदेश भेजे जा सकते हैं। प्रत्येक संभावित संदेश की आईडी यहां सूचीबद्ध है:

 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?

पहले पांच को छोड़कर इन सभी संदेशों में एक विशिष्ट खिलाड़ी का जिक्र है। उन संदेशों में से एक कहने के लिए, लिखें say message_id player_name। पहले पांच संदेशों में से एक के लिए, बस लिखें say message_id। आप इन दोनों के लिए एक वैकल्पिक तीसरा तर्क जोड़ सकते हैं, उस खिलाड़ी का नाम निर्दिष्ट कर सकते हैं जिससे आप बात कर रहे हैं (सभी खिलाड़ी अभी भी इसे पढ़ सकते हैं, लेकिन उन्हें पता होगा कि इच्छित प्राप्तकर्ता कौन है)।

जब आपका बॉट एक संदेश कहता है, तो सभी खिलाड़ी पढ़ते हैं your_bot says "message", messageआपके द्वारा लिखे गए आईडी से जुड़ा संदेश कहां है। यदि संदेश में एक विषय शामिल है, तो एक स्थान वर्ण और विषय संदेश के अंत के बाद सीधे डाला जाता है। यदि इसमें एक प्राप्तकर्ता शामिल है, तो उनका नाम, एक बृहदान्त्र और एक अंतरिक्ष वर्ण संदेश से तुरंत पहले डाला जाता है।

दिन के अंत में, सभी जीवित खिलाड़ियों को वोट के परिणाम को देखने के लिए एक आखिरी बार चलाया जाता है। यदि किसी खिलाड़ी को वोट दिया गया था, तो यह लिखा गया है:

The town has killed player_name!
They were a villager

... या a mafioso, या the cop, या the doctor

यदि किसी खिलाड़ी को वोट नहीं दिया गया, तो इसकी जगह यह लिखा गया है:

The town opted to lynch no one today.

जब नियंत्रक इन संदेशों को भेजता है, तो यह खिलाड़ियों की किसी भी प्रतिक्रिया को अनदेखा करता है। दिन ढल गया।

रात

रात में, लेकिन सभी ग्रामीणों को अपनी शक्ति का उपयोग करने के लिए मिलता है।

माफिया:

आप पढ़ेंगे It is night. Vote for a victim.। जब ऐसा होता है, तो उस खिलाड़ी का नाम आउटपुट करें जिसे आप मारना चाहते हैं।

पुलिस:

आप पढ़ेंगे It is night. Who would you like to investigate?। जब ऐसा होता है, तो उस खिलाड़ी का नाम आउटपुट करें जिसे आप चेक करना चाहते हैं।

चिकित्सक:

आप पढ़ेंगे It is night. Who would you like to save?। जब ऐसा होता है, तो उस खिलाड़ी का नाम आउटपुट करें जिसे आप सुरक्षित करना चाहते हैं।

इसके बाद, अगले दिन सामान्य रूप से शुरू होता है।

आप प्रति गेम केवल एक बार खुद को बचा सकते हैं।

सामान्य जानकारी

  • खेल 6 या अधिक खिलाड़ियों के बिना नहीं चलेगा।
  • एक तिहाई खिलाड़ी, गोल किए गए, माफिया होंगे। एक खिलाड़ी डॉक्टर होगा, और एक खिलाड़ी पुलिस वाला होगा। अन्य सभी खिलाड़ी ग्रामीण हैं।
  • गाँव के वोट में टाई या माफिया के रातोंरात वोट को बेतरतीब ढंग से बसाया जाता है।
  • बॉट नाम अल्फ़ान्यूमेरिक + डैश और अंडरस्कोर होना चाहिए।
  • सीधे प्रतिद्वंद्वी के कोड के ज्ञान का उपयोग करना मना है। सिद्धांत रूप में, मुझे आपके बॉट को उन बॉट्स के खिलाफ रखने में सक्षम होना चाहिए जो आपने पहले कभी नहीं देखे हैं और यह तुलनात्मक रूप से प्रदर्शन करता है।
  • अफसोस, अगर मैं आपके प्रोग्राम को विशेष रूप से मुफ्त (बीयर में) सॉफ्टवेयर का उपयोग करके नहीं चला सकता, तो मुझे इसे अयोग्य घोषित करना होगा।
  • यदि मैं इसे दुर्भावनापूर्ण मानता हूं तो मुझे किसी भी अधीनता को अयोग्य घोषित करने का अधिकार सुरक्षित है। इसमें शामिल है, लेकिन समय, स्मृति या चलाने के लिए अंतरिक्ष के अत्यधिक उपयोग के लिए सीमित नहीं है। मैंने जानबूझकर सीमा को नरम छोड़ दिया है, लेकिन याद रखें: मैं इसे अपने होम कंप्यूटर पर चला रहा हूं, सुपर कंप्यूटर नहीं, और मुझे एक वर्ष लेने के लिए परिणाम नहीं चाहिए। मुझे इस का उपयोग करने की उम्मीद नहीं है, क्योंकि मेरे मानक बहुत कम हैं। यह मूल रूप से "अगर मुझे लगता है कि आप उद्देश्य पर एक डिक हो रहे हैं", और अगर आप मुझे मना सकते हैं तो मैं अपना निर्णय उलट दूंगा।

स्कोरिंग

प्रत्येक राउंड, 100 गेम चलाए जाएंगे (यह बढ़ सकता है क्योंकि नमूने के आकार को बड़ा रखने के लिए अधिक बॉट शामिल होते हैं, लेकिन सिद्धांत रूप में यह प्रभावित नहीं होगा)। मैं यह दर्ज करूंगा कि एक ग्रामीण के रूप में कितनी बार जीतता है और एक ग्रामीण के रूप में कितनी बार खेलता है, और माफिया के लिए वही जीतता है। एक बॉट के villager_ratioहै number of games won as villager / number of games played as villager, और mafia_ratioएक ही है, लेकिन है s/villager/mafia/g। बॉट का स्कोर है (villager_ratio - mean villager_ratio) + (mafia_ratio - mean mafia_ratio)

उदाहरण बॉट

रैंडी द रोबोट एक अच्छा माफिया खिलाड़ी नहीं है। रैंडी बहुत ज्यादा सब कुछ अनदेखा करता है, बेतरतीब ढंग से चुनना कि क्या कहना है, किसे वोट देना है और किसे रात की शक्तियों के साथ निशाना बनाना है।

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

नियंत्रक

@undergroundmonorail ने यहां उपलब्ध इस चुनौती के लिए एक नियंत्रण कार्यक्रम लिखा ।

आपके पास जवाब देने के लिए एक महीने का समय है और जवाब देने के लिए, मैं जीतने वाले को बॉट दूंगा (उच्चतम जीत दर टाई ब्रेकर वोट है) कम से कम 50 प्रतिष्ठा इनाम (मैं एक महीने में कितना प्रतिनिधि कमा सकता हूं इसके आधार पर)


यहाँ संकलित भाषाओं के साथ प्रयोग करने के लिए @Blacksilver द्वारा बनाई गई एक रैपर स्क्रिप्ट है:

#!/bin/bash

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

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

इसे अंदर डालें run


यह पोस्ट @undergroundmonorail (मैंने कुछ संपादन किए) के द्वारा लिखा गया था।

उन्होंने इसे यहां छोड़ दिया जो इसे समाप्त करना चाहते थे और इसे पोस्ट करना चाहते थे।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
मार्टिन एंडर

जवाबों:


3

ज़ुलु

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);
    }
}

मुझे उम्मीद नहीं थी कि यह सब कुछ होगा। मैं कभी-कभी इसे समाप्त कर सकता हूं।

यह कैसे काम करता है v1.0

दिन की संख्या पर नज़र रखता है, कौन जीवित है, कौन मरा है, कौन माफिया है, कौन गाँव-गठबंधन, भूमिकाएँ, वर्तमान दिन के वोट / संदेश और समग्र वोट / संदेश हैं।

  1. रात

    ए। माफिया - किसी भी ग्रामीण के लिए वोट करें, जिसने यदि संभव हो तो माफिया (बेतरतीब ढंग से) के खिलाफ मतदान किया है, अन्यथा एक यादृच्छिक ग्रामीण।

    ख। कॉप - अज्ञात संरेखण के किसी भी व्यक्ति की जांच करें।

    सी। डॉक्टर - पहले स्वयं को बचाओ, फिर पुलिस को बचाओ अगर ज्ञात हो (मुझे नहीं लगता कि यह कभी भी इस रूप में जान सकता है), तो ग्रामीण को बचाओ अगर ज्ञात हो (शायद यह भी नहीं जानता हो), अन्यथा यादृच्छिक व्यक्ति को बचाओ।

  2. दिन

    ए। यदि किसी ने सीधे स्वयं को संदेश दिया है, तो उन्हें जवाब दें (सीमित प्रतिक्रियाएं संभव हैं)।

    ख। माफिया - सबसे ज्यादा वोट पाने वाले ग्रामीण के लिए वोट करें।

    सी। किसी भी जीवित माफिया के साथ ग्रामीणों को जाना जाता है - माफियाओ के लिए वोट करें।

    घ। केवल मृत माफिया के साथ ग्रामीणों को जाना जाता है - एक यादृच्छिक बॉट के लिए वोट करें जिन्होंने माफियाओ के लिए कभी वोट नहीं दिया है।

    इ। पुलिस कॉप के साथ ग्रामीणों - यादृच्छिक बॉट के लिए पुलिस वाले ने वोट दिया है।

    च। मृत गाँव के साथ गाँव-संरेखित ज्ञात - एक यादृच्छिक बॉट के लिए वोट करें जिसने मृतकों के लिए मतदान किया।

    जी। स्वयं के खिलाफ वोटों के साथ ग्रामीणों ने सबसे अधिक मतदान वाले गैर-ग्राम-संरेखित बॉट के लिए वोट दिया।


1
रुको, यह क्या करता है?
SIGSTACKFAULT

1
क्यों, यह माफिया निभाता है, बिल्कुल! :)
जो।

मेरा मतलब है रणनीति।
SIGSTACKFAULT

6

उदाहरण कोड ने मेरे लिए काम नहीं किया, मैं पायथन 3 का उपयोग करता हूं, इसलिए मैंने main.pyइसे काम करने के लिए फाइल को बदल दिया ।

तो यहां पायथन 3 के लिए मेरा निश्चित संस्करण है, मैंने पहले पायथन में कभी भी प्रोग्राम नहीं किया था, इसलिए शायद यह एक भयानक कोड है लेकिन यह काम कर सकता है :)

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

यह काम करते समय मैंने जो कुछ सीखा, वह (और यह मेरे लिए स्पष्ट नहीं था)

  • printखेल के साथ कुछ भी नहीं करता है यह एक console.logजेएस की तरह है
  • input() यह चल रहे प्रोग्राम को ब्लॉक करता है यह कदम से कदम डिबगिंग के लिए अच्छा हो सकता है
  • from_serverऔर to_serverहर दौर में साफ किया जाता है।
  • Ctrl+Cसंयोजन के साथ स्क्रिप्ट को रोकना असंभव है , जो कष्टप्रद है।

PPCG में आपका स्वागत है! महान पहली पोस्ट! आशा है कि आप चारों ओर छड़ी! मैंने आपकी पोस्ट को वर्किंग सिंटैक्स हाइलाइटिंग के लिए एडिट किया है, और निरंतरता के लिए ए जोड़ा है run.sh
R

1
धन्यवाद! मुझे यकीन नहीं है कि < from_server > to_serverमैं आवश्यक हूं क्योंकि मुझे कोड में हार्ड कोडेन फिल्म्स हैं। खेल इंजन सिर्फ ./runपाइप के बिना कॉल । इसलिए input()और print()खेल के साथ काम नहीं किया। mayn.pyलाइन 57:os.system('./run')
पीटर

2
आपको चलाने के लिए नियंत्रक कैसे मिलेगा? मेरे द्वारा इसका निर्धारण नहीं किया जा सकता। क्या आप एक नमूना मंगलाचरण प्रदान कर सकते हैं?
R

नोट: मूल पायथन 2randy.py में लिखा गया था , जो समस्याओं का कारण बना।
SIGSTACKFAULT

नियंत्रक के लिए आपको ./startमूल फ़ोल्डर से या आपको एक अजगर 3 संस्करण की आवश्यकता हैmain.py
पीटर

5

तर्क करनेवाला

#!/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)

फैंसी, अजगर कोड का लंबा झुंड, जो मैं समझाने नहीं जा रहा हूं (हालांकि यह गोल्फ नहीं है), इसके अलावा यह "दोस्तों" और "दुश्मनों" की सूची रखता है जो मूल रूप से मौका और / या पुलिस जांच के आधार पर आबाद हैं। । चेतावनी: तर्कशास्त्री की उपस्थिति में झूठ मत बोलो।


क्या आपका run.shमानक है (कुछ परीक्षण कर रहे हैं)
स्टेन स्ट्रैम

नहीं, मेरा run.sh सामान्य इनपुट और आउटपुट पाइपिंग के बिना विशुद्ध रूप से "run.py" हो सकता है, लेकिन मानक काम करेगा।
पिपरी

1
यह बहुत कुछ वैसा ही दिखता है जैसा मैंने लिखा था, मेरे पास समय और झुकाव था।
ड्रेको 18s

किसी कारण से मुझे लगता है कि तर्कशास्त्री अन्य बॉट्स के आस-पास इतना अच्छा नहीं करेंगे ... अन्य बॉट्स में से कोई भी पुलिस जांच की रिपोर्ट नहीं करता है
JavaScriptCoder

1
... और मुझे पता है, महीनों बाद, कि मेरा जवाब गलत तरीके से मानता है कि केवल एक पुलिस / डॉक्टर हो सकता है।
पिपरी

4

अस्तित्ववादी (v 1.0)

सार

उत्तरजीवितावादी किसी को भी बर्बरतापूर्वक खेल से बचा लेता है जो किसी पर भी आरोप लगाने की हिम्मत करता है, चाहे वह माफिया हो या न हो।

तर्क

यदि आप खेल के अंत तक जीवित रहते हैं, तो आप कोई बात नहीं जीतते हैं। इसलिए, आप हर कीमत पर जीवित रहते हैं।

पृष्ठभूमि की कहानी

सैनिकों ने अंधेरे, नम जंगल के माध्यम से मार्च किया।

"लेफ्टिनेंट, हम कहाँ मार्च कर रहे हैं?" कमांडर ने सोचा कि युवा भर्ती ने खुद को अत्याचारों के लिए कठोर नहीं बनाया है। ओह अच्छा। उन्होंने "दुश्मन को नष्ट करने के लिए" एक क्रूरता के साथ जवाब दिया।

गांव में, दुश्मन कमांडर शराब पी रहा था और क्लब में अन्य अधिकारियों के साथ हंस रहा था, जब एक स्काउट समाचार के साथ भाग गया। "एक स्तंभ है, कई सौ गज लंबा, हमारे लिए यूलिन के जंगल से गुजरता है! सैनिकों को रैली!"

दुश्मन कमांडर, स्पष्ट रूप से inebriated, ने अप्रत्याशित रूप से कहा, "मेरे पास अन्य स्काउट्स से कोई रिपोर्ट नहीं है।" स्काउट (बाद में उत्तरजीवितावादी) ने सोचा, तो मुझे खुद सेना को रैली करनी होगी । साथी स्काउट्स को कहानी बताने के बाद, वे एक साथ वापस आए, सभी ने कहा कि उन्होंने दुश्मन सैनिकों को देखा है। कमांडर अभी भी विश्वास नहीं करता था, कह रहा था, "मैं आपको स्काउटिंग को बंद करने का आदेश दे रहा हूं । दुश्मन के सैनिक नहीं हैं "।

स्काउट्स ने समुदाय को बचाने के लिए अपने हथियार प्राप्त करने का फैसला किया। बल में गाँव में शत्रु के पहुँचते ही वे अपने पदों पर आसीन हो गए। "चार्ज!" घात के सेनापति को चिल्लाया। "हुसैन! बर्न हूंस! बर्न हूज! किन्नर, महिलाओं और बच्चों को शामिल करना! "

स्काउट्स ने अपनी पूरी सेना को बचा लिया। उन्हें पदोन्नति, पुरस्कार और पदक की उम्मीद थी। इसके बजाय, उन्हें विद्रोह, सजा, 10 साल की जेल, फौजी और निर्वासन से बेईमानी के लिए एक कठोर कोर्ट-मार्शल मिला।


मैसाचुसेट्स के सलेम के नगर परिषद में एक पुराना बड़ा है। किंवदंती है कि उन्होंने शहर की स्थापना की। जब आप जंगल में उसकी अलग-थलग झोपड़ी में उससे मिलते हैं, तो उसकी आंख में झिझक न होने दें, आपको लगता है कि वह शांत है। यदि आप उस पर आरोप लगाते हैं, तो वह आपको शहर के सामने बर्बाद कर देगा।

वेटरन अंधेरे में हंसता रहा। अंधेरे से डर, कोई रास्ता नहीं। बिस्तर के नीचे राक्षसों से डरते हैं? बंदूक के ट्रिगर पर उसके हाथ वाला आदमी घबरा कर हंस पड़ा। वह किसी चीज से डर नहीं रहा था, उसने खुद को बताया था। निश्चित रूप से, वह एक अतीत युद्ध के समय के नायक थे, लेकिन उन्हें स्थितियों और जीवन की खतरनाक स्थितियों का सामना करने के लिए इस्तेमाल किया गया था ताकि यह आदमी को केवल विक्षिप्त बना सके। उसकी ट्रिगर उंगली सरल छाया में हिल गई; उनके दिल की धड़कन हर छोटी आवाज के साथ तेज हो गई। हां, वह मौत से डर गया था। इतने लोगों को भयानक तरीकों से मरते हुए देखकर वह कैसे नहीं कर सकता था? वह सब जानता था कि उसका अपहरण कर लिया गया था और चमत्कारिक रूप से उसके दुश्मनों से बचकर निकल गया था कि कोई दया नहीं थी।

वयोवृद्ध


कोड (मैं अजगर में एक धोखेबाज़ हूं, यह सुनिश्चित नहीं है कि कोड अच्छा है)

#!/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

क्या orइसके बजाय आपका मतलब था ||? क्या आपने इसका परीक्षण किया? इसके अलावा, आपको शायद यह बताना चाहिए कि यह पायथन 2 है
सोलोमन उको

3

अवतार

अवतार "बेतरतीब ढंग से" शुरू में एक खिलाड़ी को चुनता है और बाकी दौर के लिए लगातार ध्यान केंद्रित करता है।

यह समान रूप से नामित एनिमेटेड टीवी शो का संदर्भ नहीं है।

यह एक ईवीई ऑनलाइन रिफरेन्स है।

सभी आवश्यक फ़ाइलों का टार डाउनलोड करें

बदलाव का

  • v1 जन्मदिन
  • v2stdout केवल करने के लिए कुछ भी लॉग इन नहीं करता है stderr
    दबाने के लिए stderrभी, फ़ाइल 2>/dev/nullके अंत में जोड़ें run
/*  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);
    }
}

इसकी आवश्यकता है mafia.cऔर mafia.h, पुस्तकालयों, जो मैंने लिखा था, उसी निर्देशिका में।

ये मेकफाइल और रन स्क्रिप्ट के साथ डाउनलोड में शामिल हैं।

करने के लिए

  • जब वे मारे गए या लपके गए तो लक्ष्य के खिलाफ मतदान करना बंद कर दें।

जब मैं यहाँ हूँ, मैं गैर-बॉट प्रस्तुत करूँगा, स्टीव:


FYI करें, मैं पर झलक फोन avatar, erebus, leviathan, औरragnarok
SIGSTACKFAULT

"यह एक समान नाम वाले एनिमेटेड टीवी शो का संदर्भ नहीं है।" क्या यह फिल्म का संदर्भ है?
स्टेन स्ट्रम

@StanStrum नहीं, यह नहीं है।
SIGSTACKFAULT

मेरे बॉट की from_serverफ़ाइल को नहीं लिखा जा रहा है। क्या आपको विशिष्ट अनुमतियाँ या कुछ और सेट करना था?
R

1
जिज्ञासु के लिए ध्यान दें: यहाँ जिन ग्रंथों का संदर्भ दिया गया है, वे ईवीई ऑनलाइन से एमर के हैं । वहाँ है एक रहस्योद्घाटन 02:12 बाइबिल में है, लेकिन यह नहीं बल्कि अलग तरह से पढ़ता है।
DLosc

2

लिविअफ़ान

लेविथान playersफ़ाइल में सभी खिलाड़ियों पर ध्यान केंद्रित करते हैं और उन्हें एक-एक करके निशाना बनाते हैं।

डाउनलोड

/*  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);
}

अवतार के साथ, इसकी आवश्यकता है mafia.cऔर mafia.hउसी निर्देशिका में है।

ये मेकफाइल और रन स्क्रिप्ट के साथ डाउनलोड में शामिल हैं।


:) अस्तित्ववादी को एक बार जोड़ने के साथ im किया
JavaScriptCoder
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.