已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
正文 1、课程设计报告 1.1问题描述象棋是一种双方对阵的竞技项目。棋子共有三十二个,分为红黑两组,各有十六个,由对弈的双方各执一组。兵种是一样的,分为七种: 红方:红方有帅一个,仕、相、车、马、炮各两个,兵五个。 黑方: 黑方有将一个,士、象、车、马、炮各两个,卒五个。 其中帅与将;仕与士;相与象;兵与卒的作用完全相同,仅仅是为了区别红棋和黑棋而已。 棋子活动的场所,叫作棋盘。在长方形的平面上,绘有九条平行的竖线和十条平行的横线相交组成,共有九十个交叉点,棋子就摆在交叉点上。中间部分,也就是棋盘的第五,第六两横线之间末画竖线的空白地带称为“河界”。两端的中间,也就是两端第四条到第六条竖线之间的正方形部位,以斜交叉线构成“米”字方格的地方,叫作“九宫”(它恰好有九个交叉点)。 整个棋盘以“河界”分为相等的两部分。为了比赛记录和学习棋谱方便起见,现行规则规定:按九条竖线从右至左用中文数字一-九来表示红方的每条竖线,用阿拉伯数字19来表示黑方的每条竖线。对弈开始之前,红黑双方应该把棋子摆放在规定的位置。任何棋子每走一步,进就写“进”,退就写“退”,如果像车一样横着走,就写“平”。 任何棋子在走动时,如果乙方棋子可以到达的位置有对方的棋子,就可以把对方棋子拿出棋盘(称为吃子)而换上自己的棋子。只有炮的吃子方式与它的走法不同:它和对方棋子之间必须隔一个子(无论是自己的还是对方的),具备此条件才能吃掉人家。一定要注意,中隔一个棋子,这个棋子俗称“炮架子”。帅和将被吃或不能动弹即输棋。下面是具体的界面: 1.2需求分析 1、 走棋和吃子对局时,由执红棋的一方先走,双方轮流各走一着,直至分出胜、负、和,对局即终了。轮到走棋的一方,将某个棋子从一个交叉点走到另一个交叉点,或者吃掉对方的棋子而占领其交叉点,都算走一着。双方各走一着,称为一个回合。2、各种棋子的走法帅(将):帅和将是棋中的首脑,是双方竭力争夺的目标。它只能在九宫之内活动,可上可下,可左可右,每次走动只能按竖线或横 线走动一格。帅与将不能在同一直线上直接对面,否则走方判负。仕(士):仕(士)是帅(将)的贴身保镖,它也只能在九宫内走动。它的行棋路径只能是九宫内的斜线。相(象):相(象)的主要作用是防守,保护自己的帅(将)。它的走法是每次循对角线走两格,俗称象走田。相(象)的活动范围限于河界以内的本方阵地,不能过河,且如果它走的田字中央有一个棋子,就不能走,俗称塞象眼。车:车在象棋中威力最大,无论横线、竖线均可行走,只要无子阻拦,步数不受限制。因此,一车可以控制十七个点,故有一车十子寒之称。炮:炮在不吃子的时候,走动与车完全相同。炮与被吃子之间必须隔一个棋子,进行跳吃,俗称架炮或炮打隔子。马:马走动的方法是一直一斜,即先横着或直着走一格,然后再斜着走一个对角线,俗称马走日。马一次可走的选择点可以达到四周的八个点,故有八面威风之说。如果在要去的方向有别的棋子挡住,马就无法走过去,俗称蹩马腿。兵(卒):兵(卒)在未过河前,只能向前一步步走,过河以后,除不能后退外,允许左右移动,但也只能一次一步。3、吃子:任何棋子走动时,如果目标位置上有对方的棋子,就可以把对方的棋子拿出棋盘,再换上自己的棋子(即吃子)。1.3概要设计 首先将棋盘的每一格坐标化,横坐标从01开始到09。纵坐标从01开始到10,初始横坐标01行上摆放红子棋子,01放车、02放马、03放象、04放士、05放帅,06、07、08、09对称放士、象、马、车。横坐标03行02、08列放炮,横坐标04行01、03、05、07、09列放兵。绿子旗子和红子棋子对称放在对面。在这个初始化的坐标上每一个棋子都对应的有一个点,并且对应一个数,红子棋子从车(i=0)开始一直到帅,for(i=0;ix2,x3x1&xx1+1x2+1!=0,则不能走棋,俗称“别相眼”。其它的情况同理。士:若x36或x43,则不能执行,越界。fabs(x4-x2-=fabs(x3-x1)=1可以走,否则不能走。将:若x36或x43,则不能执行,越界。fabs(x4-x2)=1&x3-x1=0|fabs(x3-x1)=1&x4-x2=0. 如果终止位置有子,若xx3x420可以走,否则不能走。炮:从起始到终止位置,若中间有两个棋子,则不能走,没有棋子可以走,有一个棋子的话,判断xx3x4是否大于20,大于20则可以走,否则不能走。兵:若x3=4或x3=5,则棋子不能左右移动,当x35时,棋子可以左右移动,但是当x4x2时,不能走棋,即所谓的“兵不能后退”程序流程图如下: 1.5调试分析:输入03,01,05,03。则马走到05,03的位置,该步可以明显的显示。再输入02,08,05,08,绿子的炮走到05,08的位置,继续输入08,03,05,03红子的炮走动。输入05,08,05,04绿子的炮把红子的中兵吃掉,输入03,01,01,03红子的相走到01,03的位置。输入05,04,04,04绿子的炮走到04,04的位置,输入05,03,05,10红子的炮吃掉绿子的将,提示为:lv qi shu le .经过测试,该程序可以实现中国象棋中所有棋子的走棋规则。2、 源程序 #include#includeint x1112;void main() int i,j; int x1,y1,x2,y2,rg,gg;/*初始化棋子(开局)*/ for(i=1;i=5;i+) xi1=x10-i1=i+10; xi10=x10-i10=i+20; if(i%2=1) xi4=x10-i4=17; xi7=x10-i7=27; x23=x83=16; x28=x88=26; for(i=0;i=9;i+) xi0=i; for(i=1;i=0;j-) for(i=0;i=20|x21|y29|y210|xx2y210|xx2y2=xx1y1;) printf(请输入红子坐标(x1,y1,x2,y2):); scanf(%d,%d,%d,%d,&x1,&y1,&x2,&y2); if(xx1y120) continue; rg=rgo(x1,y1,x2,y2); if(rg=0) continue; else if(xx2y2=25) xx2y2=xx1y1,xx1y1=0; printf(lu qi shu len); else xx2y2=xx1y1,xx1y1=0; printf(S27 制作n=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=n); for(j=10;j=0;j-) for(i=0;i=9;i+) if(i=0) printf(%2d |,xij); continue;if(j=0) printf( 0%d ,xij); continue; switch(xij) case 0 : printf( );break; case 11 : printf( 车 );break; case 12 : printf( 马 );break; case 13 : printf( 相 );break; case 14 : printf( 士 );break; case 15 : printf( 帅 );break; case 16 : printf( 炮 );break; case 17 : printf( 兵 );break; case 21 : printf( JU );break; case 22 : printf( MA );break; case 23 : printf( XN );break; case 24 : printf( SH );break; case 25 : printf( JN );break; case 26 : printf( PO );break; case 27 : printf( ZU );break; if(j=1) printf(|n-+-n); else if(j=0)printf(n); else printf(|n | |n); /*绿子走子*/ for(gg=0;gg=0;) for(x1=0,y1=0,x2=0,y2=0;xx1y110|x21|y29|y210|xx2y220|xx2y2=xx1y1;) printf(请输入绿子坐标(x1,y1,x2,y2):); scanf(%d,%d,%d,%d,&x1,&y1,&x2,&y2); if(xx1y1=0;j-) for(i=0;i=9;i+) if(i=0) printf(%2d |,xij); continue;if(j=0) printf( 0%d ,xij); continue; switch(xij) case 0 : printf( );break; case 11 : printf( 车 );break; case 12 : printf( 马 );break; case 13 : printf( 相 );break; case 14 : printf( 士 );break; case 15 : printf( 帅 );break; case 16 : printf( 炮 );break; case 17 : printf( 兵 );break; case 21 : printf( JU );break; case 22 : printf( MA );break; case 23 : printf( XN );break; case 24 : printf( SH );break; case 25 : printf( JN );break; case 26 : printf( PO );break; case 27 : printf( ZU );break; if(j=1) printf(|n-+-n); else if(j=0)printf(n); else printf(|n | |n); /*判定红棋是否有错*/rgo(xa,ya,xb,yb) if(xxaya=11) /*车*/ int t; if(xb-xa=0) if(ybya) t=yb,yb=ya,ya=t; for(t=1+ya;tyb;t+) if(xxat!=0&xxat20) return 0; else if(yb-ya=0) if(xbxa) t=xb,xb=xa,xa=t; for(t=1+xa;txb;t+) if(xtya!=0&xxat0&xxaya+1!=0) return 0; if(yb-ya0&xxaya-1!=0) return 0; if(xxbyb!=0&xxbyb0&xxa+1ya!=0) return 0; if(xb-xa0&xxa-1ya!=0) return 0; if(xxbyb!=0&xxbyb5) return 0; if(fabs(yb-ya)=2&fabs(xb-xa)=2) if(yb-ya0) if(xb-xa0&xxa+1ya+1!=0) return 0; else if(xb-xa0&xxa+1ya-1!=0) return 0; else if(xb-xa0&xxa-1ya-1!=0) return 0; if(xxbyb!=0&xxbyb20) return 0; else return 0; return 1; if(xxaya=14) /*士*/ if(xb6|yb3) return 0; if(xxbyb!=0&xxbyb20) return 0; if(fabs(yb-ya)=fabs(xb-xa)=1) return 1; else return 0; if(xxaya=15) /*帅*/ if(xb6|yb3) return 0; if(fabs(yb-ya)=1&xb-xa=0)|(fabs(xb-xa)=1&yb-ya=0) return 1; else return 0; if(xxaya=16) /*炮*/ int t,k; if(yb-ya=0) if(xbxa+k;k+) if(xxa+kya!=0) t+; if(t1) return 0; else if(t=0) if(xxbyb=0|xxaya=0) return 1; else return 0; else if(t=1) if(xxbyb20) return 1; else return 0; else if(xb-xa=0) if(ybya+k;k+) if(xxaya+k!=0) t+; if(t1) return 0; else if(t=0) if(xxbyb=0|xxaya=0) return 1; else return 0; else if(t=1) if(xxbyb20) return 1; else return 0; else return 0; if(xxaya=17) /*兵*/ if(yb=ya&fabs(xb-xa)=1|yb-ya=1&xb=xa) if(ya=4|ya=5)&xb!=xa) return 0; if(xxbyb!=0&xxbyb20) return 0; else return 0; return 1; /*判定绿棋是否有错*/ggo(xa,ya,xb,yb) if(xxaya=21) /*车*/ int t; if(xb-xa=0) if(ybya) t=yb,yb=ya,ya=t; for(t=1+ya;t20) return 0; else if(yb-ya=0) if(xbxa) t=xb,xb=xa,xa=t; for(t=1+xa;t20) return 0; else return 0; return 1; if(xxaya=22) /*马*/ if(fabs(yb-ya)=2&fabs(xb-xa)=1) if(yb-ya0&xxaya+1!=0) return 0; if(yb-ya20) return 0; else if(fabs(xb-xa)=2&fabs(yb-ya)=1) if(xb-xa0&xxa+1ya!=0) return 0; if(xb-xa20) return 0; else return 0; return 1; if(xxaya=23) /*相*/ if(yb0) if(xb-xa0&xxa+1ya+1!=0) return 0; else if(xb-xa0&xxa+1ya-1!=0) return 0; else if(xb-xa20) return 0; else return 0; return 1; if(xxaya=24) /*士*/ if(xb6|yb20) return 0; if(fabs(yb-ya)=fabs(xb-xa)=1) return 1; else return 0; if(xxaya=25) /*帅*/ if(xb6|yb8) return 0; if(fabs(yb-ya)=1&xb-xa=0)|(fabs(xb-xa)=1&yb-ya=0) return 1; else return 0; if(xxaya=26) /*炮*/ int t,k; if(yb-ya=0) if(xbxa+k;k+) if(xxa+kya!=0) t+; if(t1) return 0; else if(t=0) if(xxbyb=0|xxaya=0) return 1; else return 0; else if(t=1) if(xxbyb20) return 1; else return 0; else if(xb-xa=0) if(ybya+k;k+) if(xxaya+k!=0) t+; if(t1) return 0; else if(t=0) if(xxbyb=0|xxaya=0) return 1; else return 0; else if(t=1) if(xxbyb20) return 0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 4623-2025环形混凝土电杆
- 2025年初级经济师之初级建筑与房地产经济过关检测试卷B卷附答案
- 2020-2025年高级经济师之工商管理每日一练试卷A卷含答案
- 《制造执行系统实施与应用》 课件 3.2生产优化调度技术
- 大疱性表皮松解症的护理
- 雨课堂学堂在线学堂云《病理生理学(贵州医大 )》单元测试考核答案
- 2025湖南省社会科学院(湖南省人民政府发展研究中心)第二批高层次人才招聘3人参考题库带答案解析
- 2026年机械员之机械员专业管理实务考试题库200道含完整答案(易错题)
- 2026建研院检测中心有限公司校园招聘12人历年真题汇编及答案解析(夺冠)
- 洪雅县关于2025年从服务基层项目等人员中考核招聘乡镇事业单位工作人员历年真题汇编带答案解析
- GB/T 21198.3-2007贵金属合金首饰中贵金属含量的测定ICP光谱法第3部分:钯合金首饰钯含量的测定采用钇为内标
- GB/T 120.1-2000内螺纹圆柱销不淬硬钢和奥氏体不锈钢
- GB 12255-1990药品包装用铝箔
- 血球分析仪销售血球必备知识课件
- Unit5 第二篇课文语法填空练习-高中英语人教版(2019)选择性必修第一册
- 输血科血库作业指导书
- 《植物分类》课件
- 企业内部集资合同
- 职员员工个人月度考勤表
- 护理交接班操作流程图
- 有机化学ppt课件(完整版)
评论
0/150
提交评论