Hãy chơi Mafia!


42

Mafia (còn được gọi là Người sói) là một trò chơi tiệc tùng có nội dung đại khái như thế này:

  • Trò chơi bắt đầu vào ngày 0. Sau mỗi ngày nđến một đêm n. Sau mỗi đêm nđến một ngày n+1. tức là D0, N0, D1, N1, D2, N2...
  • Vào rạng sáng ngày 0, một người dẫn chương trình bí mật chọn người chơi để thực hiện một số vai trò nhất định:  
    • Một số người chơi trở thành mafia. Mỗi đêm, mỗi mafioso chọn một người chơi. Vào buổi bình minh của ngày hôm sau, người chơi được chọn bởi hầu hết các mafiosos bị giết. Họ bị xóa vĩnh viễn khỏi trò chơi và vai trò của họ được tiết lộ công khai. Mafia phù hợp.  
    • Một số người chơi trở thành cảnh sát. Mỗi đêm, mỗi cảnh sát chọn một người chơi. Vào buổi sáng ngày hôm sau, cảnh sát nhận ra sự liên kết của người chơi. Làng phù hợp.  
    • Một số người chơi trở thành bác sĩ. Mỗi đêm, mỗi bác sĩ chọn một người chơi. Nếu người chơi này là cùng một người chơi mà mafia đã chọn để giết, thì hành động của mafia cho đêm đó sẽ bị hủy bỏ. Làng phù hợp.  
    • Tất cả những người chơi không được chọn cho vai trò khác là dân làng. Dân làng không có khả năng mà cả thị trấn không chia sẻ. Làng phù hợp.
  • Mỗi ngày trừ ngày 0, toàn bộ thị trấn (nghĩa là tất cả người chơi còn sống) bỏ phiếu cho một người chơi. Vào cuối ngày, người chơi đó bị xóa khỏi trò chơi và vai trò của họ được tiết lộ. (Vào ngày 0, mọi người chỉ ớn lạnh cho đến khi màn đêm buông xuống.)
  • Nếu, tại bất kỳ thời điểm nào, không có mafiosos còn lại, trò chơi kết thúc với tất cả người chơi liên kết làng chiến thắng (bao gồm cả người chết).
  • Nếu, tại bất kỳ thời điểm nào, những người chơi liên kết làng không vượt trội so với những người chơi liên kết với mafia, trò chơi kết thúc với tất cả những người chơi phù hợp với mafia chiến thắng (bao gồm cả người chết).

Đối với thử thách này, mục tiêu của bạn là viết một bot để đánh bại các bot khác tại Mafia!

Làm thế nào để làm cho một bot làm việc

Tất cả bạn phải cung cấp cho tôi là một tập tin được gọi là run. Bên trong cấu trúc thư mục nơi thử thách này sẽ diễn ra, bot của bạn sẽ sống ở đây:

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/

Các runtập tin, khi được thực thi, sẽ làm cho bot của bạn làm điều đó. Điều quan trọng cần lưu ý là tệp này không được yêu cầu bất kỳ đối số dòng lệnh hoặc bất cứ điều gì. Nó sẽ được chạy chính xác như ./run. Nếu bạn cần được thực hiện theo một cách khác, bạn sẽ phải làm việc xung quanh nó bằng cách làm một cái gì đó như thế này:

real_bot.py

#!/bin/python2

# code goes here

run

#!/bin/bash

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

Một điều quan trọng cần lưu ý là tất cả đầu vào mà bot của bạn nhận được sẽ được tìm thấy trong tệp from_servervà chương trình kiểm soát sẽ tìm kiếm đầu ra của bot của bạn to_server. Tôi đã chọn làm theo cách này để bất kỳ ngôn ngữ nào có thể thực hiện tệp I / O đều có thể tham gia. Nếu ngôn ngữ của bạn giúp làm việc với stdin và stdout dễ dàng hơn so với tệp I / O, bạn có thể muốn viết một runtệp trông như thế này:

#!/bin/bash

./real_bot.py < from_server > to_server

Điều này sẽ làm cho nó để stdin xuất phát từ from_servertệp và thiết bị xuất chuẩn trực tiếp đến to_server.

