void ToFen(char *szFen) { int i, j, k, pc; char *lpFen; lpFen = szFen; for (i = RANK_TOP; i <= RANK_BOTTOM; i ++) { k = 0; for (j = FILE_LEFT; j <= FILE_RIGHT; j ++) { pc = Square[COORD_XY(j, i)]; if (pc != 0) { if (k > 0) { *lpFen = k + '0'; lpFen ++; k = 0; } *lpFen = PIECE_BYTE(PIECE_TYPE(pc)) ; //*lpFen = PIECE_BYTE(PIECE_TYPE(pc)) + (pc < 32 ? 0 : 'a' - 'A'); lpFen ++; } else { k ++; } } if (k > 0) { *lpFen = k + '0'; lpFen ++; } *lpFen = '/'; lpFen ++; } *(lpFen - 1) = ' '; // 把最后一个'/'替换成' ' *lpFen = 'w';//(this->sdPlayer == 0 ? 'w' : 'b'); lpFen ++; *lpFen = '\0'; }
// 将汉字表示转换为符号表示 uint32_t Chin2File(uint64_t qwChinStr) { int nPos; uint16_t *lpwArg; C4dwStruct Ret; lpwArg = (uint16_t *) (void *) &qwChinStr; nPos = Word2Pos(lpwArg[0]); Ret.c[0] = PIECE_BYTE(Word2Piece(nPos == MAX_POS ? lpwArg[0] : lpwArg[1])); Ret.c[1] = (nPos == MAX_POS ? Digit2Byte(Word2Digit(lpwArg[1])) : ccPos2Byte[nPos]); if ((lpwArg[2] == 0xe4b1/*变*/ || lpwArg[2] == 0xdcc5/*跑*/ || lpwArg[2] == 0x83d7/*變*/) && Word2Piece(lpwArg[3]) == 6) { Ret.c[2] = '='; Ret.c[3] = 'P'; } else { Ret.c[2] = ccDirect2Byte[Word2Direct(lpwArg[2])]; Ret.c[3] = Digit2Byte(Word2Digit(lpwArg[3])); } return Ret.dw; }
// 将内部着法表示转换为纵线符号 uint32_t Move2File(int mv, const PositionStruct &pos) { int i, j, sq, pc, pt, nPieceNum; int xSrc, ySrc, xDst, yDst; int nFileList[9], nPieceList[5]; C4dwStruct Ret; if (SRC(mv) == 0 || DST(mv) == 0) { return 0x20202020; } pc = pos.ucpcSquares[SRC(mv)]; if (pc == 0) { return 0x20202020; } pt = PIECE_TYPE(pc); Ret.c[0] = PIECE_BYTE(pt); if (pos.sdPlayer == 0) { xSrc = FILESQ_FILE_X(SQUARE_FILESQ(SRC(mv))); ySrc = FILESQ_RANK_Y(SQUARE_FILESQ(SRC(mv))); xDst = FILESQ_FILE_X(SQUARE_FILESQ(DST(mv))); yDst = FILESQ_RANK_Y(SQUARE_FILESQ(DST(mv))); } else { xSrc = FILESQ_FILE_X(SQUARE_FILESQ(SQUARE_FLIP(SRC(mv)))); ySrc = FILESQ_RANK_Y(SQUARE_FILESQ(SQUARE_FLIP(SRC(mv)))); xDst = FILESQ_FILE_X(SQUARE_FILESQ(SQUARE_FLIP(DST(mv)))); yDst = FILESQ_RANK_Y(SQUARE_FILESQ(SQUARE_FLIP(DST(mv)))); } if (pt >= KING_TYPE && pt <= BISHOP_TYPE) { Ret.c[1] = Digit2Byte(xSrc); } else { for (i = 0; i < 9; i ++) { nFileList[i] = 0; } j = (pt == PAWN_TYPE ? 5 : 2); for (i = 0; i < j; i ++) { sq = FILESQ_SIDE_PIECE(pos, FIRST_PIECE(pt, i)); if (sq != -1) { nFileList[FILESQ_FILE_X(sq)] ++; } } // 提示:处理“两条的纵线上有多个兵(卒)”的问题上,可参阅"File2Move()"函数。 if (nFileList[xSrc] > 1) { nPieceNum = 0; for (i = 0; i < j; i ++) { sq = FILESQ_SIDE_PIECE(pos, FIRST_PIECE(pt, i)); if (sq != -1) { if (nFileList[FILESQ_FILE_X(sq)] > 1) { nPieceList[nPieceNum] = FIRST_PIECE(pt, i); nPieceNum ++; } } } for (i = 0; i < nPieceNum - 1; i ++) { for (j = nPieceNum - 1; j > i; j --) { if (FILESQ_SIDE_PIECE(pos, nPieceList[j - 1]) > FILESQ_SIDE_PIECE(pos, nPieceList[j])) { SWAP(nPieceList[j - 1], nPieceList[j]); } } } sq = FILESQ_COORD_XY(xSrc, ySrc); for (i = 0; i < nPieceNum; i ++) { if (FILESQ_SIDE_PIECE(pos, nPieceList[i]) == sq) { break; } } Ret.c[1] = (nPieceNum == 2 && i == 1 ? ccPos2Byte[2 + DIRECT_TO_POS] : ccPos2Byte[nPieceNum > 3 ? i : i + DIRECT_TO_POS]); } else { Ret.c[1] = Digit2Byte(xSrc); } } if (pt >= ADVISOR_TYPE && pt <= KNIGHT_TYPE) { if (SRC(mv) == DST(mv)) { Ret.c[2] = '='; Ret.c[3] = 'P'; } else { Ret.c[2] = (yDst > ySrc ? '-' : '+'); Ret.c[3] = Digit2Byte(xDst); } } else { Ret.c[2] = (yDst == ySrc ? '.' : yDst > ySrc ? '-' : '+'); Ret.c[3] = (yDst == ySrc ? Digit2Byte(xDst) : Digit2Byte(ABS(ySrc - yDst) - 1)); } return Ret.dw; }
inline int Piece2Byte(int nArg) { return PIECE_BYTE(nArg); }