1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#pragma once
#include <vector>
#include <string>
#include <string_view>
#include <optional>
#include <utility>
#include "process.h"
using namespace std;
class Referee {
Process proc;
bool isEnd = false;
vector<int> scores;
bool featureWriteLines = false;
vector<pair<int, string>> writeLinesList;
optional<string> readLine();
void readScores();
public:
Referee(const string_view execname, const vector<string> &players);
~Referee();
// player: 0 = first player, 1 = second player
bool moveValid(int player, const string_view line);
vector<pair<int, string>> playerWriteLines();
bool gameEnded();
optional<vector<int>> getScores();
// Kills the referee process
void terminate();
};
/*
Referee protocol:
At startup, the referee receives a line containing the number of players in the
game, followed by that number of lines containing the players' names.
Then, it repeatedly receives a line on stdin of the form '<player> <line>',
where <player> is the index of the player in the game (0 is first, 1 is second,
etc.) and <line> is the line as written out by the player. The referee should
then write a line to stdout that is equal to either 'valid', 'invalid', or
'valid end'. 'valid' and 'invalid' indicate a valid and invalid move, while
'valid end' indicates a valid move that ends the game. After writing the line
'valid end', the referee should write a line containing as many integers
(separated by spaces) as there are players, giving their scores at the end of
the game.
FEATURES
At any time the referee may write 'feature <name>' to stdout, which enables the
protocol feature with the given name. The following features are supported:
- 'write_lines': After a move validity judgement, the referee should write lines
of the form '<player> <line>' to stdout, where <player> is the index of the
player on whose stdin to write <line>. The referee should signal the end of
this list by writing a line 'write_end' to stdout.
This allows the referee to write additional data to players' inputs after they
have written their moves.
*/
|