Bot của bạn sẽ không chạy trong suốt thời gian của trò chơi. Thay vào đó, nó sẽ được chạy khi cần đưa ra quyết định. Tương tự như vậy, nó sẽ không được thông báo khi nó chết, nó sẽ không được chạy nữa. Lập kế hoạch cho điều này bằng cách lưu bất cứ điều gì bạn muốn ghi nhớ vào một tập tin và đọc nó sau. Bạn có thể tạo, ghi hoặc đọc từ bất kỳ tệp nào trong thư mục bot của bạn, nhưng bạn không thể viết hoặc đọc bất cứ nơi nào bên ngoài thư mục đó, bao gồm cả truy cập mạng hoặc bất cứ điều gì . Nếu bot của bạn biết bất cứ điều gì mà nó không được nói từ trong thư mục hoặc nếu nó chạm vào bất cứ thứ gì không có trong thư mục đó, thì bot của bạn sẽ bị loại.

Làm thế nào để tạo một bot chức năng

ngày

Khi bắt đầu trò chơi, tập tin playerssẽ được lấp đầy với một danh sách giới hạn dòng mới của tất cả người chơi trong trò chơi. Nó sẽ không được cập nhật khi người chơi rời khỏi trò chơi.

Vào buổi bình minh của ngày 0, tất cả người chơi sẽ tìm thấy thông báo này trong from_servertệp của họ :

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

Nếu bạn là cảnh sát, dòng You are the copđược nối đến cuối. Các bác thấy You are the doctor. Mafia nhìn thấy You are a member of the mafia.\nYour allies are:và một danh sách giới hạn các thành viên mafia, ngoại trừ người chơi đang đọc tin nhắn.

Vào buổi bình minh của tất cả các ngày khác, thông báo này sẽ xuất hiện:

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được thay thế bằng số trong ngày. victimđược thay thế bằng tên của nạn nhân đêm qua và victim_rolelà một trong:

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

cop_targetlà tên của người chơi mà cảnh sát điều tra tối qua, và target_alignmentvillagehoặc mafia. Cuối cùng, remaining_playerslà danh sách những người chơi vẫn còn sống ở định dạng này:player1, player2, player3

Dòng thứ hai được bỏ qua nếu không có lệnh giết tối qua và dòng thứ ba chỉ được hiển thị cho cảnh sát.

Ví dụ,

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

Một khi tin nhắn này được đưa ra, ngày bắt đầu! Mỗi bot có thể thực hiện 50 hành động trong suốt cả ngày, trong đó một "hành động" đang bỏ phiếu cho người chơi hoặc nói to điều gì đó.

Để bình chọn cho một người chơi, viết vote player_namevào to_servertập tin của bạn và chấm dứt. Để bình chọn để không giết ai, hãy viết vote no one. Khi bạn bỏ phiếu, tất cả người chơi (bao gồm cả bạn) sẽ thấy your_bot votes to kill your_selection. Phiếu bầu được bỏ qua vào ngày 0.

Một số tin nhắn được xác định trước có thể được gửi đến tất cả người chơi. Id của mỗi tin nhắn có thể được liệt kê ở đây:

 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?

Tất cả những tin nhắn này ngoại trừ năm tin nhắn đầu tiên đều đề cập đến một người chơi cụ thể. Để nói một trong những tin nhắn đó, hãy viết say message_id player_name. Đối với một trong năm tin nhắn đầu tiên, chỉ cần viết say message_id. Bạn có thể thêm một đối số thứ ba tùy chọn cho cả hai đối số này, chỉ định tên của người chơi bạn đang nói chuyện (tất cả người chơi vẫn có thể đọc nó, nhưng họ sẽ biết ai là người nhận dự định).

Khi bot của bạn nói một tin nhắn, tất cả người chơi đọc your_bot says "message", messagetin nhắn được liên kết với id bạn đã viết ở đâu. Nếu tin nhắn bao gồm một chủ đề, một ký tự khoảng trắng và chủ đề được chèn trực tiếp sau khi kết thúc tin nhắn. Nếu nó bao gồm một người nhận, tên của họ, một dấu hai chấm và một ký tự khoảng trắng được chèn ngay trước tin nhắn.

Vào cuối ngày, tất cả người chơi còn sống được chạy lần cuối để xem kết quả bỏ phiếu. Nếu một người chơi đã được bỏ phiếu, điều này được viết:

