本文整理汇总了C++中PositionStruct::LegalMove方法的典型用法代码示例。如果您正苦于以下问题:C++ PositionStruct::LegalMove方法的具体用法?C++ PositionStruct::LegalMove怎么用?C++ PositionStruct::LegalMove使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类PositionStruct
的用法示例。
在下文中一共展示了PositionStruct::LegalMove方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: 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;
}
示例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.LegalMove(mv) && pos.MakeMove(mv) && pos.LastMove().CptDrw > 0) {
// 始终让pos.nMoveNum反映没吃子的步数
pos.SetIrrev();
}
}
}
示例3: 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;
}
示例4: 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;
}
示例5: 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;
}
示例6: 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;
}