#include #include #include #include #include #include #include "board.h" #include AI_HEADER #include "ui.h" using namespace std; #define STR_(x) #x #define STR(x) STR_(x) #ifndef AI #define AI MC #endif static uint8_t readPlace(Board &bd) { string line; getline(cin, line); if (line.size() >= 1 && tolower(line[0]) == 'q') { exit(0); } else if (line.size() >= 6 && memcmp(line.data(), "place ", 6) == 0) { istringstream ss(line.substr(6)); int x, y, clr; ss >> x >> y >> clr; return bd.putCW(BSZ * (y + BMID) + x + BMID, clr); } else { cerr << "Expected place line, got '" << line << "'" << endl; exit(1); } } static void protocolIO() { Board bd = Board::makeEmpty(); readPlace(bd); string line; char c = cin.peek(); uint8_t myclr; if (c == 's' || c == 'S') { myclr = 1; getline(cin, line); } else if (c == 'q' || c == 'Q') { return; } else { myclr = 2; } uint8_t onturn = 1; while (true) { if (onturn == myclr) { int idx = AI::calcMove(bd, onturn); int x = idx % BSZ - BMID, y = idx / BSZ - BMID; cout << x << ' ' << y << endl; readPlace(bd); } else { readPlace(bd); } onturn = NEXTTURN(onturn); } } int main() { struct timeval tv; gettimeofday(&tv, nullptr); srandom(tv.tv_sec * 1000000U + tv.tv_usec); cerr << "Using AI " << STR(AI) << endl; if (!isatty(STDOUT_FILENO)) { protocolIO(); return 0; } Board bd = Board::makeEmpty(); // cerr << "Initial stone at " << Idx(BSZ * BMID + BMID) << endl; bd.put(BSZ * BMID + BMID, bd.bag.drawRandom()); cout << bd << endl; uint8_t win = 0; uint8_t onturn = 1; while (bd.bag.totalLeft() > 0) { cout << "--- NEXT TURN: " << Stone(onturn) << " ---" << endl; int idx; if (onturn == 1) { cout << "YOUR TURN." << endl; idx = UI::getMove(bd); } else { idx = AI::calcMove(bd, onturn); } uint8_t clr = bd.bag.drawRandom(); win = bd.putCW(idx, clr); cout << bd << endl; if (win != 0) break; onturn = NEXTTURN(onturn); } if (win == 0) { cout << "TIE" << endl; } else { cout << "Winner: " << Stone(win) << endl; } }