41CGoRule::ENUM_ReturnValue
CGoRule::GoChess(
int ito,
int jto,
int ifrom,
int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
43 ENUM_ReturnValue m_RV;
44 CPiece::ENUM_QiZi goneChessBoard[9][10];
46 m_RV = ChessRule(ito, jto, ifrom, jfrom, ChessBoard);
47 if (m_RV == RETURNTRUE)
49 for (
int i = 0; i < 9; i++)
50 for (
int j = 0; j < 10; j++)
51 goneChessBoard[i][j] = ChessBoard[i][j];
53 goneChessBoard[ito][jto] = goneChessBoard[ifrom][jfrom];
54 goneChessBoard[ifrom][jfrom] = CPiece::NoQiZi;
56 m_RV = JiangJun(ito, jto, goneChessBoard);
76CGoRule::ENUM_ReturnValue CGoRule::ChessRule(
int ito,
int jto,
int ifrom,
int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
78 switch (ChessBoard[ifrom][jfrom])
82 return CheRule(ito, jto, ifrom, jfrom, ChessBoard);
86 return MaRule(ito, jto, ifrom, jfrom, ChessBoard);
90 return XiangRule(ito, jto, ifrom, jfrom, ChessBoard);
94 return ShiRule(ito, jto, ifrom, jfrom, ChessBoard);
98 return ShuaiRule(ito, jto, ifrom, jfrom, ChessBoard);
101 return PaoRule(ito, jto, ifrom, jfrom, ChessBoard);
104 return BingRule(ito, jto, ifrom, jfrom, ChessBoard);
126CGoRule::ENUM_ReturnValue CGoRule::CheRule(
int ito,
int jto,
int ifrom,
int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
132 jfrom += sig(jto - jfrom);
133 if (CPiece::IsExistQiZi(ChessBoard[ifrom][jfrom]) && (jfrom != jto))
142 ifrom += sig(ito - ifrom);
143 if (CPiece::IsExistQiZi(ChessBoard[ifrom][jfrom]) && (ifrom != ito))
166CGoRule::ENUM_ReturnValue CGoRule::MaRule(
int ito,
int jto,
int ifrom,
int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
168 if (abs(ito - ifrom) == 1 && abs(jto - jfrom) == 2)
170 if (CPiece::IsNoQiZi(ChessBoard[ifrom][jfrom + sig(jto - jfrom)]))
175 if (abs(ito - ifrom) == 2 && abs(jto - jfrom) == 1)
177 if (CPiece::IsNoQiZi(ChessBoard[ifrom + sig(ito - ifrom)][jfrom]))
199CGoRule::ENUM_ReturnValue CGoRule::XiangRule(
int ito,
int jto,
int ifrom,
int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
201 if (abs(ito - ifrom) == 2
202 && abs(jfrom - jto) == 2
203 && CPiece::IsNoQiZi(ChessBoard[ifrom + sig(ito - ifrom)][jfrom + sig(jto - jfrom)]))
205 if (jfrom <= 4 && jto <= 4)
207 if (jfrom >= 5 && jto >= 5)
228CGoRule::ENUM_ReturnValue CGoRule::ShiRule(
int ito,
int jto,
int ifrom,
int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
230 if (abs(ifrom - ito) == 1
231 && abs(jfrom - jto) == 1
232 && ito >= 3 && ito <= 5)
234 if (jfrom >= 0 && jfrom <= 2 && jto >= 0 && jto <= 2)
236 if (jfrom >= 7 && jfrom <= 9 && jto >= 7 && jto <= 9)
257CGoRule::ENUM_ReturnValue CGoRule::ShuaiRule(
int ito,
int jto,
int ifrom,
int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
259 if (ito >= 3 && ito <= 5
260 && ((abs(ito - ifrom) == 1 && jto == jfrom)
261 || (abs(jto - jfrom) == 1 && ito == ifrom)))
263 if ( jfrom <= 2 && /*jto >= 0 &&*/ jto <= 2)
265 if (jfrom >= 7 && jto >= 7)
285CGoRule::ENUM_ReturnValue CGoRule::PaoRule(
int ito,
int jto,
int ifrom,
int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
292 jfrom += sig(jto - jfrom);
293 if (CPiece::IsExistQiZi(ChessBoard[ifrom][jfrom]) && (jfrom != jto))
299 if (CPiece::IsNoQiZi(ChessBoard[ito][jto]))
305 if (CPiece::IsNoQiZi(ChessBoard[ito][jto]))
319 ifrom += sig(ito - ifrom);
320 if (CPiece::IsExistQiZi(ChessBoard[ifrom][jfrom]) && (ifrom != ito))
327 if (CPiece::IsNoQiZi(ChessBoard[ito][jto]))
333 if (CPiece::IsNoQiZi(ChessBoard[ito][jto]))
359CGoRule::ENUM_ReturnValue CGoRule::BingRule(
int ito,
int jto,
int ifrom,
int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
361 bool bTopSide =
false;
364 for (
int i = 3; i < 6; i++)
366 for (
int j = 0; j < 3; j++)
368 switch (ChessBoard[i][j])
374 bTopSide = CPiece::IsSameSide(ChessBoard[i][j], ChessBoard[ifrom][jfrom]);
386 if (jto - jfrom == 1 && ito == ifrom)
388 if (jfrom > 4 && abs(ito - ifrom) <= 1 && jto == jfrom)
392 if (jto - jfrom == -1 && ito == ifrom)
394 if (jfrom <= 4 && abs(ito - ifrom) <= 1 && jto == jfrom)
415CGoRule::ENUM_ReturnValue CGoRule::JiangJun(
int ito,
int jto, CPiece::ENUM_QiZi ChessBoard[][10])
417 int iTopShuai = 0, jTopShuai = 0;
418 int iBottomShuai = 0, jBottomShuai = 0;
421 for (iBottomShuai = 3; iBottomShuai < 6; iBottomShuai++)
423 for (jBottomShuai = 7; jBottomShuai < 10; jBottomShuai++)
425 if (CPiece::IsShuai(ChessBoard[iBottomShuai][jBottomShuai]))
435 for (iTopShuai = 3; iTopShuai < 6; iTopShuai++)
437 for (jTopShuai = 0; jTopShuai < 3; jTopShuai++)
439 if (CPiece::IsShuai(ChessBoard[iTopShuai][jTopShuai]))
447 if (!CPiece::IsShuai(ChessBoard[iTopShuai][jTopShuai])
448 || !CPiece::IsShuai(ChessBoard[iBottomShuai][jBottomShuai]))
453 if (iBottomShuai == iTopShuai)
456 while (j != jBottomShuai)
460 if (CPiece::IsExistQiZi(ChessBoard[iTopShuai][j]) && j != jBottomShuai)
472 if (CPiece::IsSameSide(ChessBoard[ito][jto], ChessBoard[iTopShuai][jTopShuai]))
476 for (j = 0; j < 10; j++)
477 if (CPiece::IsOtherSide(ChessBoard[iTopShuai][jTopShuai], ChessBoard[i][j]))
478 if (ChessRule(iTopShuai, jTopShuai, i, j, ChessBoard) == RETURNTRUE)
482 for (i = 0; i < 9; i++)
483 if (CPiece::IsOtherSide(ChessBoard[iTopShuai][jTopShuai], ChessBoard[i][j]))
484 if (ChessRule(iTopShuai, jTopShuai, i, j, ChessBoard) == RETURNTRUE)
488 if (MaJiangJun(iTopShuai, jTopShuai, ChessBoard))
493 for (j = 0; j < 10; j++)
494 if (CPiece::IsOtherSide(ChessBoard[iBottomShuai][jBottomShuai], ChessBoard[i][j]))
495 if (ChessRule(iBottomShuai, jBottomShuai, i, j, ChessBoard) == RETURNTRUE)
498 for (i = 0; i < 9; i++)
499 if (CPiece::IsOtherSide(ChessBoard[iBottomShuai][jBottomShuai], ChessBoard[i][j]))
500 if (ChessRule(iBottomShuai, jBottomShuai, i, j, ChessBoard) == RETURNTRUE)
503 if (MaJiangJun(iBottomShuai, jBottomShuai, ChessBoard))
508 if (CPiece::IsSameSide(ChessBoard[ito][jto], ChessBoard[iBottomShuai][jBottomShuai]))
512 for (j = 0; j < 10; j++)
513 if (CPiece::IsOtherSide(ChessBoard[iBottomShuai][jBottomShuai], ChessBoard[i][j]))
514 if (ChessRule(iBottomShuai, jBottomShuai, i, j, ChessBoard) == RETURNTRUE)
517 for (i = 0; i < 9; i++)
518 if (CPiece::IsOtherSide(ChessBoard[iBottomShuai][jBottomShuai], ChessBoard[i][j]))
519 if (ChessRule(iBottomShuai, jBottomShuai, i, j, ChessBoard) == RETURNTRUE)
522 if (MaJiangJun(iBottomShuai, jBottomShuai, ChessBoard))
527 for (j = 0; j < 10; j++)
528 if (CPiece::IsOtherSide(ChessBoard[iTopShuai][jTopShuai], ChessBoard[i][j]))
529 if (ChessRule(iTopShuai, jTopShuai, i, j, ChessBoard) == RETURNTRUE)
533 for (i = 0; i < 9; i++)
534 if (CPiece::IsOtherSide(ChessBoard[iTopShuai][jTopShuai], ChessBoard[i][j]))
535 if (ChessRule(iTopShuai, jTopShuai, i, j, ChessBoard) == RETURNTRUE)
539 if (MaJiangJun(iTopShuai, jTopShuai, ChessBoard))
547bool CGoRule::MaJiangJun(
int iShuai,
int jShuai,
int iMa,
int jMa, CPiece::ENUM_QiZi ChessBoard[][10])
549 if (CPiece::IsOtherSideMa(ChessBoard[iShuai][jShuai], ChessBoard[iMa][jMa]))
550 if (ChessRule(iShuai, jShuai, iMa, jMa, ChessBoard) == RETURNTRUE)
556bool CGoRule::MaJiangJun(
int iShuai,
int jShuai, CPiece::ENUM_QiZi ChessBoard[][10])
563 if (j >= 0 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
568 if (j < 10 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
573 if (j >= 0 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
578 if (j < 10 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
583 if (j >= 0 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
588 if (j < 10 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
593 if (j >= 0 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
598 if (j < 10 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
CGoRule()
文件名:GoRule.cpp 功 能:走棋规则 编译器:Visual C++ 6.0 作 者:康 林 版 本:1.0.0.1 日 期:2004-10-1 时 间:21:38:52
ENUM_ReturnValue GoChess(int ito, int jto, int ifrom, int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
函数名:GoChess 功 能:判断能否从点(ifrom, jfrom)到点(ito, jto)走棋 参 数: int ito:目标点横坐标[0-8] int jto:目标点纵坐标[0-9] int i...