void ScoreCaptures(MOVES *m) { int *movep, *valuep; valuep = m->value; for (movep = m->move; movep < m->last; movep++) *valuep++ = MvvLva(m->p, *movep); }
// 吃子着法生成器,按MVV(LVA)设定分值 int PositionStruct::GenCapMoves(MoveStruct *lpmvs) const { int i, sqSrc, sqDst, pcCaptured; int x, y, nSideTag, nOppSideTag; bool bCanPromote; SlideMoveStruct *lpsmv; uint8_t *lpucsqDst, *lpucsqPin; MoveStruct *lpmvsCurr; // 生成吃子着法的过程包括以下几个步骤: lpmvsCurr = lpmvs; nSideTag = SIDE_TAG(sdPlayer); nOppSideTag = OPP_SIDE_TAG(sdPlayer); bCanPromote = PreEval.bPromotion && CanPromote(); // 1. 生成帅(将)的着法 sqSrc = ucsqPieces[nSideTag + KING_FROM]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqKingMoves[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); // 找到一个着法后,首先判断吃到的棋子是否是对方棋子,技巧是利用"nOppSideTag"的标志(16和32颠倒), // 如果是对方棋子,则保存MVV(LVA)值,即如果被吃子无保护,则只记MVV,否则记MVV-LVA(如果MVV>LVA的话)。 pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 5); // 帅(将)的价值是5 lpmvsCurr ++; } lpucsqDst ++; sqDst = *lpucsqDst; } } // 2. 生成仕(士)的着法 for (i = ADVISOR_FROM; i <= ADVISOR_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqAdvisorMoves[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 1); // 仕(士)的价值是1 lpmvsCurr ++; } lpucsqDst ++; sqDst = *lpucsqDst; } if (bCanPromote && CAN_PROMOTE(sqSrc)) { lpmvsCurr->wmv = MOVE(sqSrc, sqSrc); lpmvsCurr->wvl = 0; lpmvsCurr ++; } } } // 3. 生成相(象)的着法 for (i = BISHOP_FROM; i <= BISHOP_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqBishopMoves[sqSrc]; lpucsqPin = PreGen.ucsqBishopPins[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (ucpcSquares[*lpucsqPin] == 0) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 1); // 相(象)的价值是1 lpmvsCurr ++; } } lpucsqDst ++; sqDst = *lpucsqDst; lpucsqPin ++; } if (bCanPromote && CAN_PROMOTE(sqSrc)) { lpmvsCurr->wmv = MOVE(sqSrc, sqSrc); lpmvsCurr->wvl = 0; lpmvsCurr ++; } } } // 4. 生成马的着法 for (i = KNIGHT_FROM; i <= KNIGHT_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqKnightMoves[sqSrc]; lpucsqPin = PreGen.ucsqKnightPins[sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); if (ucpcSquares[*lpucsqPin] == 0) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 3); // 马的价值是3 lpmvsCurr ++; } } lpucsqDst ++; sqDst = *lpucsqDst; lpucsqPin ++; } } } // 5. 生成车的着法 for (i = ROOK_FROM; i <= ROOK_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); x = FILE_X(sqSrc); y = RANK_Y(sqSrc); lpsmv = RankMovePtr(x, y); sqDst = lpsmv->ucRookCap[0] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 4); // 车的价值是4 lpmvsCurr ++; } } sqDst = lpsmv->ucRookCap[1] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 4); // 车的价值是4 lpmvsCurr ++; } } lpsmv = FileMovePtr(x, y); sqDst = lpsmv->ucRookCap[0] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 4); // 车的价值是4 lpmvsCurr ++; } } sqDst = lpsmv->ucRookCap[1] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 4); // 车的价值是4 lpmvsCurr ++; } } } } // 6. 生成炮的着法 for (i = CANNON_FROM; i <= CANNON_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); x = FILE_X(sqSrc); y = RANK_Y(sqSrc); lpsmv = RankMovePtr(x, y); sqDst = lpsmv->ucCannonCap[0] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 3); // 炮的价值是3 lpmvsCurr ++; } } sqDst = lpsmv->ucCannonCap[1] + RANK_DISP(y); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 3); // 炮的价值是3 lpmvsCurr ++; } } lpsmv = FileMovePtr(x, y); sqDst = lpsmv->ucCannonCap[0] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 3); // 炮的价值是3 lpmvsCurr ++; } } sqDst = lpsmv->ucCannonCap[1] + FILE_DISP(x); __ASSERT_SQUARE(sqDst); if (sqDst != sqSrc) { pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 3); // 炮的价值是3 lpmvsCurr ++; } } } } // 7. 生成兵(卒)的着法 for (i = PAWN_FROM; i <= PAWN_TO; i ++) { sqSrc = ucsqPieces[nSideTag + i]; if (sqSrc != 0) { __ASSERT_SQUARE(sqSrc); lpucsqDst = PreGen.ucsqPawnMoves[sdPlayer][sqSrc]; sqDst = *lpucsqDst; while (sqDst != 0) { __ASSERT_SQUARE(sqDst); pcCaptured = ucpcSquares[sqDst]; if ((pcCaptured & nOppSideTag) != 0) { __ASSERT(LegalMove(MOVE(sqSrc, sqDst))); lpmvsCurr->wmv = MOVE(sqSrc, sqDst); lpmvsCurr->wvl = MvvLva(sqDst, pcCaptured, 2); // 兵(卒)的价值是2 lpmvsCurr ++; } lpucsqDst ++; sqDst = *lpucsqDst; } } } return lpmvsCurr - lpmvs; }