Result LosersBoard::result() { Side winner; QString str; // Checkmate/Stalemate if (!canMove()) { winner = sideToMove(); str = tr("%1 gets mated").arg(winner.toString()); return Result(Result::Win, winner, str); } // Lost all pieces int pieceCount = 0; for (int i = 0; i < arraySize(); i++) { if (pieceAt(i).side() == sideToMove() && ++pieceCount > 1) break; } if (pieceCount <= 1) { winner = sideToMove(); str = tr("%1 lost all pieces").arg(winner.toString()); return Result(Result::Win, winner, str); } // 50 move rule if (reversibleMoveCount() >= 100) { str = tr("Draw by fifty moves rule"); return Result(Result::Draw, Side::NoSide, str); } // 3-fold repetition if (repeatCount() >= 2) { str = tr("Draw by 3-fold repetition"); return Result(Result::Draw, Side::NoSide, str); } return Result(); }
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(); }