void GameAdjudicator::addEval(const Chess::Board* board, const MoveEvaluation& eval) { Chess::Side side = board->sideToMove().opposite(); // Tablebase adjudication if (m_tbEnabled) { m_result = board->tablebaseResult(); if (!m_result.isNone()) return; } // Moves forced by the user (eg. from opening book or played by user) if (eval.depth() <= 0) { m_drawScoreCount = 0; m_resignScoreCount[side] = 0; return; } // Draw adjudication if (m_drawMoveNum > 0) { if (qAbs(eval.score()) <= m_drawScore) m_drawScoreCount++; else m_drawScoreCount = 0; if (board->plyCount() / 2 >= m_drawMoveNum && m_drawScoreCount >= m_drawMoveCount * 2) { m_result = Chess::Result(Chess::Result::Adjudication, Chess::Side::NoSide); return; } } // Resign adjudication if (m_resignMoveCount > 0) { int& count = m_resignScoreCount[side]; if (eval.score() <= m_resignScore) count++; else count = 0; if (count >= m_resignMoveCount) m_result = Chess::Result(Chess::Result::Adjudication, side.opposite()); } }
static QString evalString(const MoveEvaluation& eval) { if (eval.isBookEval()) return "book"; if (eval.isEmpty()) return QString(); QString str; if (eval.depth() > 0) { int score = eval.score(); int absScore = qAbs(score); if (score > 0) str += "+"; // Detect mate-in-n scores if (absScore > 9900 && (absScore = 1000 - (absScore % 1000)) < 100) { if (score < 0) str += "-"; str += "M" + QString::number(absScore); } else str += QString::number(double(score) / 100.0, 'f', 2); str += "/" + QString::number(eval.depth()) + " "; } int t = eval.time(); if (t == 0) return str + "0s"; int precision = 0; if (t < 100) precision = 3; else if (t < 1000) precision = 2; else if (t < 10000) precision = 1; str += QString::number(double(t / 1000.0), 'f', precision) + 's'; return str; }