/// <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);// 返回原来目标格子上的棋子 }
/// <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( )")); }
/// <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); } }