মাফিয়া (ওয়ে্রুলুফ নামেও পরিচিত) একটি পার্টির খেলা যা মোটামুটিভাবে খেলে:
- খেলাটি 0. দিন শুরু হয় প্রতি দিন পরে
n
একটি রাত আসেn
। প্রতি রাতের পরেn
একটি দিন আসেn+1
। অর্থাৎD0, N0, D1, N1, D2, N2
... - 0 দিনের ভোরের দিকে, একটি হোস্ট গোপনে নির্দিষ্ট ভূমিকা পালনের জন্য খেলোয়াড়দের বেছে নেয়:
- কিছু সংখ্যক খেলোয়াড় মাফিয়ায় পরিণত হয়। প্রতি রাতে প্রতিটি মাফিওসো প্লেয়ার বেছে নেয়। পরের দিন ভোরবেলায় সর্বাধিক মাফিওসোস দ্বারা নির্বাচিত খেলোয়াড় মারা যায়। এগুলি স্থায়ীভাবে খেলা থেকে সরানো হয় এবং তাদের ভূমিকা প্রকাশ্যে প্রকাশিত হয়। মাফিয়া-প্রান্তিককৃত।
- কিছু সংখ্যক খেলোয়াড় পুলিশ হয়ে যায়। প্রতি রাতে প্রতিটি পুলিশ একজন খেলোয়াড় বেছে নেয়। পরের দিন ভোরের দিকে, পুলিশ সেই খেলোয়াড়দের সারিবদ্ধকরণ সম্পর্কে সচেতন হয়। গ্রাম-প্রান্তিককৃত।
- কিছু সংখ্যক খেলোয়াড় চিকিৎসক হন। প্রতি রাতে, প্রতিটি ডাক্তার একজন খেলোয়াড় চয়ন করেন। এই খেলোয়াড় যদি সেই একই খেলোয়াড় হয় যা মাফিয়া হত্যা করতে বেছে নিয়েছিল, সেই রাতের জন্য মাফিয়ার ক্রিয়া বাতিল করা হবে। গ্রাম-প্রান্তিককৃত।
- যে সমস্ত খেলোয়াড় অন্য ভূমিকার জন্য নির্বাচিত হয়নি তারা হলেন গ্রামবাসী। গ্রামবাসীদের এমন কোনও দক্ষতা নেই যা পুরো শহরে ভাগ করে নেওয়া হয় না। গ্রাম-প্রান্তিককৃত।
- প্রতিদিন 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
। আপনি যার সাথে কথা বলছেন এমন কোনও প্লেয়ারের নাম উল্লেখ করে আপনি এই উভয়টিতে একটি thirdচ্ছিক তৃতীয় যুক্তি যুক্ত করতে পারেন (সমস্ত খেলোয়াড় এখনও এটি পড়তে পারে তবে তারা জানতে পারবে যে উদ্দেশ্যগ্রস্থ প্রাপকটি কে)।
যখন আপনার বট কোনও বার্তা বলে, তখন সমস্ত খেলোয়াড় পড়েন your_bot says "message"
, message
আপনি যে আইডিটি লিখেছেন তার সাথে বার্তাটি কোথায় যুক্ত। যদি বার্তায় কোনও বিষয় অন্তর্ভুক্ত থাকে তবে একটি স্পেস অক্ষর এবং বিষয়টি বার্তা শেষ হওয়ার পরে সরাসরি inোকানো হয়। যদি এতে কোনও প্রাপক অন্তর্ভুক্ত থাকে তবে তাদের নাম, একটি কোলন এবং একটি স্পেস অক্ষর বার্তার আগে অবিলম্বে sertedোকানো হয়।
দিন শেষে, সমস্ত জীবিত খেলোয়াড়কে ভোটের ফলাফলটি দেখতে একবার শেষবারের জন্য চালানো হয়। যদি কোনও খেলোয়াড়কে ভোট দেওয়া হয়, তবে এটি লিখিত আছে:
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 বা তার বেশি খেলোয়াড় ছাড়া গেমটি চলবে না।
- গোলের নিচে থাকা এক তৃতীয়াংশ খেলোয়াড় হবেন মাফিয়া। একজন খেলোয়াড় ডাক্তার হবেন, এবং একজন খেলোয়াড় একজন পুলিশ হবেন। অন্য সমস্ত খেলোয়াড় গ্রামবাসী।
- গ্রামের ভোটে বা মাফিয়াদের রাতারাতি ভোট এলোমেলোভাবে নিষ্পত্তি হয়।
- বটের নামগুলি অবশ্যই বর্ণানুক্রমিক + ড্যাশ এবং আন্ডারস্কোর হতে হবে।
- প্রতিপক্ষের কোডটির জ্ঞান সরাসরি ব্যবহার করা নিষিদ্ধ। তত্ত্ব অনুসারে, আপনার বটগুলি আপনি যে বটগুলি আগে কখনও দেখেন নি তার বিরুদ্ধে তুলতে সক্ষম হয়েছিলেন এবং এটি তুলনামূলকভাবে সম্পাদন করতে চান।
- আফসোস, আমি যদি আপনার প্রোগ্রামটি একচেটিয়া ফ্রি (বিয়ারের মতো) সফ্টওয়্যার ব্যবহার করে চালাতে না পারি তবে আমাকে এটিকে অযোগ্য ঘোষণা করতে হবে।
- যদি আমি বিশ্বাস করি যে কোনও জমা দেওয়ার ক্ষেত্রে এটি দূষিত বলে আমি অযোগ্য ঘোষণা করার অধিকার রাখি। এর মধ্যে রয়েছে, তবে চালানোর জন্য অতিরিক্ত সময়, মেমরি বা স্থান ব্যবহারের মধ্যে সীমাবদ্ধ নয়। আমি ইচ্ছাকৃতভাবে সীমাটি নরম রেখে গেছি, তবে মনে রাখবেন: আমি এটি নিজের কম্পিউটারে চালাচ্ছি, একটি সুপার কম্পিউটার নয়, এবং আমি ফলাফল এক বছর নিতে চাই না don't আমার মানটি বেশ নিম্নমানের হওয়ায় আমি এটি ব্যবহার করার আশা করি না। এটি মূলত "যদি আমি মনে করি আপনি উদ্দেশ্য হিসাবে ডিক হচ্ছেন", এবং আপনি যদি আমাকে বোঝাতে পারেন অন্যথায় আমি আমার সিদ্ধান্তটি উল্টো করব।
স্কোরিং
প্রতিটি রাউন্ডে, 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
নিয়ামক
@undermonmonorail এই চ্যালেঞ্জের জন্য একটি নিয়ন্ত্রণ প্রোগ্রাম লিখেছেন, এখানে উপলভ্য ।
আপনার কোড দেওয়ার জন্য এবং উত্তরগুলি পাল্টানোর জন্য আপনার এক মাস আছে, আমি বিজয়ী বটটি দেব (সর্বোচ্চ উইন রেট টাই ব্রেকার ভোট) কমপক্ষে একটি 50 খ্যাতি অনুদান (এক মাসে আমি কতটা উপার্জন করতে পারি তার উপর নির্ভর করে)
সংকলিত ভাষা ব্যবহারের জন্য @ ব্ল্যাকসিলভার দ্বারা তৈরি একটি মোড়ক স্ক্রিপ্ট এখানে রয়েছে:
#!/bin/bash
run="./a.out"
compile="gcc bot.c"
if [ -e $run ]; then
$run
else
$compile
$run
fi
এটি ভিতরে রাখুন run
।
এই পোস্টটি লিখেছেন @underlandmonorail (আমি কয়েকটি সম্পাদনা করেছি)।
যে কেউ এটি শেষ করতে এবং পোস্ট করতে চায় তাদের এখানে এটি দিয়েছিল ।