QString CaparandomBoard::defaultFenString() const { const int empty = Piece::NoPiece; QVector<int> pieces(10); // Generate positions until we get one where all the pawns are // protected. This usually takes a handful of tries. do { pieces.fill(empty); if ((qrand() % 2) == 0) { addPiece(pieces, Queen, qrand() % 5, 0, 2); addPiece(pieces, Archbishop, qrand() % 5, 1, 2); } else { addPiece(pieces, Archbishop, qrand() % 5, 0, 2); addPiece(pieces, Queen, qrand() % 5, 1, 2); } addPiece(pieces, Bishop, qrand() % 4, 0, 2); addPiece(pieces, Bishop, qrand() % 4, 1, 2); addPiece(pieces, Chancellor, qrand() % 6); addPiece(pieces, Knight, qrand() % 5); addPiece(pieces, Knight, qrand() % 4); addPiece(pieces, Rook, 0); addPiece(pieces, King, 0); addPiece(pieces, Rook, 0); } while (!pawnsAreSafe(pieces)); QString fen; // Black pieces foreach (int pieceType, pieces) fen += pieceSymbol(Piece(Side::Black, pieceType)); fen += '/'; // Black pawns for (int i = 0; i < width(); i++) fen += pieceSymbol(Piece(Side::Black, Pawn)); fen += '/'; // Empty squares for (int i = 0; i < height() - 4; i++) fen += QString::number(pieces.size()) + '/'; // White pawns for (int i = 0; i < width(); i++) fen += pieceSymbol(Piece(Side::White, Pawn)); fen += '/'; // White pieces foreach (int pieceType, pieces) fen += pieceSymbol(Piece(Side::White, pieceType)); // Side to move, castling rights, enpassant square, etc. fen += " w KQkq - 0 1"; return fen; }
Move JanusBoard::moveFromSanString(const QString& str) { /* * accepts O-O and Kb1/Kb8/Ki1/Ki8 formats for castling * Xboard uses O-O for B-file and Ki1/Ki8 for I-file castling */ if (str.startsWith("O-O-O")) return WesternBoard::moveFromSanString("O-O"); if (str.startsWith("O-O")) return WesternBoard::moveFromSanString("O-O-O"); if (!str.startsWith(pieceSymbol(King).toUpper())) return WesternBoard::moveFromSanString(str); //main path if (hasCastlingRight(sideToMove(), KingSide)) { Move castlingMove = WesternBoard::moveFromSanString("O-O"); if (!castlingMove.isNull() && str == sanMoveString(castlingMove)) return castlingMove; } if (hasCastlingRight(sideToMove(), QueenSide)) { Move castlingMove = WesternBoard::moveFromSanString("O-O-O"); if (!castlingMove.isNull() && str == sanMoveString(castlingMove)) return castlingMove; } return WesternBoard::moveFromSanString(str); // normal king moves }
QString JanusBoard::sanMoveString(const Move& move) { QString san = WesternBoard::sanMoveString(move); if (!san.startsWith("O-O")) return san; // uses Kb1/Kb8/Ki1/Ki8 for castling QString sym = san.right(1); if (sym != "+" && sym != "#") sym.clear(); return pieceSymbol(King).toUpper() + lanMoveString(move).mid(2) + sym; }