The town has killed player_name!
They were a villager

... hoặc a mafioso, hoặc the cop, hoặc the doctor.

Nếu không có người chơi nào được bỏ phiếu, điều này được viết thay thế:

The town opted to lynch no one today.

Khi bộ điều khiển gửi những tin nhắn này, nó sẽ bỏ qua mọi phản hồi từ người chơi. Ngày kết thúc.

Đêm

Vào ban đêm, mọi người trừ dân làng được sử dụng quyền lực của họ.

Xã hội đen:

Bạn sẽ đọc It is night. Vote for a victim.. Khi điều này xảy ra, hãy xuất tên của người chơi bạn muốn giết.

Sao chép:

Bạn sẽ đọc It is night. Who would you like to investigate?. Khi điều này xảy ra, hãy xuất tên của người chơi bạn muốn kiểm tra.

Bác sĩ:

Bạn sẽ đọc It is night. Who would you like to save?. Khi điều này xảy ra, hãy xuất tên của người chơi bạn muốn bảo vệ.

Sau này, ngày hôm sau bắt đầu như bình thường.

Bạn có thể tự cứu mình một lần mỗi trò chơi.

Thông tin chung

  • Trò chơi sẽ không chạy nếu không có 6 người chơi trở lên.
  • Một phần ba số người chơi, làm tròn xuống, sẽ là mafia. Một người chơi sẽ là bác sĩ, và một người chơi sẽ là cảnh sát. Tất cả những người chơi khác là dân làng.
  • Các mối quan hệ trong cuộc bỏ phiếu của làng hoặc phiếu bầu qua đêm của mafia được giải quyết ngẫu nhiên.
  • Tên bot phải là chữ và số + dấu gạch ngang và dấu gạch dưới.
  • Nghiêm cấm sử dụng kiến ​​thức về mã của đối thủ trực tiếp. Về lý thuyết, tôi sẽ có thể đưa bot của bạn chống lại các bot mà bạn chưa từng thấy trước đây và nó có hiệu suất tương đương.
  • Đáng tiếc, nếu tôi không thể chạy chương trình của bạn bằng phần mềm miễn phí (như bia), tôi sẽ phải loại bỏ nó.
  • Tôi bảo lưu quyền không đủ tiêu chuẩn nếu tôi cho rằng đó là độc hại. Điều này bao gồm, nhưng không giới hạn trong việc sử dụng quá nhiều thời gian, bộ nhớ hoặc không gian để chạy. Tôi đã cố tình để giới hạn mềm, nhưng hãy nhớ rằng: Tôi đang chạy cái này trên máy tính ở nhà của tôi chứ không phải siêu máy tính và tôi không muốn nhận kết quả trong một năm. Tôi không mong đợi phải sử dụng cái này, vì tiêu chuẩn của tôi khá thấp. Về cơ bản, đây là "nếu tôi nghĩ bạn là một kẻ tinh ranh có chủ đích" và nếu bạn có thể thuyết phục tôi thì tôi sẽ đảo ngược quyết định của mình.

Chấm điểm

Mỗi vòng, 100 trò chơi sẽ được chạy (điều này có thể tăng lên khi nhiều bot tham gia để giữ kích thước mẫu đủ lớn, nhưng theo lý thuyết sẽ không ảnh hưởng đến bất cứ điều gì). Tôi sẽ ghi lại số lần mỗi bot chiến thắng như một dân làng so với số lần nó chơi như một dân làng, và tương tự cho mafia. Một bot villager_rationumber of games won as villager / number of games played as villager, và mafia_ratiolà như nhau nhưng s/villager/mafia/g. Điểm số của bot là (villager_ratio - mean villager_ratio) + (mafia_ratio - mean mafia_ratio).

Ví dụ bot

Randy the Robot không phải là một người chơi mafia giỏi. Randy bỏ qua khá nhiều thứ, chọn ngẫu nhiên những gì cần nói, bầu chọn cho ai và nhắm mục tiêu với sức mạnh ban đêm.

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

Bộ điều khiển

@undergroundmonorail đã viết một chương trình kiểm soát cho thử thách này, có sẵn ở đây .

