// 绘制棋盘 static void DrawBoard(HDC hdc) { int x, y, xx, yy, sq, pc; HDC hdcTmp; // 画棋盘 hdcTmp = CreateCompatibleDC(hdc); SelectObject(hdcTmp, Xqwl.bmpBoard); BitBlt(hdc, 0, 0, BOARD_WIDTH, BOARD_HEIGHT, hdcTmp, 0, 0, SRCCOPY); // 画棋子 for (x = FILE_LEFT; x <= FILE_RIGHT; x ++) { for (y = RANK_TOP; y <= RANK_BOTTOM; y ++) { if (Xqwl.bFlipped) { xx = BOARD_EDGE + (FILE_FLIP(x) - FILE_LEFT) * SQUARE_SIZE; yy = BOARD_EDGE + (RANK_FLIP(y) - RANK_TOP) * SQUARE_SIZE; } else { xx = BOARD_EDGE + (x - FILE_LEFT) * SQUARE_SIZE; yy = BOARD_EDGE + (y - RANK_TOP) * SQUARE_SIZE; } sq = COORD_XY(x, y); pc = pos.ucpcSquares[sq]; if (pc != 0) { DrawTransBmp(hdc, hdcTmp, xx, yy, Xqwl.bmpPieces[pc]); } if (sq == Xqwl.sqSelected || sq == SRC(Xqwl.mvLast) || sq == DST(Xqwl.mvLast)) { DrawTransBmp(hdc, hdcTmp, xx, yy, Xqwl.bmpSelected); } } } DeleteDC(hdcTmp); }
int AdvisorShape(const PositionStruct *lppos) { int pcCannon, pcRook, sq, sqAdv1, sqAdv2, x, y, nShape; int vlWhitePenalty, vlBlackPenalty; SlideMaskStruct *lpsms; vlWhitePenalty = vlBlackPenalty = 0; if ((lppos->wBitPiece[0] & ADVISOR_BITPIECE) == ADVISOR_BITPIECE) { if (lppos->ucsqPieces[SIDE_TAG(0) + KING_FROM] == 0xc7) { sqAdv1 = lppos->ucsqPieces[SIDE_TAG(0) + ADVISOR_FROM]; sqAdv2 = lppos->ucsqPieces[SIDE_TAG(0) + ADVISOR_TO]; if (false) { } else if (sqAdv1 == 0xc6) { // 红方一个仕在左侧底线 nShape = (sqAdv2 == 0xc8 ? SHAPE_CENTER : sqAdv2 == 0xb7 ? SHAPE_LEFT : SHAPE_NONE); } else if (sqAdv1 == 0xc8) { // 红方一个仕在右侧底线 nShape = (sqAdv2 == 0xc6 ? SHAPE_CENTER : sqAdv2 == 0xb7 ? SHAPE_RIGHT : SHAPE_NONE); } else if (sqAdv1 == 0xb7) { // 红方一个仕在花心 nShape = (sqAdv2 == 0xc6 ? SHAPE_LEFT : sqAdv2 == 0xc8 ? SHAPE_RIGHT : SHAPE_NONE); } else { nShape = SHAPE_NONE; } switch (nShape) { case SHAPE_NONE: break; case SHAPE_CENTER: for (pcCannon = SIDE_TAG(1) + CANNON_FROM; pcCannon <= SIDE_TAG(1) + CANNON_TO; pcCannon ++) { sq = lppos->ucsqPieces[pcCannon]; if (sq != 0) { x = FILE_X(sq); if (x == FILE_CENTER) { y = RANK_Y(sq); lpsms = lppos->FileMaskPtr(x, y); if ((lpsms->wRookCap & WHITE_KING_BITFILE) != 0) { // 计算空头炮的威胁 vlWhitePenalty += PreEvalEx.vlHollowThreat[RANK_FLIP(y)]; } else if ((lpsms->wSuperCap & WHITE_KING_BITFILE) != 0 && (lppos->ucpcSquares[0xb7] == 21 || lppos->ucpcSquares[0xb7] == 22)) { // 计算炮镇窝心马的威胁 vlWhitePenalty += PreEvalEx.vlCentralThreat[RANK_FLIP(y)]; } } } } break; case SHAPE_LEFT: case SHAPE_RIGHT: for (pcCannon = SIDE_TAG(1) + CANNON_FROM; pcCannon <= SIDE_TAG(1) + CANNON_TO; pcCannon ++) { sq = lppos->ucsqPieces[pcCannon]; if (sq != 0) { x = FILE_X(sq); y = RANK_Y(sq); if (x == FILE_CENTER) { if ((lppos->FileMaskPtr(x, y)->wSuperCap & WHITE_KING_BITFILE) != 0) { // 计算一般中炮的威胁,帅(将)门被对方控制的还有额外罚分 vlWhitePenalty += (PreEvalEx.vlCentralThreat[RANK_FLIP(y)] >> 2) + (lppos->Protected(1, nShape == SHAPE_LEFT ? 0xc8 : 0xc6) ? 20 : 0); // 如果车在底线保护帅(将),则给予更大的罚分! for (pcRook = SIDE_TAG(0) + ROOK_FROM; pcRook <= SIDE_TAG(0) + ROOK_TO; pcRook ++) { sq = lppos->ucsqPieces[pcRook]; if (sq != 0) { y = RANK_Y(sq); if (y == RANK_BOTTOM) { x = FILE_X(sq); if ((lppos->RankMaskPtr(x, y)->wRookCap & KING_BITRANK) != 0) { vlWhitePenalty += 80; } } } } } } else if (y == RANK_BOTTOM) { if ((lppos->RankMaskPtr(x, y)->wRookCap & KING_BITRANK) != 0) { // 计算沉底炮的威胁 vlWhitePenalty += PreEvalEx.vlWhiteBottomThreat[x]; } } } }