माफिया (वेयरवोल्फ के रूप में भी जाना जाता है) एक पार्टी गेम है जो इस तरह मोटे तौर पर खेलता है:
- खेल दिन 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 doctor
। You 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
तो है । अंत में, उन खिलाड़ियों की सूची है जो इस प्रारूप में अभी भी जीवित हैं:village
mafia
remaining_players
player1, 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 (मैंने कुछ संपादन किए) के द्वारा लिखा गया था।
उन्होंने इसे यहां छोड़ दिया जो इसे समाप्त करना चाहते थे और इसे पोस्ट करना चाहते थे।