inline int Byte2Piece(int nArg) { return (nArg >= '1' && nArg <= '7' ? nArg - '1' : nArg >= 'A' && nArg <= 'Z' ? FenPiece(nArg) : nArg >= 'a' && nArg <= 'z' ? FenPiece(nArg - 'a' + 'A') : MAX_PIECE); }
void FromFen(const char *szFen) { int i, j, k; int pcWhite[7]; int pcBlack[7]; const char *lpFen; // FEN串的识别包括以下几个步骤: // 1. 初始化,清空棋盘 pcWhite[0] = SIDE_TAG(0) + KING_FROM; pcWhite[1] = SIDE_TAG(0) + ADVISOR_FROM; pcWhite[2] = SIDE_TAG(0) + BISHOP_FROM; pcWhite[3] = SIDE_TAG(0) + KNIGHT_FROM; pcWhite[4] = SIDE_TAG(0) + ROOK_FROM; pcWhite[5] = SIDE_TAG(0) + CANNON_FROM; pcWhite[6] = SIDE_TAG(0) + PAWN_FROM; for (i = 0; i < 7; i ++) { pcBlack[i] = pcWhite[i] + 16; } /* 数组"pcWhite[7]"和"pcBlack[7]"分别代表红方和黑方每个兵种即将占有的序号, * 以"pcWhite[7]"为例,由于棋子16到31依次代表“帅仕仕相相马马车车炮炮兵兵兵兵兵”, * 所以最初应该是"pcWhite[7] = {16, 17, 19, 21, 23, 25, 27}",每添加一个棋子,该项就增加1, * 这种做法允许添加多余的棋子(例如添加第二个帅,就变成仕了),但添加前要做边界检测 */ // ClearBoard(); lpFen = szFen; if (*lpFen == '\0') { // SetIrrev(); return; } // 2. 读取棋盘上的棋子 i = RANK_TOP; j = FILE_LEFT; while (*lpFen != ' ') { if (*lpFen == '/') { j = FILE_LEFT; i ++; if (i > RANK_BOTTOM) { break; } } else if (*lpFen >= '1' && *lpFen <= '9') { for (k = 0; k < (*lpFen - '0'); k ++) { if (j >= FILE_RIGHT) { break; } j ++; } } else if (*lpFen >= 'A' && *lpFen <= 'Z') { if (j <= FILE_RIGHT) { k = FenPiece(*lpFen); if (k < 7) { if (pcWhite[k] < 32) { //if (this->ucsqPieces[pcWhite[k]] == 0) { AddPiece(COORD_XY(j, i), pcWhite[k]); pcWhite[k] ++; //} } } j ++; } } else if (*lpFen >= 'a' && *lpFen <= 'z') { if (j <= FILE_RIGHT) { //k = FenPiece(*lpFen + 'A' - 'a'); k = FenPiece(*lpFen); if (6<k < 14) { if (pcBlack[k-7] < 48) { //if (this->ucsqPieces[pcBlack[k]] == 0) { AddPiece(COORD_XY(j, i), pcBlack[k-7]); pcBlack[k-7] ++; //} } } j ++; } } lpFen ++; if (*lpFen == '\0') { //SetIrrev(); return; } } lpFen ++; // 3. 确定轮到哪方走 // if (this->sdPlayer == (*lpFen == 'b' ? 0 : 1)) { // ChangeSide(); // } // // 4. 把局面设成“不可逆” // SetIrrev(); }