/* * Convert into UCI notation */ extern char *moveToUci(char moveString[maxMoveSize], int move) { int from = from(move); int to = to(move); *moveString++ = fileToChar(file(from)); *moveString++ = rankToChar(rank(from)); *moveString++ = fileToChar(file(to)); *moveString++ = rankToChar(rank(to)); if (((move & specialMoveFlag) && rank(from) == rank7 && rank(to) == rank8) || ((move & specialMoveFlag) && rank(from) == rank2 && rank(to) == rank1)) *moveString++ = tolower(promotionPieceToChar[(move>>promotionBits)&3]); *moveString = '\0'; return moveString; }
void posDraw(const Pos *pos) { // Header. uciWrite("Position:\n"); // Board with pieces. int file, rank; for(rank=Rank8;rank>=Rank1;--rank) { uciWrite("%i|", (rank+8)-Rank8); for(file=FileA;file<=FileH;++file) uciWrite(" %c", pieceToChar(posGetPieceOnSq(pos, sqMake(file,rank)))); uciWrite("\n"); } uciWrite(" ----------------\n"); uciWrite(" "); for(file=FileA;file<=FileH;++file) uciWrite(" %c", (file+'a')-FileA); uciWrite("\n"); // Other information. uciWrite("STM: %s\n", colourToStr(posGetSTM(pos))); uciWrite("Castling rights: %s\n", posCastRightsToStr(posGetCastRights(pos))); if (pos->data->epSq!=SqInvalid) uciWrite("EP-sq: %c%c\n", fileToChar(sqFile(pos->data->epSq)), rankToChar(sqRank(pos->data->epSq))); else uciWrite("EP-sq: -\n"); uciWrite("Half move number: %u\n", pos->data->halfMoveNumber); uciWrite("Full move number: %u\n", pos->fullMoveNumber); uciWrite("Base hash key: %016"PRIxKey"\n", posGetKey(pos)); uciWrite("Pawn hash key: %016"PRIxKey"\n", posGetPawnKey(pos)); uciWrite("Material hash key: %016"PRIxKey"\n", posGetMatKey(pos)); }
extern void boardToFen(Board_t self, char *fen) { /* * Squares */ for (int rank=rank8; rank!=rank1-rankStep; rank-=rankStep) { int emptySquares = 0; for (int file=fileA; file!=fileH+fileStep; file+=fileStep) { int square = square(file, rank); int piece = self->squares[square]; if (piece != empty) { if (emptySquares > 0) *fen++ = '0' + emptySquares; *fen++ = pieceToChar[piece]; emptySquares = 0; } else emptySquares++; } if (emptySquares > 0) *fen++ = '0' + emptySquares; if (rank != rank1) *fen++ = '/'; } /* * Side to move */ *fen++ = ' '; *fen++ = (sideToMove(self) == white) ? 'w' : 'b'; /* * Castling flags */ *fen++ = ' '; if (self->castleFlags) { if (self->castleFlags & castleFlagWhiteKside) *fen++ = 'K'; if (self->castleFlags & castleFlagWhiteQside) *fen++ = 'Q'; if (self->castleFlags & castleFlagBlackKside) *fen++ = 'k'; if (self->castleFlags & castleFlagBlackQside) *fen++ = 'q'; } else *fen++ = '-'; /* * En-passant square */ *fen++ = ' '; normalizeEnPassantStatus(self); if (self->enPassantPawn) { *fen++ = fileToChar(file(self->enPassantPawn)); *fen++ = rankToChar((sideToMove(self) == white) ? rank6 : rank3); } else *fen++ = '-'; /* * Move number (TODO) */ /* * Halfmove clock (TODO) */ *fen = '\0'; }