




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年项目管理资格认证的知识点剖析及试题答案
- 电子器件项目可行性研究报告(参考模板)
- 2025年吸污车合作协议书
- 2025年轻质高强复合材料项目发展计划
- 2025年功率变换设备项目合作计划书
- 罐头食品制造企业县域市场拓展与下沉战略研究报告
- 制革环保企业县域市场拓展与下沉战略研究报告
- 胶印设备企业数字化转型与智慧升级战略研究报告
- 粉煤灰泡沫水泥条板企业县域市场拓展与下沉战略研究报告
- 卤钨灯企业ESG实践与创新战略研究报告
- 《服务决定成败》课件
- 2025年金刚石工具项目可行性研究报告
- 医疗器械年度培训计划
- 《定投指数基金有效性的实证探析》17000字(论文)
- 门诊医疗技术操作规范
- 23年贵州省资格复审委托书
- 2025年河北省雄安新区事业单位招聘203人历年高频重点提升(共500题)附带答案详解
- 心肌炎病历模板
- 舞蹈治疗理论与实践-洞察分析
- 退股资金分期退还合同样本
- 自如租赁电子合同范例
评论
0/150
提交评论