summaryrefslogtreecommitdiff
path: root/referee/referee.cpp
blob: 78c4193e3ca94bfd4bb0db628b502987474ad810 (plain)
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
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <sstream>
#include <string>
#include <cassert>
#include "../board.h"


struct MoveLine {
	int pindex;
	string line;
};

MoveLine readMoveLine() {
	while (true) {
		if (!isspace(cin.peek())) break;
		cin.get();
	}

	MoveLine ml;
	cin >> ml.pindex;
	if (!cin) exit(0);

	assert(cin.get() == ' ');
	getline(cin, ml.line);

	return ml;
}

int8_t playerToClr(int player) {
	return 2 * player - 1;
}

int main() {
	Board bd = Board::makeInitial();

	int nplayers;
	cin >> nplayers;
	assert(nplayers == 2);
	cin.ignore(1000, '\n');

	string p1, p2;
	getline(cin, p1);
	getline(cin, p2);

	int onturn = 0;

	while (true) {
		MoveLine ml = readMoveLine();
		if (ml.pindex != onturn) {
			cout << "invalid" << endl;
			continue;
		}

		optional<Move> mv = Move::parse(ml.line);

		if (mv && !bd.isValid(*mv, playerToClr(onturn))) {
			cout << "invalid" << endl;
			continue;
		}

		int win = bd.applyCW(*mv);

		if (win != 0) {
			cout << "valid end" << endl;
			if (win == -1) cout << "3 1" << endl;
			else if (win == 1) cout << "1 3" << endl;
			break;
		} else {
			cout << "valid" << endl;
		}

		onturn = !onturn;
	}
}