มาเล่นกันเถอะ!


42

Mafia (หรือที่รู้จักกันในนาม Werewolf) เป็นเกมปาร์ตี้ที่เล่นอย่างคร่าวๆดังนี้:

  • เกมเริ่มต้นในวันที่ 0 หลังจากทุกnคืนnมา หลังจากทุกคืนnมาถึงวันn+1หนึ่ง เช่นD0, N0, D1, N1, D2, N2...
  • ในตอนเช้าของวันที่ 0 โฮสต์จะเลือกผู้เล่นอย่างลับ ๆ เพื่อเติมเต็มบทบาทบางอย่าง:  
    • ผู้เล่นจำนวนหนึ่งกลายเป็นมาเฟีย ทุกคืนมาเฟียทุกคนเลือกผู้เล่น ในรุ่งอรุณของวันถัดไปผู้เล่นที่ถูกเลือกโดย mafiosos ส่วนใหญ่จะถูกฆ่า พวกเขาถูกลบออกจากเกมอย่างถาวรและมีการเปิดเผยบทบาทของพวกเขาต่อสาธารณะ มาเฟียชิด  
    • ผู้เล่นบางคนกลายเป็นตำรวจ ทุกคืนตำรวจแต่ละคนเลือกผู้เล่น ในรุ่งอรุณของวันถัดไปตำรวจจะรับรู้ถึงการจัดเรียงของผู้เล่น หมู่บ้านชิด  
    • ผู้เล่นจำนวนหนึ่งกลายเป็นหมอ ทุกคืนแพทย์แต่ละคนเลือกผู้เล่น หากผู้เล่นนี้เป็นผู้เล่นคนเดียวกันกับที่มาเฟียเลือกที่จะฆ่าการกระทำของมาเฟียในคืนนั้นจะถูกยกเลิก หมู่บ้านชิด  
    • ผู้เล่นทุกคนที่ไม่ได้ถูกเลือกสำหรับบทบาทอื่นคือชาวบ้าน ชาวบ้านไม่มีความสามารถที่ไม่ได้แชร์ทั้งเมือง หมู่บ้านชิด
  • ทุกวันยกเว้นวันที่ 0 ทั้งเมือง (นั่นคือผู้เล่นที่มีชีวิตทั้งหมด) โหวตให้ผู้เล่น ในตอนท้ายของวันผู้เล่นนั้นจะถูกลบออกจากเกมและมีการเปิดเผยบทบาทของพวกเขา (ในวันที่ 0 ทุกคนก็หนาวสั่นจนค่ำ)
  • หาก ณ จุดใดไม่มี mafiosos ที่เหลืออยู่เกมจะจบลงด้วยผู้เล่นที่ได้รับชัยชนะของหมู่บ้าน (รวมถึงคนตาย)
  • หาก ณ เวลาใดก็ตามผู้เล่นที่ได้รับการจัดหมู่บ้านไม่ได้มีจำนวนมากกว่าผู้เล่นที่มีแนวมาเฟียเกมจะจบลงด้วยผู้เล่นที่ได้รับการจัดแนวมาเฟียทุกคนที่ชนะ (รวมถึงผู้ตายด้วย)

สำหรับความท้าทายนี้เป้าหมายของคุณคือเขียน bot เพื่อเอาชนะบอทอื่น ๆ ที่ Mafia!

วิธีทำบอททำงาน

ทั้งหมดที่คุณมี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 สามารถเข้าร่วมได้ หากภาษาของคุณทำให้การทำงานกับ stdin และ stdout ง่ายกว่าไฟล์ I / O คุณอาจต้องการเขียนrunไฟล์ที่มีลักษณะดังนี้:

#!/bin/bash

./real_bot.py < from_server > to_server

นี้จะทำให้มันดังนั้น stdin ที่มาจากfrom_serverไฟล์และ stdout to_serverไปโดยตรงไปยัง