Bạn có một tháng để viết mã và trả lời, tôi sẽ đưa bot chiến thắng (công cụ phá vỡ tỷ lệ thắng cao nhất là phiếu bầu) ít nhất là 50 tiền thưởng danh tiếng (tùy thuộc vào số tiền tôi có thể kiếm được trong một tháng)


Đây là tập lệnh bao bọc, được tạo bởi @Blacksilver, để sử dụng với các ngôn ngữ được biên dịch:

#!/bin/bash

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

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

Đặt điều này trong run.


Bài viết này được viết bởi @undergroundmonorail (Tôi đã thực hiện một vài chỉnh sửa).

Ông đã đưa nó lên đây cho bất cứ ai muốn hoàn thành và đăng nó.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Martin Ender

Câu trả lời:


3

Zulu

run

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

$self = basename(__DIR__);

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

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

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

Không phải tất cả mọi thứ tôi hy vọng nó sẽ được. Tôi có thể cuối cùng điều chỉnh nó đôi khi.

Cách thức hoạt động v1.0

Theo dõi số ngày, người còn sống, người đã chết, ai là mafia, người phù hợp với làng xã, vai trò, phiếu bầu / tin nhắn hiện tại và tổng số phiếu / tin nhắn.

  1. Đêm

    a. Mafia - Bầu chọn cho bất kỳ dân làng nào đã bỏ phiếu chống lại mafia (ngẫu nhiên) nếu có thể, nếu không thì là một dân làng ngẫu nhiên.

    b. Cop - Điều tra bất cứ ai có liên kết không xác định.

    c. Bác sĩ - Lưu bản thân lần đầu tiên, sau đó lưu cảnh sát nếu biết (tôi không nghĩ nó có thể biết điều này ngay bây giờ), lưu dân làng nếu biết (có lẽ cũng không biết điều này), nếu không thì cứu người ngẫu nhiên.

  2. ngày

    a. Nếu bất cứ ai đã nói một tin nhắn trực tiếp với chính mình, hãy trả lời họ (có thể trả lời hạn chế).

    b. Mafia - Bầu chọn cho dân làng có nhiều phiếu bầu nhất.

    c. Dân làng với bất kỳ Mafia còn sống nào được biết đến - bỏ phiếu cho mafioso.

    Cười mở miệng. Dân làng chỉ biết đến Mafia phù hợp với cái chết - bỏ phiếu cho một bot ngẫu nhiên chưa bao giờ bỏ phiếu cho mafioso.

    e. Dân làng với Cop đã biết - bỏ phiếu cho bot ngẫu nhiên mà cảnh sát đã bỏ phiếu.

    đụ. Dân làng với ngôi làng đã chết được biết đến - bỏ phiếu cho một bot ngẫu nhiên đã bỏ phiếu cho người chết.

    g. Dân làng có phiếu chống lại việc tự bỏ phiếu cho bot không liên kết với làng hiện đang được bầu chọn cao nhất.


1
Đợi đã, cái này làm gì?
SIGSTACKFAULT

1
Tại sao, nó chơi mafia, tất nhiên! :)
Jo.

Ý tôi là chiến lược.
SIGSTACKFAULT

6

Mã ví dụ không hoạt động với tôi, tôi sử dụng Python 3, vì vậy tôi đã thay đổi main.pytệp để làm cho nó hoạt động.

Vì vậy, đây là phiên bản cố định của tôi cho Python 3, tôi chưa bao giờ lập trình bằng Python trước đây nên có thể đó là một mã khủng khiếp nhưng nó hoạt động :)

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

Một vài điều tôi học được khi tôi thực hiện tác phẩm này (và nó không rõ ràng đối với tôi trong phần mô tả)

  • printkhông làm gì với trò chơi, nó giống như console.logtrong js
  • input() chặn chương trình đang chạy, nó có thể tốt cho từng bước gỡ lỗi
  • from_serverto_serverbị xóa mỗi vòng.
  • Không thể dừng kịch bản với Ctrl+Csự kết hợp, điều này gây khó chịu.

Chào mừng đến với PPCG! Bài đăng đầu tiên tuyệt vời! Hy vọng bạn dính xung quanh! Tôi đã chỉnh sửa bài đăng của bạn để làm nổi bật cú pháp hoạt động và vì mục đích nhất quán được thêm vào run.sh.
Rɪᴋᴇʀ

