#include #include #include #include "board.h" #include "ai_mc.h" #include "ai_mm.h" #include "ai_mcts.h" #include "ai_rand.h" using namespace std; #ifndef AI_CHOICE #define AI_CHOICE MCTS #endif #define STR_(x) #x #define STR(x) STR_(x) #define AI_CHOICE_STR STR(AI_CHOICE) static void skipLine(istream &stream) { while (stream.get() != '\n'); } static Move findMove(const Board &bd, int player) { clock_t start = clock(); Move mv = AI:: AI_CHOICE ::findMove(bd, player); clock_t diff = clock() - start; cerr << "Time taken: " << (double)diff / CLOCKS_PER_SEC << " seconds" << endl; return mv; } int main() { struct timeval tv; gettimeofday(&tv, nullptr); srand(tv.tv_sec * 1000000UL + tv.tv_usec); cerr << "Using AI: " << AI_CHOICE_STR << endl; Board bd = Board::makeInitial(); // cerr << bd << endl; int onturn = -1; char c = cin.peek(); if (c == 's' || c == 'S') { skipLine(cin); Move mv = findMove(bd, onturn); assert(bd.isValid(mv, onturn)); cout << mv << endl; bd.apply(mv); onturn = -onturn; } int win = 0; string line; while (true) { cerr << endl << bd << endl; getline(cin, line); if (!cin || line[0] == 'q' || line[0] == 'Q') break; Move mv; if (auto omv = Move::parse(line)) { mv = *omv; } else { cerr << "Unreadable move" << endl; break; } if (!bd.isValid(mv, onturn)) { cerr << "Invalid move read" << endl; break; } win = bd.applyCW(mv); onturn = -onturn; if (win != 0) break; cerr << endl << bd << endl; mv = findMove(bd, onturn); assert(bd.isValid(mv, onturn)); cout << mv << endl; win = bd.applyCW(mv); onturn = -onturn; if (win != 0) break; } cerr << bd << endl; if (win == 1) cerr << "White won" << endl; else if (win == -1) cerr << "Black won" << endl; }