中国象棋控件 v2.0.13
载入中...
搜索中...
未找到
GoRule.cpp
1
11#include "GoRule.h"
12#include <stdlib.h>
13#include "Common.h"
14
16// Construction/Destruction
18
21
22CGoRule::~CGoRule()
23{}
24
25
41CGoRule::ENUM_ReturnValue CGoRule::GoChess(int ito, int jto, int ifrom, int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
42{
43 ENUM_ReturnValue m_RV;
44 CPiece::ENUM_QiZi goneChessBoard[9][10];
45
46 m_RV = ChessRule(ito, jto, ifrom, jfrom, ChessBoard);
47 if (m_RV == RETURNTRUE)
48 {
49 for (int i = 0; i < 9; i++)
50 for (int j = 0; j < 10; j++)
51 goneChessBoard[i][j] = ChessBoard[i][j];
52 //假设走棋
53 goneChessBoard[ito][jto] = goneChessBoard[ifrom][jfrom];
54 goneChessBoard[ifrom][jfrom] = CPiece::NoQiZi;
55 //判断将对面、叫将、将军
56 m_RV = JiangJun(ito, jto, goneChessBoard);
57 }
58
59 return m_RV;
60}
61
62
76CGoRule::ENUM_ReturnValue CGoRule::ChessRule(int ito, int jto, int ifrom, int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
77{
78 switch (ChessBoard[ifrom][jfrom])
79 {
80 case CPiece::BChe:
81 case CPiece::RChe:
82 return CheRule(ito, jto, ifrom, jfrom, ChessBoard);
83 break;
84 case CPiece::BMa:
85 case CPiece::RMa:
86 return MaRule(ito, jto, ifrom, jfrom, ChessBoard);
87 break;
88 case CPiece::BXiang:
89 case CPiece::RXiang:
90 return XiangRule(ito, jto, ifrom, jfrom, ChessBoard);
91 break;
92 case CPiece::BShi:
93 case CPiece::RShi:
94 return ShiRule(ito, jto, ifrom, jfrom, ChessBoard);
95 break;
96 case CPiece::BShuai:
97 case CPiece::RShuai:
98 return ShuaiRule(ito, jto, ifrom, jfrom, ChessBoard);
99 case CPiece::BPao:
100 case CPiece::RPao:
101 return PaoRule(ito, jto, ifrom, jfrom, ChessBoard);
102 case CPiece::BBing:
103 case CPiece::RBing:
104 return BingRule(ito, jto, ifrom, jfrom, ChessBoard);
105 default:
106 return RETURNFALSE;
107 }
108 return RETURNTRUE;
109}
110
111
126CGoRule::ENUM_ReturnValue CGoRule::CheRule(int ito, int jto, int ifrom, int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
127{
128 if (ito == ifrom)
129 {
130 while (jfrom != jto)
131 {
132 jfrom += sig(jto - jfrom);
133 if (CPiece::IsExistQiZi(ChessBoard[ifrom][jfrom]) && (jfrom != jto))
134 return RETURNFALSE;
135 }
136 return RETURNTRUE;
137 }
138 if (jto == jfrom)
139 {
140 while (ifrom != ito)
141 {
142 ifrom += sig(ito - ifrom);
143 if (CPiece::IsExistQiZi(ChessBoard[ifrom][jfrom]) && (ifrom != ito))
144 return RETURNFALSE;
145 }
146 return RETURNTRUE;
147 }
148 return RETURNFALSE;
149}
150
151
166CGoRule::ENUM_ReturnValue CGoRule::MaRule(int ito, int jto, int ifrom, int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
167{
168 if (abs(ito - ifrom) == 1 && abs(jto - jfrom) == 2)
169 {
170 if (CPiece::IsNoQiZi(ChessBoard[ifrom][jfrom + sig(jto - jfrom)]))
171 return RETURNTRUE;
172 else
173 return RETURNFALSE;
174 }
175 if (abs(ito - ifrom) == 2 && abs(jto - jfrom) == 1)
176 {
177 if (CPiece::IsNoQiZi(ChessBoard[ifrom + sig(ito - ifrom)][jfrom]))
178 return RETURNTRUE;
179 else
180 return RETURNFALSE;
181 }
182 return RETURNFALSE;
183}
184
185
199CGoRule::ENUM_ReturnValue CGoRule::XiangRule(int ito, int jto, int ifrom, int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
200{
201 if (abs(ito - ifrom) == 2
202 && abs(jfrom - jto) == 2
203 && CPiece::IsNoQiZi(ChessBoard[ifrom + sig(ito - ifrom)][jfrom + sig(jto - jfrom)]))
204 {
205 if (jfrom <= 4 && jto <= 4)
206 return RETURNTRUE;
207 if (jfrom >= 5 && jto >= 5)
208 return RETURNTRUE;
209 }
210
211 return RETURNFALSE;
212}
213
214
228CGoRule::ENUM_ReturnValue CGoRule::ShiRule(int ito, int jto, int ifrom, int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
229{
230 if (abs(ifrom - ito) == 1
231 && abs(jfrom - jto) == 1
232 && ito >= 3 && ito <= 5)
233 {
234 if (jfrom >= 0 && jfrom <= 2 && jto >= 0 && jto <= 2)
235 return RETURNTRUE;
236 if (jfrom >= 7 && jfrom <= 9 && jto >= 7 && jto <= 9)
237 return RETURNTRUE;
238 }
239
240 return RETURNFALSE;
241}
242
243
257CGoRule::ENUM_ReturnValue CGoRule::ShuaiRule(int ito, int jto, int ifrom, int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
258{
259 if (ito >= 3 && ito <= 5
260 && ((abs(ito - ifrom) == 1 && jto == jfrom)
261 || (abs(jto - jfrom) == 1 && ito == ifrom)))
262 {
263 if (/*jfrom >= 0 &&*/ jfrom <= 2 && /*jto >= 0 &&*/ jto <= 2)
264 return RETURNTRUE;
265 if (jfrom >= 7 /*&& jfrom <= 9 */ && jto >= 7/* && jto <= 9*/)
266 return RETURNTRUE;
267 }
268 return RETURNFALSE;
269}
270
271
285CGoRule::ENUM_ReturnValue CGoRule::PaoRule(int ito, int jto, int ifrom, int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
286{
287 if (ito == ifrom)
288 {
289 int iNum = 0;
290 while (jfrom != jto)
291 {
292 jfrom += sig(jto - jfrom);
293 if (CPiece::IsExistQiZi(ChessBoard[ifrom][jfrom]) && (jfrom != jto))
294 iNum++;
295 }
296 switch (iNum)
297 {
298 case 0:
299 if (CPiece::IsNoQiZi(ChessBoard[ito][jto]))
300 return RETURNTRUE;
301 else
302 return RETURNFALSE;
303 break;
304 case 1:
305 if (CPiece::IsNoQiZi(ChessBoard[ito][jto]))
306 return RETURNFALSE;
307 else
308 return RETURNTRUE;
309 break;
310 default:
311 return RETURNFALSE;
312 }
313 }
314 if (jto == jfrom)
315 {
316 int iNum = 0;
317 while (ifrom != ito)
318 {
319 ifrom += sig(ito - ifrom);
320 if (CPiece::IsExistQiZi(ChessBoard[ifrom][jfrom]) && (ifrom != ito))
321 iNum++;
322
323 }
324 switch (iNum)
325 {
326 case 0:
327 if (CPiece::IsNoQiZi(ChessBoard[ito][jto]))
328 return RETURNTRUE;
329 else
330 return RETURNFALSE;
331 break;
332 case 1:
333 if (CPiece::IsNoQiZi(ChessBoard[ito][jto]))
334 return RETURNFALSE;
335 else
336 return RETURNTRUE;
337 break;
338 default:
339 return RETURNFALSE;
340 }
341 }
342 return RETURNFALSE;
343}
344
345
359CGoRule::ENUM_ReturnValue CGoRule::BingRule(int ito, int jto, int ifrom, int jfrom, CPiece::ENUM_QiZi ChessBoard[][10])
360{
361 bool bTopSide = false;
362 bool bExit = false;
363 // 判断是否与上面的士、帅是同一边的
364 for (int i = 3; i < 6; i++)
365 {
366 for (int j = 0; j < 3; j++)
367 {
368 switch (ChessBoard[i][j])
369 {
370 case CPiece::RShuai:
371 case CPiece::RShi:
372 case CPiece::BShuai:
373 case CPiece::BShi:
374 bTopSide = CPiece::IsSameSide(ChessBoard[i][j], ChessBoard[ifrom][jfrom]);
375 bExit = true;
376 break;
377 default:
378 break;
379 }
380 }
381 if (bExit)
382 break;
383 }
384 if (bTopSide)
385 {
386 if (jto - jfrom == 1 && ito == ifrom)
387 return RETURNTRUE;
388 if (jfrom > 4 && abs(ito - ifrom) <= 1 && jto == jfrom)
389 return RETURNTRUE;
390 }
391 else {
392 if (jto - jfrom == -1 && ito == ifrom)
393 return RETURNTRUE;
394 if (jfrom <= 4 && abs(ito - ifrom) <= 1 && jto == jfrom)
395 return RETURNTRUE;
396 }
397 return RETURNFALSE;
398}
399
400
415CGoRule::ENUM_ReturnValue CGoRule::JiangJun(int ito, int jto, CPiece::ENUM_QiZi ChessBoard[][10])
416{
417 int iTopShuai = 0, jTopShuai = 0;
418 int iBottomShuai = 0, jBottomShuai = 0;
419 bool bExit = false;
420 //找底下的帅的位置
421 for (iBottomShuai = 3; iBottomShuai < 6; iBottomShuai++)
422 {
423 for (jBottomShuai = 7; jBottomShuai < 10; jBottomShuai++)
424 {
425 if (CPiece::IsShuai(ChessBoard[iBottomShuai][jBottomShuai]))
426 {
427 bExit = true;
428 break;
429 }
430 }
431 if (bExit) break;
432 }
433 bExit = false;
434 //找上面的帅的位置
435 for (iTopShuai = 3; iTopShuai < 6; iTopShuai++)
436 {
437 for (jTopShuai = 0; jTopShuai < 3; jTopShuai++)
438 {
439 if (CPiece::IsShuai(ChessBoard[iTopShuai][jTopShuai]))
440 {
441 bExit = true;
442 break;
443 }
444 }
445 if (bExit) break;
446 }
447 if (!CPiece::IsShuai(ChessBoard[iTopShuai][jTopShuai])
448 || !CPiece::IsShuai(ChessBoard[iBottomShuai][jBottomShuai]))
449 return JIANGBEICHI; //没找到帅,被吃了
450
451 //判断将对面
452 int i = 0, j = 0;
453 if (iBottomShuai == iTopShuai)
454 {
455 j = jTopShuai;
456 while (j != jBottomShuai)
457 {
458 j++;
459 //判断中间是否有子
460 if (CPiece::IsExistQiZi(ChessBoard[iTopShuai][j]) && j != jBottomShuai)
461 {
462 i++;
463 break;
464 }
465 }
466 if (i == 0)
467 return JIANGDUIMIAN;
468 }
469
470 // 必须是先判断被将军,再判断将军
471 // 当前棋子是上面这一边的
472 if (CPiece::IsSameSide(ChessBoard[ito][jto], ChessBoard[iTopShuai][jTopShuai]))
473 {
474 //被(车,炮,兵)将
475 i = iTopShuai;
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)
479 return BEIJIANGJUN;
480
481 j = jTopShuai;
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)
485 return BEIJIANGJUN;
486
487 //被马将
488 if (MaJiangJun(iTopShuai, jTopShuai, ChessBoard))
489 return BEIJIANGJUN;
490
491 //车、炮、兵将军
492 i = iBottomShuai;
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)
496 return JIANGJUN;
497 j = jBottomShuai;
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)
501 return JIANGJUN;
502 //马将军
503 if (MaJiangJun(iBottomShuai, jBottomShuai, ChessBoard))
504 return JIANGJUN;
505 }
506
507 //当前棋子是下面这一边的
508 if (CPiece::IsSameSide(ChessBoard[ito][jto], ChessBoard[iBottomShuai][jBottomShuai]))
509 {
510 //被(车、炮、兵)将军
511 i = iBottomShuai;
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)
515 return BEIJIANGJUN;
516 j = jBottomShuai;
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)
520 return BEIJIANGJUN;
521 //被马将
522 if (MaJiangJun(iBottomShuai, jBottomShuai, ChessBoard))
523 return BEIJIANGJUN;
524
525 //(车,炮,兵)将
526 i = iTopShuai;
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)
530 return JIANGJUN;
531
532 j = jTopShuai;
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)
536 return JIANGJUN;
537
538 //马将
539 if (MaJiangJun(iTopShuai, jTopShuai, ChessBoard))
540 return JIANGJUN;
541 }
542
543 return RETURNTRUE;
544}
545
546// 马将军
547bool CGoRule::MaJiangJun(int iShuai, int jShuai, int iMa, int jMa, CPiece::ENUM_QiZi ChessBoard[][10])
548{
549 if (CPiece::IsOtherSideMa(ChessBoard[iShuai][jShuai], ChessBoard[iMa][jMa]))
550 if (ChessRule(iShuai, jShuai, iMa, jMa, ChessBoard) == RETURNTRUE)
551 return true;
552 return false;
553}
554
555// 判断被马将军
556bool CGoRule::MaJiangJun(int iShuai, int jShuai, CPiece::ENUM_QiZi ChessBoard[][10])
557{
558 int i = 0;
559 int j = 0;
560
561 i = iShuai - 1;
562 j = jShuai - 2;
563 if (j >= 0 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
564 return true;
565
566 i = iShuai - 1;
567 j = jShuai + 2;
568 if (j < 10 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
569 return true;
570
571 i = iShuai + 1;
572 j = jShuai - 2;
573 if (j >= 0 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
574 return true;
575
576 i = iShuai + 1;
577 j = jShuai + 2;
578 if (j < 10 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
579 return true;
580
581 i = iShuai - 2;
582 j = jShuai - 1;
583 if (j >= 0 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
584 return true;
585
586 i = iShuai - 2;
587 j = jShuai + 1;
588 if (j < 10 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
589 return true;
590
591 i = iShuai + 2;
592 j = jShuai - 1;
593 if (j >= 0 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
594 return true;
595
596 i = iShuai + 2;
597 j = jShuai + 1;
598 if (j < 10 && MaJiangJun(iShuai, jShuai, i, j, ChessBoard))
599 return true;
600
601 return false;
602}
CGoRule()
文件名:GoRule.cpp 功 能:走棋规则 编译器:Visual C++ 6.0 作 者:康 林 版 本:1.0.0.1 日 期:2004-10-1 时 间:21:38:52
Definition GoRule.cpp:19
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...
Definition GoRule.cpp:41