示例#1
0
        /// <summary>
        /// 搬一步棋的棋子
        /// </summary>
        /// <param name="mv">走棋步骤</param>
        /// <returns>返回原来目标格子上的棋子</returns>
        public static int MovePiece(int mv)
        {
            //Debuger.LogWarning(string.Format("Loadutil->MovePiece( ) 开始, mv = {0}", mv));
            int sqSrc, sqDst, pc, pcCaptured;

            sqSrc = Chess_LoadUtil.SRC(mv);     // 得到起始位置的数组下标
            sqDst = Chess_LoadUtil.DST(mv);     // 得到目标位置的数组下标

            pcCaptured = ucpcSquares[sqDst];    // 得到目的格子的棋子
            Debuger.LogWarning(string.Format("Loadutil->MovePiece( ) 得到目的格子的棋子pcCaptured ={0}", pcCaptured));

            if (pcCaptured != 0)             // 目的地不为空
            {
                DelPiece(sqDst, pcCaptured); // 删掉目标格子棋子
            }
            pc = ucpcSquares[sqSrc];         // 得到初始格子上的棋子
            Debuger.LogWarning(string.Format("Loadutil->MovePiece( ) 得到初始格子上的棋子pc ={0}", pc));

            if (0 != pc)
            {
                DelPiece(sqSrc, pc); // 删掉初始格子上的棋子
                Debuger.LogWarning(string.Format("Loadutil->MovePiece( ) 删掉初始格子上的棋子sqSrc={0}, pc ={1}", sqSrc, pc));
                AddPiece(sqDst, pc); // 在目标格子上放上棋子
            }

            Debuger.LogWarning(string.Format("Loadutil->MovePiece( ) pcCaptured={0}", pcCaptured));
            return(pcCaptured);// 返回原来目标格子上的棋子
        }
示例#2
0
        /// <summary>
        /// 撤消搬一步棋的棋子,该方法要传入走棋的步骤,以及该走棋步骤下的目标位置上的棋子。
        /// 先将该棋子搬到初始位置,如果该步骤下的目标位置上的棋子不为空,即: 是吃子走法时,
        /// 把被吃掉的棋子重新搬到该位置,以此来实现撤销搬一步棋的功能。
        /// </summary>
        /// <param name="mv">走棋步骤</param>
        /// <param name="pcCaptured">原来目标格子上的棋子</param>
        public static void UndoMovePiece(int mv, int pcCaptured)
        {
            int sqSrc, sqDst, pc;

            sqSrc = Chess_LoadUtil.SRC(mv);     // 得到起始位置的数组下标
            sqDst = Chess_LoadUtil.DST(mv);     // 得到目标位置的数组下标
            pc    = ucpcSquares[sqDst];         // 得到目的格子的棋子
            if (0 != pc)
            {
                DelPiece(sqDst, pc);         // 删除目标格子的棋子
            }
            AddPiece(sqSrc, pc);             // 在起始格子上放棋子
            if (pcCaptured != 0)             // 如果目标格子上起初有棋子
            {
                AddPiece(sqDst, pcCaptured); // 将该棋子放在目标格子上
            }
            Debuger.LogWarning(string.Format("Loadutil->UndoMovePiece( )"));
        }
示例#3
0
        /// <summary>
        /// 判断走法是否合理,生成所有走法后,判断每个走法是否合理,只把合理的走法留下来。
        /// </summary>
        /// <param name="mv"></param>
        /// <returns></returns>
        public static bool LegalMove(int mv)
        {
            int sqSrc, sqDst, sqPin;
            int pcSelfSide, pcSrc, pcDst, nDelta;

            // 判断走法是否合法,需要经过以下的判断过程:

            // 1. 判断起始格是否有自己的棋子
            sqSrc = Chess_LoadUtil.SRC(mv);
            pcSrc = ucpcSquares[sqSrc];

            pcSelfSide = Chess_LoadUtil.SIDE_TAG(sdPlayer); // 获得红黑标记(红子是8,黑子是16)
            Debuger.Log(string.Format("下棋方pcSelfSide = {0}, pcSrc = {1}", pcSelfSide, pcSrc));

            if ((pcSrc & pcSelfSide) == 0)
            {
                return(false);
            }

            // 2. 判断目标格是否有自己的棋子
            sqDst = Chess_LoadUtil.DST(mv);
            pcDst = ucpcSquares[sqDst];
            if ((pcDst & pcSelfSide) != 0)
            {
                return(false);
            }

            // 3. 根据棋子的类型检查走法是否合理
            switch (pcSrc - pcSelfSide)
            {
            case GameConstant.PIECE_KING:
                return(Chess_LoadUtil.IN_FORT(sqDst) && Chess_LoadUtil.KING_SPAN(sqSrc, sqDst));

            case GameConstant.PIECE_ADVISOR:
                return(Chess_LoadUtil.IN_FORT(sqDst) && Chess_LoadUtil.ADVISOR_SPAN(sqSrc, sqDst));

            case GameConstant.PIECE_BISHOP:
                return(Chess_LoadUtil.SAME_HALF(sqSrc, sqDst) && Chess_LoadUtil.BISHOP_SPAN(sqSrc, sqDst) &&
                       ucpcSquares[Chess_LoadUtil.BISHOP_PIN(sqSrc, sqDst)] == 0);

            case GameConstant.PIECE_KNIGHT:
                sqPin = Chess_LoadUtil.KNIGHT_PIN(sqSrc, sqDst);
                return(sqPin != sqSrc && ucpcSquares[sqPin] == 0);

            case GameConstant.PIECE_ROOK:
            case GameConstant.PIECE_CANNON:
                if (Chess_LoadUtil.SAME_RANK(sqSrc, sqDst))
                {
                    nDelta = (sqDst < sqSrc ? -1 : 1);
                }
                else if (Chess_LoadUtil.SAME_FILE(sqSrc, sqDst))
                {
                    nDelta = (sqDst < sqSrc ? -16 : 16);
                }
                else
                {
                    return(false);
                }
                sqPin = sqSrc + nDelta;
                while (sqPin != sqDst && ucpcSquares[sqPin] == 0)
                {
                    sqPin += nDelta;
                }
                if (sqPin == sqDst)
                {
                    return(pcDst == 0 || pcSrc - pcSelfSide == GameConstant.PIECE_ROOK);
                }
                else if (pcDst != 0 && pcSrc - pcSelfSide == GameConstant.PIECE_CANNON)
                {
                    sqPin += nDelta;
                    while (sqPin != sqDst && ucpcSquares[sqPin] == 0)
                    {
                        sqPin += nDelta;
                    }
                    return(sqPin == sqDst);
                }
                else
                {
                    return(false);
                }

            case GameConstant.PIECE_PAWN:
                Debuger.Log(string.Format("走的炮"));
                if (Chess_LoadUtil.AWAY_HALF(sqDst, sdPlayer) &&
                    (sqDst == sqSrc - 1 || sqDst == sqSrc + 1))
                {
                    return(true);
                }
                return(sqDst == Chess_LoadUtil.SQUARE_FORWARD(sqSrc, sdPlayer));

            default:
                return(false);
            }
        }