Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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
}
Ejemplo n.º 3
0
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;
}