#include #include #include #include "board.h" #include "ai_mc.h" #include "ai_mm.h" #include "ai_rand.h" using namespace std; static void skipLine(istream &stream) { while (stream.get() != '\n'); } static Move findMove(const Board &bd, int player) { clock_t start = clock(); Move mv = AI::MC::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); 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; 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; }