บอทของคุณจะไม่วิ่งต่อไปในช่วงเวลาของเกม แต่จะรันเมื่อจำเป็นต้องตัดสินใจ ในทำนองเดียวกันมันจะไม่ได้รับแจ้งเมื่อมันตายมันก็จะไม่ทำงานอีกต่อไป วางแผนสำหรับสิ่งนี้โดยการบันทึกสิ่งที่คุณต้องการจดจำเป็นไฟล์และอ่านในภายหลัง คุณอาจจะสร้างการเขียนหรืออ่านจากไฟล์ในโฟลเดอร์บอทของคุณ แต่คุณอาจไม่เขียนหรืออ่านได้ทุกที่ด้านนอกของโฟลเดอร์นั้นรวมถึงการเข้าถึงเครือข่ายหรืออะไร หากบอทของคุณรู้อะไรที่ไม่ได้รับการบอกกล่าวจากภายในโฟลเดอร์หรือหากสัมผัสสิ่งที่ไม่ได้อยู่ในโฟลเดอร์บ็อตของคุณจะถูกตัดสิทธิ์

วิธีที่จะทำให้การทำงานของ ธ ปท

วัน

ที่จุดเริ่มต้นของเกมไฟล์playersจะถูกเติมด้วยรายการที่คั่นด้วย newline ของผู้เล่นทั้งหมดในเกม มันจะไม่ได้รับการอัพเดตเมื่อผู้เล่นออกจากเกม

ในตอนเช้าของวันที่ 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 copthe 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)คะแนนบอคือ

บอทตัวอย่าง

Randy the Robot ไม่ใช่ผู้เล่นที่ดี แรนดี้เพิกเฉยต่อทุกสิ่งทุกอย่างโดยการสุ่มเลือกว่าจะพูดว่าใครลงคะแนนเลือกใครและกำหนดเป้าหมายด้วยอำนาจกลางคืน

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 (ฉันแก้ไขไปแล้วสองสามข้อ)

เขามอบมันไว้ที่นี่กับทุกคนที่ต้องการทำให้เสร็จและโพสต์มัน


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Martin Ender

คำตอบ:


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

ไม่ใช่ทุกสิ่งที่ฉันหวังว่าจะเป็น ฉันอาจท้ายมัน tweaking

มันทำงานอย่างไร v1.0

ติดตามจำนวนวันที่ยังมีชีวิตอยู่ใครตายแล้วใครคือมาเฟียที่จัดแนวหมู่บ้านบทบาทการโหวต / ข้อความในวันปัจจุบันและการโหวต / ข้อความโดยรวม

  1. กลางคืน

    Mafia - โหวตให้กับชาวบ้านที่ลงคะแนนให้กับมาเฟีย (สุ่ม) ถ้าเป็นไปได้

    ข Cop - ตรวจสอบทุกคนที่ไม่ทราบตำแหน่ง

    ค หมอ - ช่วยตัวเองก่อนจากนั้นก็ช่วยตำรวจถ้ารู้ (ฉันไม่คิดว่ามันจะเป็นแบบนี้ได้ในตอนนี้) ช่วยชาวบ้านถ้ารู้

  2. วัน

    หากใครพูดข้อความกับตัวเองโดยตรงให้ตอบกลับพวกเขา (จำกัด การตอบสนองที่เป็นไปได้)

    ข Mafia - โหวตให้กับคนในหมู่บ้านที่ได้คะแนนมากที่สุด

    ค ชาวบ้านกับมาเฟียที่ยังมีชีวิตอยู่ - โหวตให้มาเฟีย

    d ชาวบ้านที่รู้จักมาเฟียเพียงคนเดียวที่ตายแล้ว - โหวตให้บอทสุ่มที่ไม่เคยลงคะแนนให้มาเฟีย

    อี ชาวบ้านรู้จักตำรวจ - โหวตให้บอทสุ่มตำรวจได้โหวตให้

    ฉ ชาวบ้านที่รู้จักหมู่บ้านที่ตายแล้ว - โหวตให้บอทสุ่มที่โหวตให้คนตาย

    ก. ชาวบ้านที่ลงมติไม่เห็นด้วยตนเองให้ลงคะแนนให้กับบอทที่ได้รับการโหวตสูงสุดในปัจจุบัน


