象棋招法CChessMove_第1頁(yè)
象棋招法CChessMove_第2頁(yè)
象棋招法CChessMove_第3頁(yè)
象棋招法CChessMove_第4頁(yè)
象棋招法CChessMove_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、/ CChessMove.h #include "CChessDef.h" / Data Define / CCHESSMOVE MoveList1280 ; / 存儲(chǔ)產(chǎn)生的著法隊(duì)列 int nMoveCount ; / 存儲(chǔ)當(dāng)前搜索深度已產(chǎn)生的著法數(shù) / 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 ); / 檢查將帥是否碰面,若碰面返回對(duì)方王的 y 值坐標(biāo),不碰面則返回-1。 / 其中x, y分別為當(dāng)前走棋方的王所在位置坐標(biāo),fSide為當(dāng)前走棋方 int IsKingFaceToFace(

3、int x, int y, int fSide ); / 產(chǎn)生fSide方所有著法,返回產(chǎn)生的著法總數(shù)。nDepth為當(dāng)前搜索深度,用于傳給AddMoveToQueue函數(shù) int GenerateMove( int fSide, int nDepth ); / 將產(chǎn)生的著法加入著法隊(duì)列。nDepth為當(dāng)前搜索深度 inline void AddMoveToQueue( POINT ptFrom, POINT ptTo, int nDepth ); / 將產(chǎn)生的著法加入著法隊(duì)列。nDepth為當(dāng)前搜索深度 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 值坐標(biāo) 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 值坐標(biāo) 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用來存儲(chǔ)馬腿的位置,以判斷該位置是否有子憋馬腿 ptHalf.x = ptFrom.x ; ptHalf.y = ptFrom.y + 1 ; if( ptHalf.y <= 8 && ! HaveMan( ptHalf ) ) /11點(diǎn)方向 ptTo.x = ptFrom.x - 1 ; ptTo.y = ptFrom.y + 2 ; if( ptTo.x >= 0 && ! Hav

22、eFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /1點(diǎn)方向 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點(diǎn)方向 ptTo.x = ptFrom.x + 2 ; ptTo.y = ptFrom.y + 1 ; if( ptTo.y <= 9 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /4點(diǎn)方向 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點(diǎn)方向 ptTo.x = ptFrom.x + 1 ; ptTo.y = ptFrom.y - 2 ; if( ptTo.x <= 8 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /7點(diǎn)方向 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點(diǎn)方向 ptTo.x = ptFrom.x - 2 ; ptTo.y = ptFrom.y - 1 ; if( p

26、tTo.y >= 0 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /10點(diǎn)方向 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用來存儲(chǔ)馬腿的位置,以判

27、斷該位置是否有子憋馬腿 ptHalf.x = ptFrom.x ; ptHalf.y = ptFrom.y + 1 ; if( ptHalf.y <= 8 && ! HaveMan( ptHalf ) ) /5點(diǎn)方向 ptTo.x = ptFrom.x - 1 ; ptTo.y = ptFrom.y + 2 ; if( ptTo.x >= 0 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /7點(diǎn)方向 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點(diǎn)方向 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點(diǎn)方向 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點(diǎn)方向 ptTo.x = ptFrom.x + 1 ; ptTo.y = ptFrom.y - 2 ; if( ptTo.x <= 8 && ! HaveFriend( ptTo, fSide ) ) AddMoveToQueue( ptFrom, ptTo, nDepth ); /1點(diǎn)方向 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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論