示例#1
0
        /// <summary>
        /// 生成所有走法,该方法根据该局面来生成所有该方的走棋步骤
        /// </summary>
        /// <param name="mvs"></param>
        /// <returns></returns>
        public static int GenerateMoves(int[] mvs)
        {
            int i, j, nGenMoves, nDelta, sqSrc, sqDst;
            int pcSelfSide, pcOppSide, pcSrc, pcDst;

            // 生成所有走法,需要经过以下2个步骤:
            nGenMoves  = 0;
            pcSelfSide = Chess_LoadUtil.SIDE_TAG(sdPlayer);
            pcOppSide  = Chess_LoadUtil.OPP_SIDE_TAG(sdPlayer);

            for (sqSrc = 0; sqSrc < 256; sqSrc++)
            {
                // 1. 找到一个本方棋子,再做以下判断:
                pcSrc = ucpcSquares[sqSrc];
                if ((pcSrc & pcSelfSide) == 0)
                {
                    continue;
                }

                // 2. 根据棋子确定走法
                switch (pcSrc - pcSelfSide)
                {
                // 帅(将)
                case GameConstant.PIECE_KING:
                    for (i = 0; i < 4; i++)
                    {
                        sqDst = sqSrc + GameConstant.ccKingDelta[i];
                        if (!Chess_LoadUtil.IN_FORT(sqDst))
                        {
                            continue;
                        }
                        pcDst = ucpcSquares[sqDst];
                        if ((pcDst & pcSelfSide) == 0)
                        {
                            mvs[nGenMoves] = Chess_LoadUtil.MOVE(sqSrc, sqDst);    // 根据起点和终点获得走法
                            //Debuger.LogWarning(string.Format("GameLogic->GenerateMoves(),帅(将)moves[{0}] = {1}", nGenMoves, mvs[nGenMoves]));
                            nGenMoves++;
                        }
                    }
                    break;

                // 士
                case GameConstant.PIECE_ADVISOR:
                    for (i = 0; i < 4; i++)
                    {
                        sqDst = sqSrc + GameConstant.ccAdvisorDelta[i];
                        if (!Chess_LoadUtil.IN_FORT(sqDst))
                        {
                            continue;
                        }
                        pcDst = ucpcSquares[sqDst];
                        if ((pcDst & pcSelfSide) == 0)
                        {
                            mvs[nGenMoves] = Chess_LoadUtil.MOVE(sqSrc, sqDst);
                            nGenMoves++;
                        }
                    }
                    break;

                // 象
                case GameConstant.PIECE_BISHOP:
                    for (i = 0; i < 4; i++)
                    {
                        sqDst = sqSrc + GameConstant.ccAdvisorDelta[i];
                        if (!(Chess_LoadUtil.IN_BOARD(sqDst) && Chess_LoadUtil.HOME_HALF(sqDst, sdPlayer) && ucpcSquares[sqDst] == 0))
                        {
                            continue;
                        }
                        sqDst += GameConstant.ccAdvisorDelta[i];
                        pcDst  = ucpcSquares[sqDst];
                        if ((pcDst & pcSelfSide) == 0)
                        {
                            mvs[nGenMoves] = Chess_LoadUtil.MOVE(sqSrc, sqDst);
                            nGenMoves++;
                        }
                    }
                    break;

                //马
                case GameConstant.PIECE_KNIGHT:
                    for (i = 0; i < 4; i++)
                    {
                        sqDst = sqSrc + GameConstant.ccKingDelta[i];
                        if (ucpcSquares[sqDst] != 0)
                        {
                            continue;
                        }
                        for (j = 0; j < 2; j++)
                        {
                            sqDst = sqSrc + GameConstant.ccKnightDelta[i][j];
                            if (!Chess_LoadUtil.IN_BOARD(sqDst))
                            {
                                continue;
                            }
                            pcDst = ucpcSquares[sqDst];
                            if ((pcDst & pcSelfSide) == 0)
                            {
                                mvs[nGenMoves] = Chess_LoadUtil.MOVE(sqSrc, sqDst);
                                nGenMoves++;
                            }
                        }
                    }
                    break;

                // 车
                case GameConstant.PIECE_ROOK:
                    for (i = 0; i < 4; i++)
                    {
                        nDelta = GameConstant.ccKingDelta[i];
                        sqDst  = sqSrc + nDelta;
                        while (Chess_LoadUtil.IN_BOARD(sqDst))
                        {
                            pcDst = ucpcSquares[sqDst];
                            if (pcDst == 0)
                            {
                                mvs[nGenMoves] = Chess_LoadUtil.MOVE(sqSrc, sqDst);
                                nGenMoves++;
                            }
                            else
                            {
                                if ((pcDst & pcOppSide) != 0)
                                {
                                    mvs[nGenMoves] = Chess_LoadUtil.MOVE(sqSrc, sqDst);
                                    nGenMoves++;
                                }
                                break;
                            }
                            sqDst += nDelta;
                        }
                    }
                    break;

                // 炮
                case GameConstant.PIECE_CANNON:
                    for (i = 0; i < 4; i++)
                    {
                        nDelta = GameConstant.ccKingDelta[i];
                        sqDst  = sqSrc + nDelta;
                        while (Chess_LoadUtil.IN_BOARD(sqDst))
                        {
                            pcDst = ucpcSquares[sqDst];
                            if (pcDst == 0)
                            {
                                mvs[nGenMoves] = Chess_LoadUtil.MOVE(sqSrc, sqDst);
                                nGenMoves++;
                            }
                            else
                            {
                                break;
                            }
                            sqDst += nDelta;
                        }
                        sqDst += nDelta;
                        while (Chess_LoadUtil.IN_BOARD(sqDst))
                        {
                            pcDst = ucpcSquares[sqDst];
                            if (pcDst != 0)
                            {
                                if ((pcDst & pcOppSide) != 0)
                                {
                                    mvs[nGenMoves] = Chess_LoadUtil.MOVE(sqSrc, sqDst);
                                    nGenMoves++;
                                }
                                break;
                            }
                            sqDst += nDelta;
                        }
                    }
                    break;

                //小兵
                case GameConstant.PIECE_PAWN:
                    sqDst = Chess_LoadUtil.SQUARE_FORWARD(sqSrc, sdPlayer); // 格子水平镜像
                    if (Chess_LoadUtil.IN_BOARD(sqDst))                     // 判断棋子是否在棋盘中
                    {
                        pcDst = ucpcSquares[sqDst];
                        if ((pcDst & pcSelfSide) == 0)
                        {
                            mvs[nGenMoves] = Chess_LoadUtil.MOVE(sqSrc, sqDst);
                            nGenMoves++;
                        }
                    }
                    if (Chess_LoadUtil.AWAY_HALF(sqSrc, sdPlayer))
                    {
                        for (nDelta = -1; nDelta <= 1; nDelta += 2)
                        {
                            sqDst = sqSrc + nDelta;
                            if (Chess_LoadUtil.IN_BOARD(sqDst))
                            {
                                pcDst = ucpcSquares[sqDst];
                                if ((pcDst & pcSelfSide) == 0)
                                {
                                    mvs[nGenMoves] = Chess_LoadUtil.MOVE(sqSrc, sqDst);
                                    nGenMoves++;
                                }
                            }
                        }
                    }
                    break;
                }
            }

            return(nGenMoves);
        }