象棋招法CChessMove_第1页
象棋招法CChessMove_第2页
象棋招法CChessMove_第3页
象棋招法CChessMove_第4页
象棋招法CChessMove_第5页
已阅读5页,还剩20页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/ CChessMove.h #include "CChessDef.h" / Data Define / CCHESSMOVE MoveList1280 ; / 存储产生的着法队列 int nMoveCount ; / 存储当前搜索深度已产生的着法数 / Function Prototype / / 判断ptPosition处是否有同一方的子,若有返回true,否则返回false inline bool HaveFriend( POINT ptPosition, int fSide ); / 判断 x, y 处是否有同一方的子,若有返回true,否则返回false inl

2、ine bool HaveFriend( BYTE x, BYTE y, int fSide ); / 判断ptPosition处是否有子,若有返回true,否则返回false inline bool HaveMan( POINT ptPosition ); / 判断 x, y 处是否有子,若有返回true,否则返回false inline bool HaveMan( BYTE x, BYTE y ); / 检查将帅是否碰面,若碰面返回对方王的 y 值坐标,不碰面则返回-1。 / 其中x, y分别为当前走棋方的王所在位置坐标,fSide为当前走棋方 int IsKingFaceToFace(

3、int x, int y, int fSide ); / 产生fSide方所有着法,返回产生的着法总数。nDepth为当前搜索深度,用于传给AddMoveToQueue函数 int GenerateMove( int fSide, int nDepth ); / 将产生的着法加入着法队列。nDepth为当前搜索深度 inline void AddMoveToQueue( POINT ptFrom, POINT ptTo, int nDepth ); / 将产生的着法加入着法队列。nDepth为当前搜索深度 inline void AddMoveToQueue( POINT ptFrom, BY

4、TE x, BYTE y, int nDepth ); / Programmer-Defined Function / inline bool HaveFriend( POINT ptPosition, int fSide ) if( CChessBoardptPosition.xptPosition.y = 0 ) return false; else if( SideOfMan CChessBoardptPosition.xptPosition.y = fSide ) return true; else return false; inline bool HaveFriend( BYTE

5、x, BYTE y, int fSide ) if( CChessBoardxy = 0 ) return false; else if( SideOfMan CChessBoardxy = fSide ) return true; else return false; inline bool HaveMan( POINT ptPosition ) if( CChessBoardptPosition.xptPosition.y = 0 ) return false; else return true; inline bool HaveMan( BYTE x, BYTE y ) if( CChe

6、ssBoardxy = 0 ) return false; else return true; int IsKingFaceToFace( int x, int y, int fSide ) bool bMayKingFaceToFace = false; int i, j ; if( fSide = RED ) for( i = 9; i >= 7; i - ) / 检查黑将是否在同列 if( CChessBoardxi = BLACK_K ) bMayKingFaceToFace = true; break; if( bMayKingFaceToFace = false ) retu

7、rn -1; for( j = y + 1; j <= i - 1 ; j + ) / 黑将在同列,检查中间是否有隔挡 if( CChessBoardxj != 0 ) / 有其他子 return -1; return i; / 将帅碰面,返回黑将的 y 值坐标 else / fSide = BLACK for( i = 0; i <= 2; i + ) / 检查红帅是否在同列 if( CChessBoardxi = RED_K ) bMayKingFaceToFace = true; break; if( bMayKingFaceToFace = false ) return -

