// 尝试某个着法,并返回着法状态,参阅"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; }
// 无害裁剪 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; }