Result KarOukBoard::result() { Side side = sideToMove(); if (!inCheck(side)) return OukBoard::result(); Side opp = side.opposite(); QString str = tr("%1 wins by giving check").arg(opp.toString()); return Result(Result::Win, opp, str); }
Result HordeBoard::result() { Side side = sideToMove(); Side opp = side.opposite(); if (!hasMaterial(side)) return Result(Result::Win, opp, tr("%1 wins").arg(opp.toString())); return StandardBoard::result(); }
bool OukBoard::inCheck(Side side, int square) const { int sign = (side == Side::White) ? 1 : -1; Side opSide = side.opposite(); if (square == 0) square = kingSquare(side); // Attack by Advisor (Maiden, Neang), initial move if (!m_moveCount[opSide][Maiden] && m_initialSquare[opSide][Maiden] == square - 2 * sign * (width() + 2)) return true; // Attack by King, initial move int ksq = kingSquare(opSide); bool attacked = (ksq == square - 8 * sign || ksq == square - 12 * sign); if (!m_moveCount[opSide][King] && attacked) { if (square == kingSquare(side) || !inCheck(opSide)) return true; } return MakrukBoard::inCheck(side, square); }