1
รอสิ่งนี้ทำอะไร
SIGSTACKFAULT

1
ทำไมมันถึงเล่นมาเฟียแน่นอน! :)
โจ

ฉันหมายถึงกลยุทธ์
SIGSTACKFAULT

6

ตัวอย่างรหัสไม่ทำงานสำหรับฉันฉันใช้ Python 3 ดังนั้นฉันจึงเปลี่ยนmain.pyไฟล์เพื่อให้มันทำงานได้

ดังนั้นนี่คือเวอร์ชันที่แก้ไขแล้วของฉันสำหรับ Python 3 ฉันไม่เคยตั้งโปรแกรมใน Python มาก่อนดังนั้นอาจเป็นรหัสที่น่ากลัว แต่ใช้งานได้ :)

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ใน js
  • 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ɪᴋᴇʀ

หมายเหตุ: ต้นฉบับrandy.pyถูกเขียนในPython 2ซึ่งทำให้เกิดปัญหา
SIGSTACKFAULT

สำหรับคอนโทรลเลอร์ที่คุณต้องการ./startจากโฟลเดอร์ดั้งเดิมหรือคุณต้องการไพ ธ อน 3 เวอร์ชั่นของmain.py
Peter

5

The Logician

#!/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มาตรฐานของคุณ(ทำการทดสอบบางอย่าง)
Stan Strum

ไม่ run.sh ของฉันอาจเป็น "run.py" โดยไม่ต้องมีอินพุตและเอาต์พุตท่อปกติ แต่มาตรฐานจะใช้งานได้
pppery

1
มันดูคล้ายกับสิ่งที่ฉันเขียนขึ้นถ้าฉันมีเวลาและความชอบ
Draco18s

ด้วยเหตุผลบางอย่างฉันคิดว่านักลอจิคัลจะทำได้ไม่ดีนักในบ็อตอื่น ๆ ... ไม่มีบ็อตอื่นรายงานการสอบสวนตำรวจ
JavaScriptCoder

1
... และฉันรู้ว่าเดือนต่อมาคำตอบของฉันไม่ถูกต้องถือว่ามีเพียงหนึ่งตำรวจ / แพทย์
pppery

4

Survivalist (v 1.0)

สรุป

ผู้รอดชีวิตเพียงแค่เอาชีวิตรอดในเกมอย่างไร้ความปราณีเพียงแค่ด่าใครก็ตามที่กล้ากล่าวหาเขาไม่ว่าเขาจะเป็นมาเฟียหรือไม่ก็ตาม

ตรรกะ

หากคุณรอดชีวิตจนจบเกมคุณจะชนะไม่ว่าจะเกิดอะไรขึ้น ดังนั้นคุณจะอยู่รอดได้ในค่าใช้จ่ายทั้งหมด

backstory

ทหารเดินผ่านป่าอันมืดมิดและชื้น

"ร้อยโทพวกเราจะเดินกันที่ไหน?" เห็นได้ชัดว่าการรับสมัครหนุ่มสาวไม่ได้ทำให้ตัวเองแข็งกระด้างต่อความโหดร้ายผู้บัญชาการคิด โอ้ดี เขาตอบด้วยคำว่า "ทำลายศัตรู"

ที่หมู่บ้านผู้บัญชาการข้าศึกกำลังดื่มและหัวเราะพร้อมกับเจ้าหน้าที่คนอื่น ๆ ในสโมสรเมื่อลูกเสือวิ่งเข้ามาพร้อมกับข่าว "มีเสายาวหลายร้อยหลาเดินผ่านป่า Yulin เพื่อพวกเรา! ระดมพล!"

ผู้บัญชาการข้าศึกจู่โจมอย่างเห็นได้ชัดพูดอย่างไม่คาดคิดว่า "ข้าไม่มีรายงานจากหน่วยสอดแนมอื่น" ลูกเสือ (ภายหลัง Survivalist) คิดแล้วฉันจะมีการชุมนุมกองกำลังตัวเอง หลังจากเล่าเรื่องให้ลูกเสือฟังพวกเขากลับมารวมกันทุกคนบอกว่าพวกเขาเห็นกองทหารข้าศึก ผู้บัญชาการยังไม่เชื่อพูดว่า "ฉันสั่งให้คุณหยุดการสอดแนมไม่มีทหารศัตรู"

