diff options
Diffstat (limited to 'referee/referee.cpp')
-rw-r--r-- | referee/referee.cpp | 88 |
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); + } +} |