summaryrefslogtreecommitdiff
path: root/referee/referee.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'referee/referee.cpp')
-rw-r--r--referee/referee.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/referee/referee.cpp b/referee/referee.cpp
new file mode 100644
index 0000000..f3a2b5d
--- /dev/null
+++ b/referee/referee.cpp
@@ -0,0 +1,88 @@
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+#include <cstdlib>
+#include <cassert>
+#include <sys/time.h>
+#include "../board.h"
+
+using namespace std;
+
+
+int main() {
+ struct timeval tv;
+ gettimeofday(&tv, nullptr);
+ srandom(tv.tv_sec * 1000000U + tv.tv_usec);
+
+ string line;
+ getline(cin, line);
+ int nplayers = stoi(line);
+ assert(nplayers == NC);
+
+ vector<string> players(NC);
+ for (int i = 0; i < NC; i++) {
+ getline(cin, players[i]);
+ }
+
+ cout << "feature write_lines" << endl;
+
+ Board bd = Board::makeEmpty();
+ bd.put(BSZ * BMID + BMID, bd.bag.drawRandom());
+
+ uint8_t onturn = 1;
+
+ while (true) {
+ int pidx;
+ cin >> pidx;
+ if (!cin.good()) break;
+
+ assert(cin.get() == ' ');
+ getline(cin, line);
+
+ if ((unsigned)pidx != onturn) {
+ cout << "invalid\nwrite_end" << endl;
+ continue;
+ }
+
+ istringstream ss(line);
+ int x, y;
+ ss >> x >> y;
+ if (ss.fail()) {
+ cout << "invalid\nwrite_end" << endl;
+ continue;
+ }
+
+ x += BMID; y += BMID;
+ int idx = BSZ * y + x;
+ if (x <= 1 || x >= BSZ - 1 || y <= 1 || y >= BSZ - 1 ||
+ bd[idx] != 0 || !bd.checkEdge(idx)) {
+ cout << "invalid\nwrite_end" << endl;
+ continue;
+ }
+
+ uint8_t clr = bd.bag.drawRandom();
+ uint8_t win = bd.putCW(idx, clr);
+
+ if (win != 0 || (win == 0 && bd.bag.totalLeft() == 0)) {
+ cout << "valid end" << endl;
+ for (int i = 1; i <= NC; i++) {
+ if (i != 1) cout << ' ';
+ if ((unsigned)i == win) cout << 3;
+ else cout << 1;
+ }
+ cout << endl;
+ cout << "write_end" << endl;
+ break;
+ }
+
+ for (int i = 1; i <= NC; i++) {
+ int x = idx % BSZ - BMID, y = idx / BSZ - BMID;
+ cout << i << " place " << x << ' ' << y << ' ' << (unsigned)clr << endl;
+ }
+
+ cout << "write_end" << endl;
+
+ onturn = NEXTTURN(onturn);
+ }
+}