char *PrMove(const int move) { static char MvStr[6]; int ff = FilesBrd[FROMSQ(move)]; int rf = RanksBrd[FROMSQ(move)]; int ft = FilesBrd[TOSQ(move)]; int rt = RanksBrd[TOSQ(move)]; int promoted = PROMOTED(move); if (promoted) { char pchar = 'q'; if (IsKn(promoted)) { pchar = 'n'; } else if (IsRQ(promoted) && !IsBQ(promoted)) { pchar = 'r'; } else if (!IsRQ(promoted) && IsBQ(promoted)) { pchar = 'b'; } sprintf(MvStr, "%c%c%c%c%c", ('a' + ff), ('1' + rf), ('a' + ft), ('1' + rt), pchar); } else { sprintf(MvStr, "%c%c%c%c", ('a' + ff), ('1' + rf), ('a' + ft), ('1' + rt)); } return MvStr; }
inline const char *printMove(const unsigned move) { static char result[6]; const unsigned from = FROMSQ(move); const unsigned to = TOSQ(move); ASSERT(squareOnBoard(to)); if (move & MFLAGDROP) { result[0] = pieceChar[PROMOTED(move) % 6]; result[1] = '@'; result[2] = 'a' + fileBoard[to]; result[3] = '1' + rankBoard[to]; result[4] = 0; } else { ASSERT(squareOnBoard(from)); result[0] = 'a' + fileBoard[from]; result[1] = '1' + rankBoard[from]; result[2] = 'a' + fileBoard[to]; result[3] = '1' + rankBoard[to]; result[4] = PROMOTED(move) ? "__nbrq__nbrq_"[PROMOTED(move)] : 0; result[5] = 0; } return result; }
int ParseMove(char *ptrChar, CHESS_BOARD *pos) { ASSERT(CheckBoard(pos)); if (ptrChar[1] > '8' || ptrChar[1] < '1') return NOMOVE; if (ptrChar[3] > '8' || ptrChar[3] < '1') return NOMOVE; if (ptrChar[0] > 'h' || ptrChar[0] < 'a') return NOMOVE; if (ptrChar[2] > 'h' || ptrChar[2] < 'a') return NOMOVE; int from = FR2SQ(ptrChar[0] - 'a', ptrChar[1] - '1'); int to = FR2SQ(ptrChar[2] - 'a', ptrChar[3] - '1'); ASSERT(SqOnBoard(from) && SqOnBoard(to)); MOVELIST list[1]; GenerateAllMoves(pos, list); int MoveNum = 0; int Move = 0; int PromPce = EMPTY; for (MoveNum = 0; MoveNum < list->count; ++MoveNum) { Move = list->moves[MoveNum].move; if (FROMSQ(Move) == from && TOSQ(Move) == to) { PromPce = PROMOTED(Move); if (PromPce != EMPTY) { if (IsRQ(PromPce) && !IsBQ(PromPce) && ptrChar[4] == 'r') { return Move; } else if (!IsRQ(PromPce) && IsBQ(PromPce) && ptrChar[4] == 'b') { return Move; } else if (IsRQ(PromPce) && IsBQ(PromPce) && ptrChar[4] == 'q') { return Move; } else if (IsKn(PromPce) && ptrChar[4] == 'n') { return Move; } continue; } return Move; } } return NOMOVE; }