本文整理汇总了C++中PositionStruct类的典型用法代码示例。如果您正苦于以下问题:C++ PositionStruct类的具体用法?C++ PositionStruct怎么用?C++ PositionStruct使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了PositionStruct类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的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: 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.ucpcSquares[SRC(mv)] == 0) {
break;
}
pos.MakeMove(mv);
}
}
示例3: PopHash
// UCCI支持 - 输出Hash表中的局面信息
bool PopHash(const PositionStruct &pos) {
HashStruct hsh;
uint32_t dwMoveStr;
int i;
for (i = 0; i < HASH_LAYERS; i ++) {
hsh = HASH_ITEM(pos, i);
if (HASH_POS_EQUAL(hsh, pos)) {
printf("pophash");
if (hsh.wmv != 0) {
__ASSERT(pos.LegalMove(hsh.wmv));
dwMoveStr = MOVE_COORD(hsh.wmv);
printf(" bestmove %.4s", (const char *) &dwMoveStr);
}
if (hsh.ucBetaDepth > 0) {
printf(" lowerbound %d depth %d", hsh.svlBeta, hsh.ucBetaDepth);
}
if (hsh.ucAlphaDepth > 0) {
printf(" upperbound %d depth %d", hsh.svlAlpha, hsh.ucAlphaDepth);
}
printf("\n");
fflush(stdout);
return true;
}
}
return false;
}
示例4: FlipBoard
// 翻转棋盘
void FlipBoard(PositionStruct &pos) {
int i, sq;
uint8_t ucsqList[32];
for (i = 16; i < 48; i ++) {
sq = pos.ucsqPieces[i];
ucsqList[i - 16] = sq;
if (sq != 0) {
pos.AddPiece(sq, i, DEL_PIECE);
}
}
for (i = 16; i < 48; i ++) {
sq = ucsqList[i - 16]; // 这行不同于ExchangeSide
if (sq != 0) {
pos.AddPiece(SQUARE_FLIP(sq), i);
}
}
}
示例5: MoveStable
// 检测下一个着法是否稳定,有助于减少置换表的不稳定性
inline bool MoveStable(PositionStruct &pos, int mv) {
// 判断下一个着法是否稳定的依据是:
// 1. 没有后续着法,则假定是稳定的;
if (mv == 0) {
return true;
}
// 2. 吃子着法是稳定的;
__ASSERT(pos.LegalMove(mv));
if (pos.ucpcSquares[DST(mv)] != 0) {
return true;
}
// 3. 可能因置换表引起路线迁移,使得路线超过"MAX_MOVE_NUM",此时应立刻终止路线,并假定是稳定的。
if (!pos.MakeMove(mv)) {
return true;
}
return false;
}
示例6: playRollout
int Node::playRollout(){
PositionStruct p = pos;
int player = p.sdPlayer;
int k = K;
int mv[128];
int i;
for (i = 0; i < k; i++){
mv[k] = move[k];
}
while (1){
p.MakeMove(mv[ppi(pos2fen(&p), k, mv)]);
genMove(&p, k, mv);
if (k == 0){ //无子可走被将死
if (p.sdPlayer == player){ //自己被将死
return 0;
}
else{
return 1;
}
}
}
}
示例7: AddEcco
static void AddEcco(const char *szPgnFile, const EccoApiStruct &EccoApi) {
int i, nStatus;
uint32_t dwEccoIndex, dwFileMove[20];
PgnFileStruct pgn;
PositionStruct pos;
if (pgn.Read(szPgnFile, NO_ADVERT)) {
pos.FromFen(cszStartFen);
for (i = 1; i <= MIN(pgn.nMaxMove, 20); i ++) {
dwFileMove[i - 1] = Move2File(pgn.wmvMoveTable[i], pos);
TryMove(pos, nStatus, pgn.wmvMoveTable[i]);
}
if (pgn.nMaxMove < 20) {
dwFileMove[pgn.nMaxMove] = 0;
}
dwEccoIndex = EccoApi.EccoIndex((const char *) dwFileMove);
strcpy(pgn.szEcco, (const char *) &dwEccoIndex);
strcpy(pgn.szOpen, EccoApi.EccoOpening(dwEccoIndex));
strcpy(pgn.szVar, EccoApi.EccoVariation(dwEccoIndex));
pgn.Write(szPgnFile);
}
}
示例8: HarmlessPruning
// 无害裁剪
static int HarmlessPruning(const PositionStruct &pos, int vlBeta) {
int vl, vlRep;
// 1. 杀棋步数裁剪;
vl = pos.nDistance - MATE_VALUE;
if (vl >= vlBeta) {
return vl;
}
// 2. 和棋裁剪;
if (pos.IsDraw()) {
return 0; // 安全起见,这里不用"pos.DrawValue()";
}
// 3. 重复裁剪;
vlRep = pos.RepStatus();
if (vlRep > 0) {
return pos.RepValue(vlRep);
}
return -MATE_VALUE;
}
示例9: ProbeHash
// 获取置换表局面信息(没有命中时,返回"-MATE_VALUE")
int ProbeHash(const PositionStruct &pos, int vlAlpha, int vlBeta, int nDepth, bool bNoNull, int &mv) {
HashStruct hsh;
int i, vl;
bool bBanNode, bMateNode;
// 获取置换表局面信息的过程包括以下几个步骤:
// 1. 逐层获取置换表项
mv = 0;
for (i = 0; i < HASH_LAYERS; i ++) {
hsh = HASH_ITEM(pos, i);
if (HASH_POS_EQUAL(hsh, pos)) {
mv = hsh.wmv;
__ASSERT(mv == 0 || pos.LegalMove(mv));
break;
}
}
if (i == HASH_LAYERS) {
return -MATE_VALUE;
}
// 2. 判断是否符合Beta边界
if (hsh.ucBetaDepth > 0) {
vl = ValueAdjust(pos, bBanNode, bMateNode, hsh.svlBeta);
if (!bBanNode && !(hsh.wmv == 0 && bNoNull) && (hsh.ucBetaDepth >= nDepth || bMateNode) && vl >= vlBeta) {
__ASSERT_BOUND(1 - MATE_VALUE, vl, MATE_VALUE - 1);
if (hsh.wmv == 0 || PosStable(pos, hsh.wmv)) {
return vl;
}
}
}
// 3. 判断是否符合Alpha边界
if (hsh.ucAlphaDepth > 0) {
vl = ValueAdjust(pos, bBanNode, bMateNode, hsh.svlAlpha);
if (!bBanNode && (hsh.ucAlphaDepth >= nDepth || bMateNode) && vl <= vlAlpha) {
__ASSERT_BOUND(1 - MATE_VALUE, vl, MATE_VALUE - 1);
if (hsh.wmv == 0 || PosStable(pos, hsh.wmv)) {
return vl;
}
}
}
return -MATE_VALUE;
}
示例10: TryMove
// 尝试某个着法,并返回着法状态,参阅"cchess.h"
bool TryMove(PositionStruct &pos, int &nStatus, int mv) {
if (!pos.LegalMove(mv)) {
nStatus = MOVE_ILLEGAL;
return false;
}
if (!pos.MakeMove(mv)) {
nStatus = MOVE_INCHECK;
return false;
}
nStatus = 0;
nStatus += (pos.LastMove().CptDrw > 0 ? MOVE_CAPTURE : 0);
nStatus += (pos.LastMove().ChkChs > 0 ? MOVE_CHECK : 0);
nStatus += (pos.IsMate() ? MOVE_MATE : 0);
nStatus += pos.RepStatus(3) * MOVE_PERPETUAL; // 提示:参阅"position.cpp"中的"IsRep()"函数
nStatus += (pos.IsDraw() ? MOVE_DRAW : 0);
pos.UndoMakeMove();
return true;
}
示例11: ValueAdjust
/* 判断获取置换表要符合哪些条件,置换表的分值针对四个不同的区间有不同的处理:
* 一、如果分值在"WIN_VALUE"以内(即介于"-WIN_VALUE"到"WIN_VALUE"之间,下同),则只获取满足搜索深度要求的局面;
* 二、如果分值在"WIN_VALUE"和"BAN_VALUE"之间,则不能获取置换表中的值(只能获取最佳着法仅供参考),目的是防止由于长将而导致的“置换表的不稳定性”;
* 三、如果分值在"BAN_VALUE"以外,则获取局面时不必考虑搜索深度要求,因为这些局面已经被证明是杀棋了;
* 四、如果分值是"DrawValue()"(是第一种情况的特殊情况),则不能获取置换表中的值(原因与第二种情况相同)。
* 注意:对于第三种情况,要对杀棋步数进行调整!
*/
inline int ValueAdjust(const PositionStruct &pos, bool &bBanNode, bool &bMateNode, int vl) {
bBanNode = bMateNode = false;
if (vl > WIN_VALUE) {
if (vl <= BAN_VALUE) {
bBanNode = true;
} else {
bMateNode = true;
vl -= pos.nDistance;
}
} else if (vl < -WIN_VALUE) {
if (vl >= -BAN_VALUE) {
bBanNode = true;
} else {
bMateNode = true;
vl += pos.nDistance;
}
} else if (vl == pos.DrawValue()) {
bBanNode = true;
}
return vl;
}
示例12: RecordHash
// 存储置换表局面信息
void RecordHash(const PositionStruct &pos, int nFlag, int vl, int nDepth, int mv) {
HashStruct hsh;
int i, nHashDepth, nMinDepth, nMinLayer;
// 存储置换表局面信息的过程包括以下几个步骤:
// 1. 对分值做杀棋步数调整;
__ASSERT_BOUND(1 - MATE_VALUE, vl, MATE_VALUE - 1);
__ASSERT(mv == 0 || pos.LegalMove(mv));
if (vl > WIN_VALUE) {
if (mv == 0 && vl <= BAN_VALUE) {
return; // 导致长将的局面(不进行置换裁剪)如果连最佳着法也没有,那么没有必要写入置换表
}
vl += pos.nDistance;
} else if (vl < -WIN_VALUE) {
if (mv == 0 && vl >= -BAN_VALUE) {
return; // 同理
}
vl -= pos.nDistance;
} else if (vl == pos.DrawValue() && mv == 0) {
return; // 同理
}
// 2. 逐层试探置换表;
nMinDepth = 512;
nMinLayer = 0;
for (i = 0; i < HASH_LAYERS; i ++) {
hsh = HASH_ITEM(pos, i);
// 3. 如果试探到一样的局面,那么更新置换表信息即可;
if (HASH_POS_EQUAL(hsh, pos)) {
// 如果深度更深,或者边界缩小,都可更新置换表的值
if ((nFlag & HASH_ALPHA) != 0 && (hsh.ucAlphaDepth <= nDepth || hsh.svlAlpha >= vl)) {
hsh.ucAlphaDepth = nDepth;
hsh.svlAlpha = vl;
}
// Beta结点要注意:不要用Null-Move的结点覆盖正常的结点
if ((nFlag & HASH_BETA) != 0 && (hsh.ucBetaDepth <= nDepth || hsh.svlBeta <= vl) && (mv != 0 || hsh.wmv == 0)) {
hsh.ucBetaDepth = nDepth;
hsh.svlBeta = vl;
}
// 最佳着法是始终覆盖的
if (mv != 0) {
hsh.wmv = mv;
}
HASH_ITEM(pos, i) = hsh;
return;
}
// 4. 如果不是一样的局面,那么获得深度最小的置换表项;
nHashDepth = MAX((hsh.ucAlphaDepth == 0 ? 0 : hsh.ucAlphaDepth + 256),
(hsh.wmv == 0 ? hsh.ucBetaDepth : hsh.ucBetaDepth + 256));
__ASSERT(nHashDepth < 512);
if (nHashDepth < nMinDepth) {
nMinDepth = nHashDepth;
nMinLayer = i;
}
}
// 5. 记录置换表。
hsh.dwZobristLock0 = pos.zobr.dwLock0;
hsh.dwZobristLock1 = pos.zobr.dwLock1;
hsh.wmv = mv;
hsh.ucAlphaDepth = hsh.ucBetaDepth = 0;
hsh.svlAlpha = hsh.svlBeta = 0;
if ((nFlag & HASH_ALPHA) != 0) {
hsh.ucAlphaDepth = nDepth;
hsh.svlAlpha = vl;
}
if ((nFlag & HASH_BETA) != 0) {
hsh.ucBetaDepth = nDepth;
hsh.svlBeta = vl;
}
HASH_ITEM(pos, nMinLayer) = hsh;
}
示例13: 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);
//.........这里部分代码省略.........
示例14: SearchQuiesc
// 静态搜索例程
static int SearchQuiesc(PositionStruct &pos, int vlAlpha, int vlBeta) {
int vlBest, vl, mv;
bool bInCheck;
MoveSortStruct MoveSort;
// 静态搜索例程包括以下几个步骤:
Search2.nAllNodes ++;
// 1. 无害裁剪;
vl = HarmlessPruning(pos, vlBeta);
if (vl > -MATE_VALUE) {
return vl;
}
#ifdef HASH_QUIESC
// 3. 置换裁剪;
vl = ProbeHashQ(pos, vlAlpha, vlBeta);
if (Search.bUseHash && vl > -MATE_VALUE) {
return vl;
}
#endif
// 4. 达到极限深度,直接返回评价值;
if (pos.nDistance == LIMIT_DEPTH) {
return Evaluate(pos, vlAlpha, vlBeta);
}
__ASSERT(Search.pos.nDistance < LIMIT_DEPTH);
// 5. 初始化;
vlBest = -MATE_VALUE;
bInCheck = (pos.LastMove().ChkChs > 0);
// 6. 对于被将军的局面,生成全部着法;
if (bInCheck) {
MoveSort.InitAll(pos);
} else {
// 7. 对于未被将军的局面,在生成着法前首先尝试空着(空着启发),即对局面作评价;
vl = Evaluate(pos, vlAlpha, vlBeta);
__ASSERT_BOUND(1 - WIN_VALUE, vl, WIN_VALUE - 1);
__ASSERT(vl > vlBest);
if (vl >= vlBeta) {
#ifdef HASH_QUIESC
RecordHashQ(pos, vl, MATE_VALUE);
#endif
return vl;
}
vlBest = vl;
vlAlpha = MAX(vl, vlAlpha);
// 8. 对于未被将军的局面,生成并排序所有吃子着法(MVV(LVA)启发);
MoveSort.InitQuiesc(pos);
}
// 9. 用Alpha-Beta算法搜索这些着法;
while ((mv = MoveSort.NextQuiesc(bInCheck)) != 0) {
__ASSERT(bInCheck || pos.ucpcSquares[DST(mv)] > 0);
if (pos.MakeMove(mv)) {
vl = -SearchQuiesc(pos, -vlBeta, -vlAlpha);
pos.UndoMakeMove();
if (vl > vlBest) {
if (vl >= vlBeta) {
#ifdef HASH_QUIESC
if (vl > -WIN_VALUE && vl < WIN_VALUE) {
RecordHashQ(pos, vl, MATE_VALUE);
}
#endif
return vl;
}
vlBest = vl;
vlAlpha = MAX(vl, vlAlpha);
}
}
}
// 10. 返回分值。
if (vlBest == -MATE_VALUE) {
__ASSERT(pos.IsMate());
return pos.nDistance - MATE_VALUE;
} else {
#ifdef HASH_QUIESC
if (vlBest > -WIN_VALUE && vlBest < WIN_VALUE) {
RecordHashQ(pos, vlBest > vlAlpha ? vlBest : -MATE_VALUE, vlBest);
}
#endif
return vlBest;
}
}
示例15: Evaluate
// 调整型局面评价函数
inline int Evaluate(const PositionStruct &pos, int vlAlpha, int vlBeta) {
int vl;
vl = Search.bKnowledge ? pos.Evaluate(vlAlpha, vlBeta) : pos.Material();
return vl == pos.DrawValue() ? vl - 1 : vl;
}