中国象棋算法设计.docx
- 文档编号:723703
- 上传时间:2022-10-12
- 格式:DOCX
- 页数:20
- 大小:38.02KB
中国象棋算法设计.docx
《中国象棋算法设计.docx》由会员分享,可在线阅读,更多相关《中国象棋算法设计.docx(20页珍藏版)》请在冰豆网上搜索。
中国象棋算法设计
正文
1、课程设计报告
1.1问题描述
象棋是一种双方对阵的竞技项目。
棋子共有三十二个,分为红黑两组,各有十六个,由对弈的双方各执一组。
兵种是一样的,分为七种:
红方:
红方有帅一个,仕、相、车、马、炮各两个,兵五个。
黑方:
黑方有将一个,士、象、车、马、炮各两个,卒五个。
其中帅与将;仕与士;相与象;兵与卒的作用完全相同,仅仅是为了区别红棋和黑棋而已。
棋子活动的场所,叫作"棋盘"。
在长方形的平面上,绘有九条平行的竖线和十条平行的横线相交组成,共有九十个交叉点,棋子就摆在交叉点上。
中间部分,也就是棋盘的第五,第六两横线之间末画竖线的空白地带称为“河界”。
两端的中间,也就是两端第四条到第六条竖线之间的正方形部位,以斜交叉线构成“米”字方格的地方,叫作“九宫”(它恰好有九个交叉点)。
整个棋盘以“河界”分为相等的两部分。
为了比赛记录和学习棋谱方便起见,现行规则规定:
按九条竖线从右至左用中文数字一-九来表示红方的每条竖线,用阿拉伯数字‘1’~‘9’来表示黑方的每条竖线。
对弈开始之前,红黑双方应该把棋子摆放在规定的位置。
任何棋子每 走一步,进就写“进”,退就写“退”,如果像车一样横着走,就写“平”。
任何棋子在走动时,如果乙方棋子可以到达的位置有对方的棋子,就可以把对方棋子拿出棋盘(称为吃子)而换上自己的棋子。
只有炮的"吃子"方式与它的走法不同:
它和对方棋子之间必须隔一个子(无论是自己的还是对方的),具备此条件才能"吃掉"人家。
一定要注意,中隔一个棋子,这个棋子俗称“炮架子”。
帅和将被吃或不能动弹即输棋。
下面是具体的界面:
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;i<5;i++);x[i][1]=x[10-i][1]=i+10;既从车到帅对应的数为:
11,12,13,14,15;兵为17,炮为16;绿子棋子:
x[i][10]=x[10-i][10]=i+20;既从车到帅对应的数为:
21,22,23,24,25;卒为27,炮为26;具体如下图:
1.4详细设计:
首先对棋盘进行初始化以,然后将每一个棋子给予初值;并将每个棋子放在棋盘对应的位置上,全部初始化完毕后就可以得到一个简易的摆好的象棋棋盘,其中红子的数值小于20,绿子的数值大于20。
而后提示红棋先行,若输入的棋子的数值大于20则继续提示输入红子,若输入正确则根据输入的数值就行走棋规则判断,判断是否可以执行该步走棋。
最后若帅棋对应的15,25被替换则说明一方以输,提示哪方输棋。
对应的走棋规则如下(以红子为例):
根据输入的坐标X1,X2,X3,X4,其中(X1,X2)是棋初始位置的坐标,(X3,X4)是棋终止位置的坐标。
每个棋子到要判断是否(X3,X4)位置上有子,若有则判断其是否大于20,若大于20说明是绿子,可以吃掉走到该位置,否则是自己方的棋子,不能走到该位置,提示重新输入。
车:
若X1=X3说明车是垂直的走,从X2到X4之间若没有子可以走动;水平走同理。
马:
若(X2-X4)=2并且fabs(X1-X3)=1,说明马在对应的棋盘上往下走,若X[X1][X2+1]!
=0,则不能走,俗称“别马腿”。
其它的情况同理。
相:
fabs(x4-x2)=2&&abs(x3-x1)=2,如果,x4>x2,x3>x1&&x[x1+1][x2+1]!
=0,则不能走棋,俗称“别相眼”。
其它的情况同理。
士:
若x3<4或x3>6或x4>3,则不能执行,越界。
fabs(x4-x2-==fabs(x3-x1)==1可以走,否则不能走。
将:
若x3<4或x3>6或x4>3,则不能执行,越界。
fabs(x4-x2)==1&&x3-x1==0||fabs(x3-x1)==1&&x4-x2==0.如果终止位置有子,若x[x3][x4]>20可以走,否则不能走。
炮:
从起始到终止位置,若中间有两个棋子,则不能走,没有棋子可以走,有一个棋子的话,判断x[x3][x4]是否大于20,大于20则可以走,否则不能走。
兵:
若x3=4或x3=5,则棋子不能左右移动,当x3>5时,棋子可以左右移动,但是当x4 程序流程图如下: 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红子的炮吃掉绿子的将,提示为: lvqishule. 经过测试,该程序可以实现中国象棋中所有棋子的走棋规则。 2、源程序 #include #include intx[11][12]; voidmain() { inti,j; intx1,y1,x2,y2,rg,gg; /*初始化棋子(开局)*/ for(i=1;i<=5;i++) {x[i][1]=x[10-i][1]=i+10; x[i][10]=x[10-i][10]=i+20; if(i%2==1) {x[i][4]=x[10-i][4]=17; x[i][7]=x[10-i][7]=27; } } x[2][3]=x[8][3]=16; x[2][8]=x[8][8]=26; for(i=0;i<=9;i++) x[i][0]=i; for(i=1;i<=10;i++) x[0][i]=i; printf("S27\n=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n"); for(j=10;j>=0;j--) {for(i=0;i<=9;i++) { if(i==0) { printf("%2d|",x[i][j]); continue; } if(j==0) { printf("0%d",x[i][j]); continue; } switch(x[i][j]) { case0: printf("");break; case11: printf("车");break; case12: printf("马");break; case13: printf("相");break; case14: printf("士");break; case15: printf("帅");break; case16: printf("炮");break; case17: printf("兵");break; case21: printf("JU");break; case22: printf("MA");break; case23: printf("XN");break; case24: printf("SH");break; case25: printf("JN");break; case26: printf("PO");break; case27: printf("ZU");break; } } if(j==1) printf("|\n---+-------------------------------------\n"); elseif(j==0) printf("\n"); else printf("|\n||\n"); } /*走子*/ for(;;) { /*红子走子*/ for(rg=0;rg==0;) { for(x1=0,y1=0,x2=0,y2=0;x[x1][y1]==0||x[x1][y1]>=20||x2<1||y2<1||x2>9||y2>10||x[x2][y2]<20&&x[x2][y2]>10||x[x2][y2]==x[x1][y1];) { printf("请输入红子坐标(x1,y1,x2,y2): "); scanf("%d,%d,%d,%d",&x1,&y1,&x2,&y2); } if(x[x1][y1]>20) {continue; } rg=rgo(x1,y1,x2,y2); if(rg==0) continue; else {if(x[x2][y2]==25) { x[x2][y2]=x[x1][y1],x[x1][y1]=0; printf("luqishule\n"); } else x[x2][y2]=x[x1][y1],x[x1][y1]=0; } } printf("S27制作\n=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=\n"); for(j=10;j>=0;j--) { for(i=0;i<=9;i++) { if(i==0) { printf("%2d|",x[i][j]); continue; } if(j==0) { printf("0%d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国象棋 算法 设计