bool findMove(board b, move &bestMove, int wtime, int btime, int movestogo) { if (queryBook(b, bestMove)) { clock_t start = clock(); while (clock() < start + CLOCKS_PER_SEC/10); return true; } clock_t deadline = 0; clock_t hardline = 0; if (b.getToMove()) { if (btime != 0) { int target = btime/(movestogo+MOVE_LEAWAY) - OVERHEAD; deadline = (CLOCKS_PER_SEC/1000)*target + clock(); hardline = (CLOCKS_PER_SEC/1000)*HARDLINE_FACTOR*target+clock(); } } else { if (wtime != 0) { int target = wtime/(movestogo+MOVE_LEAWAY) - OVERHEAD; deadline = (CLOCKS_PER_SEC/1000)*target + clock(); hardline = (CLOCKS_PER_SEC/1000)*HARDLINE_FACTOR*target+clock(); } } if (deadline != 0) return calcMoveID(b, bestMove, deadline, hardline); else return calcMove(b, bestMove); }
int minimax(int depth, board b, int alpha, int beta, int movesDone) { lookupResult res; bool haveHit = queryTable(b, res); if (haveHit && depth <= res.depth) { if (res.type == SCORE_LOWERBOUND) { if (res.evaluation >= beta) return -res.evaluation; else alpha = max(alpha, res.evaluation); } if (res.type == SCORE_UPPERBOUND) { if (res.evaluation <= alpha) return -res.evaluation; else beta = min(beta, res.evaluation); } if (res.type == SCORE_EXACT) return -res.evaluation; } //if (depth == 0) // return quiesence(b, alpha, beta, false); if (depth == 0) return -b.eval(); if (inHistory(b)) return 0; moveOrderer order(b); vector<move> moves = b.genMoves(); sort(moves.begin(), moves.end(), order); if (moves.size() == 0) { if (b.inCheck().first && !b.getToMove()) return MATESCORE(movesDone); if (b.inCheck().second && b.getToMove()) return MATESCORE(movesDone); return 0; } if (b.getPlyClock() >= 100) return 0; int bestSoFar = -MATESCORE_MAX; if (haveHit) { board temp = b; temp.executeMove(res.bestMove); pushHistory(temp); bestSoFar = minimax(depth-1, temp, -beta, -alpha, movesDone+1); popHistory(); } int besti = -1; for (int i=0; i<moves.size() && bestSoFar < beta; i++) { if (haveHit && moves[i] == res.bestMove) continue; board temp = b; temp.executeMove(moves[i]); pushHistory(temp); int curScore = minimax(depth-1, temp, -beta, -max(alpha, bestSoFar), movesDone+1); popHistory(); if (curScore > bestSoFar) { bestSoFar = curScore; besti = i; } } if (besti == -1 && haveHit) putTable(b, depth, bestSoFar, res.bestMove, alpha, beta); else putTable(b, depth, bestSoFar, moves[besti], alpha, beta); return -bestSoFar; }