1
Cảm ơn bạn! Tôi không chắc chắn < from_server > to_serverlà cần thiết bởi vì tôi tên mã cứng trong mã. công cụ trò chơi chỉ cần gọi ./runmà không có đường ống. vì vậy input()print()không hoạt động với trò chơi. mayn.pydòng 57:os.system('./run')
Peter

2
Làm thế nào bạn có được bộ điều khiển để chạy? Tôi không thể tìm ra nó. Bạn có thể cung cấp một lời mời mẫu?
Rɪᴋᴇʀ

Lưu ý: Bản gốc randy.pyđược viết bằng Python 2 , gây ra sự cố.
SIGSTACKFAULT

đối với bộ điều khiển bạn cần ./starttừ thư mục gốc hoặc bạn cần phiên bản python 3 củamain.py
Peter

5

Nhà báo

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

Fancy, một bó mã trăn dài mà tôi sẽ không giải thích (mặc dù nó không được đánh gôn), ngoài việc nó giữ danh sách "bạn bè" và "kẻ thù" ban đầu được đưa vào dựa trên cơ hội và / hoặc điều tra cảnh sát . Cảnh báo: không nói dối trong sự hiện diện của logic.


run.shtiêu chuẩn của bạn (thực hiện một số thử nghiệm)
Stan Strum

Không, run.sh của tôi hoàn toàn có thể là "run.py" mà không có đường ống đầu vào và đầu ra thông thường, nhưng tiêu chuẩn sẽ hoạt động.
pppery

1
Điều này trông rất giống với những gì tôi đã viết, đã cho tôi thời gian và thiên hướng.
Draco18

Vì một số lý do, tôi nghĩ rằng nhà logic học sẽ không làm tốt như vậy xung quanh các bot khác ... không ai trong số các bot khác báo cáo điều tra cảnh sát
JavaScriptCoder

1
... Và tôi nhận ra, nhiều tháng sau, câu trả lời của tôi cho rằng không đúng chỉ có một cảnh sát / bác sĩ.
pppery

4

Người sống sót (v 1.0)

Tóm tắc

Survivalist chỉ đơn giản là sống sót tàn nhẫn trong trò chơi bằng cách mắng mỏ bất cứ ai dám buộc tội anh ta, bất kể anh ta có phải là mafia hay không.

Logic VCL

Nếu bạn sống sót đến cuối trò chơi, bạn sẽ chiến thắng bất kể điều gì. Do đó, bạn tồn tại bằng mọi giá.

Backstory

Quân đội diễu hành qua khu rừng tối tăm, ẩm ướt.

"Trung úy, chúng ta đang diễu hành ở đâu?" Người tuyển dụng trẻ dường như đã không làm cứng mình với sự tàn bạo, chỉ huy nghĩ. Ồ tốt Anh ta trả lời với một câu "để tiêu diệt kẻ thù".

Tại làng, chỉ huy địch đã uống và cười cùng với các sĩ quan khác trong câu lạc bộ khi một trinh sát xông vào với tin tức. "Có một cột, dài hàng trăm thước, diễu hành qua rừng Ngọc Lâm cho chúng tôi! Hãy tập hợp quân đội!"

Chỉ huy của kẻ thù, rõ ràng là bị say nắng, bất ngờ nói: "Tôi không có báo cáo từ các trinh sát khác." Người trinh sát (sau này sống sót) nghĩ, sau đó tôi sẽ phải tự mình tập hợp quân đội . Sau khi kể câu chuyện cho các trinh sát viên, họ quay lại với nhau, tất cả nói rằng họ đã nhìn thấy quân địch. Chỉ huy vẫn không tin, nói: "Tôi đang ra lệnh cho bạn ngừng trinh sát. Không quân địch".

Các trinh sát quyết định lấy vũ khí của họ để cứu cộng đồng. Họ đã xoay sở để đến được vị trí của mình ngay khi kẻ thù đến làng có hiệu lực. "SẠC ĐIỆN!" chỉ huy của cuộc phục kích. "TRỞ LẠI NHÀ Ở! TRỞ LẠI NHÀ! GIẾT MỌI NGƯỜI, BAO GỒM PHỤ NỮ VÀ TRẺ EM! "

