本文整理汇总了C++中PositionStruct::SetIrrev方法的典型用法代码示例。如果您正苦于以下问题:C++ PositionStruct::SetIrrev方法的具体用法?C++ PositionStruct::SetIrrev怎么用?C++ PositionStruct::SetIrrev使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类PositionStruct
的用法示例。
在下文中一共展示了PositionStruct::SetIrrev方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: BuildPos
void BuildPos(PositionStruct &pos, const UcciCommStruct &UcciComm) {
int i, mv;
pos.FromFen(UcciComm.szFenStr);
for (i = 0; i < UcciComm.nMoveNum; i ++) {
mv = COORD_MOVE(UcciComm.lpdwMovesCoord[i]);
if (mv == 0) {
break;
}
if (pos.LegalMove(mv) && pos.MakeMove(mv) && pos.LastMove().CptDrw > 0) {
// 始终让pos.nMoveNum反映没吃子的步数
pos.SetIrrev();
}
}
}
示例2: Xqf2Pgn
int Xqf2Pgn(const char *szXqfFile, const char *szPgnFile, const EccoApiStruct &EccoApi) {
int i, nArg0, nArgs[4];
int nCommentLen, mv, nStatus;
bool bHasNext;
PgnFileStruct pgn;
PositionStruct pos;
FILE *fp;
XqfHeaderStruct xqfhd;
XqfMoveStruct xqfmv;
// 版本号和加密偏移值
int nXqfVer, nPieceOff, nSrcOff, nDstOff, nCommentOff;
// 密钥流
int nEncStream[32];
// 密钥流索引号
int nEncIndex;
// 局面初始位置
int nPiecePos[32];
uint32_t dwEccoIndex, dwFileMove[20];
fp = fopen(szXqfFile, "rb");
if (fp == NULL) {
return XQF2PGN_ERROR_OPEN;
}
fread(&xqfhd, sizeof(xqfhd), 1, fp);
fseek(fp, sizeof(xqfhd), SEEK_CUR);
if (xqfhd.szTag[0] == 'X' && xqfhd.szTag[1] == 'Q') {
// PGN文件可以打开,现在正式解析XQF文件
nXqfVer = xqfhd.szTag[2];
if (nXqfVer < 11) {
nPieceOff = nSrcOff = nDstOff = nCommentOff = 0;
for (i = 0; i < 32; i ++) {
nEncStream[i] = 0;
}
} else {
// 局面初始位置的加密偏移值
nPieceOff = (uint8_t) (Square54Plus221((uint8_t) xqfhd.szTag[13]) * (uint8_t) xqfhd.szTag[13]);
// 着法起点的加密偏移值
nSrcOff = (uint8_t) (Square54Plus221((uint8_t) xqfhd.szTag[14]) * nPieceOff);
// 着法终点的加密偏移值
nDstOff = (uint8_t) (Square54Plus221((uint8_t) xqfhd.szTag[15]) * nSrcOff);
// 注释的加密偏移值
nCommentOff = ((uint8_t) xqfhd.szTag[12] * 256 + (uint8_t) xqfhd.szTag[13]) % 32000 + 767;
// 基本掩码
nArg0 = xqfhd.szTag[3];
// 密钥 = 前段密钥 | (后段密钥 & 基本掩码)
for (i = 0; i < 4; i ++) {
nArgs[i] = xqfhd.szTag[8 + i] | (xqfhd.szTag[12 + i] & nArg0);
}
// 密钥流 = 密钥 & 密钥流掩码
for (i = 0; i < 32; i ++) {
nEncStream[i] = (uint8_t) (nArgs[i % 4] & cszEncStreamMask[i]);
}
}
nEncIndex = 0;
// 记录棋谱信息
if (xqfhd.szEvent[0] == 0) {
GetXqfString(pgn.szEvent, xqfhd.szTitle);
} else {
GetXqfString(pgn.szEvent, xqfhd.szEvent);
}
GetXqfString(pgn.szDate, xqfhd.szDate);
GetXqfString(pgn.szSite, xqfhd.szSite);
GetXqfString(pgn.szRed, xqfhd.szRed);
GetXqfString(pgn.szBlack, xqfhd.szBlack);
pgn.nResult = cnResultTrans[(int) xqfhd.szResult[3]];
if (xqfhd.szSetUp[0] < 2) {
// 如果是开局或者全局,那么直接设置起始局面
pgn.posStart.FromFen(cszStartFen);
} else {
// 如果是中局或者排局,那么根据"xqfhd.szPiecePos[32]"的内容摆放局面
// 当版本号达到12时,还要进一步解密局面初始位置
if (nXqfVer < 12) {
for (i = 0; i < 32; i ++) {
nPiecePos[i] = (uint8_t) (xqfhd.szPiecePos[i] - nPieceOff);
}
} else {
for (i = 0; i < 32; i ++) {
nPiecePos[(nPieceOff + 1 + i) % 32] = (uint8_t) (xqfhd.szPiecePos[i] - nPieceOff);
}
}
// 把"nPiecePos[32]"的数据放到"PositionStruct"中
pgn.posStart.ClearBoard();
for (i = 0; i < 32; i ++) {
if (nPiecePos[i] < 90) {
pgn.posStart.AddPiece(cucsqXqf2Square[nPiecePos[i]], cpcXqf2Piece[i]);
}
}
pgn.posStart.SetIrrev();
}
pos = pgn.posStart;
bHasNext = true;
while (bHasNext && pgn.nMaxMove < MAX_MOVE_LEN) {
// 读取着法记录
if (nXqfVer < 11) {
fread(&xqfmv, sizeof(xqfmv), 1, fp);
//.........这里部分代码省略.........