8、1; for( j = y - 1; j >= i + 1 ; j - ) / 红帅在同列,检查中间是否有隔挡 if( CChessBoardxj != 0 ) / 有其他子 return -1; return i; / 将帅碰面,返回红帅的 y 值坐标 int GenerateMove( int fSide, int nDepth ) BYTE nCChessID ; POINT ptFrom , ptTo , ptHalf ; int i; nMoveCount = 0; int x, y; for( x = 0; x <= 8; x + ) for( y = 0; y <

9、;= 9; y + ) if( CChessBoardxy != 0 ) nCChessID = CChessBoardxy; if( SideOfMan nCChessID != fSide ) /该子颜色与所要生成着法的颜色不同 continue; ptFrom.x = x ; ptFrom.y = y ; switch( nCChessID ) /=生成红帅的着法 case RED_K: / 将帅碰面 i = IsKingFaceToFace( ptFrom.x, ptFrom.y, fSide ); if( i != -1 ) AddMoveToQueue( ptFrom, ptFro

10、m.x, i, nDepth ); /纵向 ptTo.x = ptFrom.x ; /向前 ptTo.y = ptFrom.y + 1 ; if( ptTo.y <= 2 ) && ( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /向后 ptTo.y = ptFrom.y - 1 ; if( ptTo.y >= 0 ) && ( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDep

11、th ); /横向 ptTo.y = ptFrom.y ; /向左 ptTo.x = ptFrom.x - 1 ; if( ptTo.x >= 3 ) && ( ! HaveFriend( ptTo, fSide ) ) && ( IsKingFaceToFace( ptTo.x, ptTo.y, fSide ) = -1 ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /向右 ptTo.x = ptFrom.x + 1 ; if( ptTo.x <= 5 ) && ( ! HaveFriend

12、( ptTo, fSide ) ) && ( IsKingFaceToFace( ptTo.x, ptTo.y, fSide ) = -1 ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); break; /=生成黑将的着法 case BLACK_K: / 将帅碰面 i = IsKingFaceToFace( ptFrom.x, ptFrom.y, fSide ); if( i != -1 ) AddMoveToQueue( ptFrom, ptFrom.x, i, nDepth ); /纵向 ptTo.x = ptFrom.x ; /向前

13、ptTo.y = ptFrom.y - 1 ; if( ptTo.y >= 7 ) && ( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /向后 ptTo.y = ptFrom.y + 1 ; if( ptTo.y <= 9 ) && ( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /横向 ptTo.y = ptFrom.y ; /向左 ptTo.x = ptF

14、rom.x + 1 ; if( ptTo.x <= 5 ) && ( ! HaveFriend( ptTo, fSide ) ) && ( IsKingFaceToFace( ptTo.x, ptTo.y, fSide ) = -1 ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /向右 ptTo.x = ptFrom.x - 1 ; if( ptTo.x >= 3 ) && ( ! HaveFriend( ptTo, fSide ) ) && ( IsKingFaceToFac

15、e( ptTo.x, ptTo.y, fSide ) = -1 ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); break; /=生成红车的着法 case RED_J: /纵向 ptTo.x = ptFrom.x ; /向前 for( ptTo.y = ptFrom.y + 1; ptTo.y <= 9; ptTo.y + ) if( HaveMan( ptTo ) ) if( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); break; AddMoveTo

16、Queue( ptFrom, ptTo, nDepth ); /向后 for( ptTo.y = ptFrom.y - 1; ptTo.y >= 0; ptTo.y - ) if( HaveMan( ptTo ) ) if( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); break; AddMoveToQueue( ptFrom, ptTo, nDepth ); /横向 ptTo.y = ptFrom.y ; /向左 for( ptTo.x = ptFrom.x - 1; ptTo.x >

17、= 0; ptTo.x - ) if( HaveMan( ptTo ) ) if( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); break; AddMoveToQueue( ptFrom, ptTo, nDepth ); /向右 for( ptTo.x = ptFrom.x + 1; ptTo.x <= 8; ptTo.x + ) if( HaveMan( ptTo ) ) if( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, pt

18、To, nDepth ); break; AddMoveToQueue( ptFrom, ptTo, nDepth ); break; /=生成黑车的着法 case BLACK_J: /纵向 ptTo.x = ptFrom.x ; /向前 for( ptTo.y = ptFrom.y - 1; ptTo.y >= 0; ptTo.y - ) if( HaveMan( ptTo ) ) if( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); break; AddMoveToQueue( ptFrom

19、, ptTo, nDepth ); /向后 for( ptTo.y = ptFrom.y + 1; ptTo.y <= 9; ptTo.y + ) if( HaveMan( ptTo ) ) if( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); break; AddMoveToQueue( ptFrom, ptTo, nDepth ); /横向 ptTo.y = ptFrom.y ; /向左 for( ptTo.x = ptFrom.x + 1; ptTo.x <= 8; ptTo.x +

20、 ) if( HaveMan( ptTo ) ) if( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); break; AddMoveToQueue( ptFrom, ptTo, nDepth ); /向右 for( ptTo.x = ptFrom.x - 1; ptTo.x >= 0; ptTo.x - ) if( HaveMan( ptTo ) ) if( ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth );

21、 break; AddMoveToQueue( ptFrom, ptTo, nDepth ); break; /=生成红马的着法 case RED_M: /ptHalf用来存储马腿的位置,以判断该位置是否有子憋马腿 ptHalf.x = ptFrom.x ; ptHalf.y = ptFrom.y + 1 ; if( ptHalf.y <= 8 && ! HaveMan( ptHalf ) ) /11点方向 ptTo.x = ptFrom.x - 1 ; ptTo.y = ptFrom.y + 2 ; if( ptTo.x >= 0 && ! Hav

22、eFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /1点方向 ptTo.x = ptFrom.x + 1 ; ptTo.y = ptFrom.y + 2 ; if( ptTo.x <= 8 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); ptHalf.x = ptFrom.x + 1 ; ptHalf.y = ptFrom.y ; if( ptHalf.x <= 7 && !

23、 HaveMan( ptHalf ) ) /2点方向 ptTo.x = ptFrom.x + 2 ; ptTo.y = ptFrom.y + 1 ; if( ptTo.y <= 9 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /4点方向 ptTo.x = ptFrom.x + 2 ; ptTo.y = ptFrom.y - 1 ; if( ptTo.y >= 0 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQu

24、eue( ptFrom, ptTo, nDepth ); ptHalf.x = ptFrom.x ; ptHalf.y = ptFrom.y - 1 ; if( ptHalf.y >= 1 && ! HaveMan( ptHalf ) ) /5点方向 ptTo.x = ptFrom.x + 1 ; ptTo.y = ptFrom.y - 2 ; if( ptTo.x <= 8 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /7点方向 ptTo.x =

25、ptFrom.x - 1 ; ptTo.y = ptFrom.y - 2 ; if( ptTo.x >= 0 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); ptHalf.x = ptFrom.x - 1 ; ptHalf.y = ptFrom.y ; if( ptHalf.x >= 1 && ! HaveMan( ptHalf ) ) /8点方向 ptTo.x = ptFrom.x - 2 ; ptTo.y = ptFrom.y - 1 ; if( p

26、tTo.y >= 0 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /10点方向 ptTo.x = ptFrom.x - 2 ; ptTo.y = ptFrom.y + 1 ; if( ptTo.y <= 9 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); break; /=生成黑马的着法 case BLACK_M: /ptHalf用来存储马腿的位置,以判

27、断该位置是否有子憋马腿 ptHalf.x = ptFrom.x ; ptHalf.y = ptFrom.y + 1 ; if( ptHalf.y <= 8 && ! HaveMan( ptHalf ) ) /5点方向 ptTo.x = ptFrom.x - 1 ; ptTo.y = ptFrom.y + 2 ; if( ptTo.x >= 0 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /7点方向 ptTo.x = ptFrom.x + 1 ; pt

28、To.y = ptFrom.y + 2 ; if( ptTo.x <= 8 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); ptHalf.x = ptFrom.x + 1 ; ptHalf.y = ptFrom.y ; if( ptHalf.x <= 7 && ! HaveMan( ptHalf ) ) /8点方向 ptTo.x = ptFrom.x + 2 ; ptTo.y = ptFrom.y + 1 ; if( ptTo.y <= 9 &am

29、p;& ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /10点方向 ptTo.x = ptFrom.x + 2 ; ptTo.y = ptFrom.y - 1 ; if( ptTo.y >= 0 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); ptHalf.x = ptFrom.x ; ptHalf.y = ptFrom.y - 1 ; if( ptHalf.y >=

30、1 && ! HaveMan( ptHalf ) ) /11点方向 ptTo.x = ptFrom.x + 1 ; ptTo.y = ptFrom.y - 2 ; if( ptTo.x <= 8 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /1点方向 ptTo.x = ptFrom.x - 1 ; ptTo.y = ptFrom.y - 2 ; if( ptTo.x >= 0 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); ptHalf.x = ptFrom.x - 1 ; ptHalf.y = ptFrom.y ; if( ptHalf.x >= 1 &&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论