หน่วยสอดแนมตัดสินใจที่จะรับอาวุธเพื่อช่วยชุมชน พวกเขาจัดการเพื่อไปยังตำแหน่งของพวกเขาเช่นเดียวกับศัตรูมาถึงในหมู่บ้านบังคับ "ค่าใช้จ่าย!" ตะโกนผู้บัญชาการของการซุ่มโจมตี "เผาบ้าน! เผาบ้าน! ฆ่าทุกคนรวมถึงผู้หญิงและเด็ก! "

หน่วยสอดแนมช่วยกองทัพทั้งหมดของพวกเขา พวกเขาคาดหวังการเลื่อนระดับรางวัลและเหรียญ พวกเขากลับได้รับการศาลทหารสำหรับการกบฏความเชื่อมั่น 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แทน||? คุณทดสอบหรือไม่ นอกจากนี้คุณควรชี้ให้เห็นว่ามันเป็น Python 2
โซโลมอน Ucko

3

สัญลักษณ์

Avatar "สุ่ม" เลือกผู้เล่นหนึ่งคนที่จุดเริ่มต้นและเน้นอย่างไม่ลดละตลอดช่วงที่เหลือของรอบ

นี่ไม่ใช่การอ้างอิงถึงรายการทีวีภาพเคลื่อนไหวที่มีชื่อคล้ายกัน

มันเป็นการรีเฟรชออนไลน์ EVE

ดาวน์โหลด tar ของไฟล์ที่จำเป็นทั้งหมด

การเปลี่ยนแปลง

  • วันเกิดv1
  • v2ไม่ได้เข้าสู่ระบบอะไรที่จะเพียงเพื่อstdout หากต้องการระงับให้เพิ่มที่ส่วนท้ายของไฟล์stderr
    stderr2>/dev/nullrun
/*  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ไลบรารีที่ฉันเขียนในไดเรกทอรีเดียวกัน

สิ่งเหล่านี้รวมอยู่ในการดาวน์โหลดพร้อมกับ Makefile และสคริปต์การเรียกใช้

ทำ

  • หยุดการออกเสียงลงคะแนนกับเป้าหมายเมื่อพวกเขาถูกฆ่าตายหรือถูกลงโทษ

ขณะที่ฉันอยู่ที่นี่ฉันจะส่งข้อมูลที่ไม่ใช่ ธ ปท. Steve:


FYI ผมเรียกหมากเก็บบนavatar, erebus, leviathanและragnarok
SIGSTACKFAULT

"นี่ไม่ใช่การอ้างอิงถึงรายการทีวีภาพเคลื่อนไหวที่มีชื่อคล้ายกัน" มันเป็นการอ้างอิงถึงภาพยนตร์หรือไม่
Stan Strum

@StrumStrum ไม่มันไม่ใช่
SIGSTACKFAULT

from_serverไฟล์บอทของฉันไม่ได้ถูกเขียนลงไป คุณต้องตั้งค่าการอนุญาตหรืออะไรบางอย่าง?
Rɪᴋᴇʀ

1
หมายเหตุสำหรับผู้ที่สงสัย: พระคัมภีร์ที่อ้างถึงที่นี่เป็นของAmarrจาก EVE Online มีเป็นวิวรณ์ 02:12ในพระคัมภีร์ไบเบิล แต่มันอ่านค่อนข้างแตกต่างกัน
DLosc

2

สัตว์ทะเลมหึมา

Leviathan วนซ้ำผู้เล่นทุกคนใน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);
}

เช่นเดียวกับ Avatar มันต้องการmafia.cและmafia.hอยู่ในไดเรกทอรีเดียวกัน

สิ่งเหล่านี้รวมอยู่ในการดาวน์โหลดพร้อมกับ Makefile และสคริปต์การเรียกใช้


:) เพิ่มผู้รอดชีวิตเมื่อทำเสร็จแล้ว
JavaScriptCoder
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.