Các trinh sát đã cứu toàn bộ quân đội của họ. Họ mong đợi sự thăng tiến, giải thưởng và huy chương. Thay vào đó, họ đã nhận được một tòa án quân sự nghiêm khắc để nổi loạn, kết án, 10 năm tù, bị trục xuất khỏi quân đội và lưu đày.


Có một người già ở hội đồng thành phố Salem, Massachusetts. Truyền thuyết kể rằng ông thành lập thị trấn. Khi bạn gặp anh ta trong ngôi nhà biệt lập ngoài rừng, đừng để ánh mắt lấp lánh khiến bạn nghĩ rằng anh ta bình yên. Nếu bạn buộc tội anh ta, anh ta sẽ hủy hoại bạn trước thị trấn.

Cựu chiến binh cười trong bóng tối. Sợ bóng tối, không đời nào. Sợ quái vật dưới gầm giường? Người đàn ông với tay bóp cò súng cười lo lắng. Anh không sợ bất cứ điều gì, anh đã tự nói với mình. Chắc chắn, anh ta là một anh hùng thời chiến tranh trong quá khứ, nhưng anh ta đã quá quen với việc phục kích và các tình huống đe dọa đến tính mạng đến nỗi nó khiến người đàn ông đơn giản bị thần kinh. Ngón tay cò súng của anh co giật ở những cái bóng đơn giản; nhịp tim anh đập nhanh theo từng âm thanh nhỏ. Phải, anh sợ cái chết này. Làm thế nào anh có thể không, nhìn thấy rất nhiều người chết theo những cách khủng khiếp? Tất cả những gì anh biết từ việc bị bắt cóc và thoát khỏi kẻ thù một cách kỳ diệu là không có lòng thương xót.

Cựu chiến binh


Mã (Tôi là một tân binh trong python, không chắc mã đó có tốt không)

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

Ý bạn là orthay vì ||? Bạn đã kiểm tra nó? Ngoài ra, có lẽ bạn nên chỉ ra rằng đó là Python 2.
Solomon Ucko

3

hình đại diện

Avatar "ngẫu nhiên" chọn một người chơi khi bắt đầu và không ngừng tập trung họ cho phần còn lại của vòng.

Đây không phải là một tham chiếu đến một chương trình truyền hình hoạt hình có tên tương tự.

Đó là một sự kết hợp trực tuyến EVE.

Tải về tar của tất cả các tập tin cần thiết

Thay đổi

  • Sinh nhật v1
  • v2 Không đăng nhập bất cứ thứ gì stdout, chỉ để stderr.
    Để triệt tiêu stderrquá, thêm 2>/dev/nullvào cuối runtập tin.
/*  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);
    }
}

Nó yêu cầu mafia.cmafia.h, các thư viện tôi đã viết, trong cùng một thư mục.

Chúng được bao gồm trong phần tải xuống, cùng với Makefile và tập lệnh chạy.

LÀM

  • Dừng bỏ phiếu chống lại mục tiêu khi chúng bị giết hoặc bị nới lỏng.

Khi tôi ở đây, tôi sẽ gửi phi bot, Steve:


FYI, tôi gọi trò chơi trẻ con trên avatar, erebus, leviathan, vàragnarok
SIGSTACKFAULT

"Đây không phải là một tham chiếu đến một chương trình truyền hình hoạt hình có tên tương tự." nó có phải là một tài liệu tham khảo cho bộ phim?
Stan Strum

@StanStrum không, không phải vậy.
SIGSTACKFAULT

from_serverTập tin bot của tôi không được ghi vào. Bạn đã phải thiết lập quyền cụ thể hoặc một cái gì đó?
Rɪᴋᴇʀ

1
Lưu ý cho người tò mò: Kinh thánh được tham chiếu ở đây là của Amarr từ EVE Online. Có một Khải huyền 02:12 trong Kinh Thánh, nhưng nó đọc khá khác nhau.
DLosc

2

Leviathan

Leviathan lặp lại tất cả những người chơi trong playerstập tin và nhắm mục tiêu từng người một.

Tải xuống

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

Như với Avatar, Nó yêu cầu mafia.cmafia.htrong cùng một thư mục.

Chúng được bao gồm trong phần tải xuống, cùng với Makefile và tập lệnh chạy.


:) thêm người sống sót sau khi tôi hoàn thành nó
JavaScriptCoder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.