中国象棋.docx
- 文档编号:24311624
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:21
- 大小:18.79KB
中国象棋.docx
《中国象棋.docx》由会员分享,可在线阅读,更多相关《中国象棋.docx(21页珍藏版)》请在冰豆网上搜索。
中国象棋
程序实践作业
---中国象棋
三院四队王振军
程序设计目标
编写完成一个可以实现两人对弈的中国象棋程
所完成的程序部分
这次程序实践作业是我和曾喆共同完成编写的。
了解作业内容后我们先在一起统一变量之后,制定了大致的功能分块,并决定每一块均用函数完成功能。
之后根据每一块的难易程度进行了任务简单划分,然后合作探讨完成。
以下是我所负责的模块。
Ⅰ、计算机生成红黑双方以及棋盘。
Ⅱ、各个棋子的移动。
Ⅲ、当危险时显示被“将军”。
所编写程序完成的功能及完成过程介绍
一、计算机生成红黑双方,并在走子的过程中能够使颜色不发生改变。
这一步的实现我首先想到的是定义一个10×9的字符数组,然后对每一个位置进行赋值。
比如a[1][1]=“車”,然后在输出时运用循环对每一位置输出即可。
但实际运用时才突然想到字符数组每一位只有两个字节,而“車”这些字符却需要四个字节,所以根本不能完成赋值,所以不得不放弃自己的这第一个想法。
然后我就想到了老师在上课时经常说的两种状态,比如灯泡的开和关,就是0与非0。
而一个位置有子和没有子也是两种状态,0与非0。
所以就又想到了另外一种解决方案,就是对每一个位置进行赋值,无子为0,有子不同的子对应不同的数字(并且我对双方即使一样的棋子比如黑車红車则赋予不同的值,黑子取值区间是1~7,红子取值区间8~14,这样有利于后面走子时判断是否吃的时自己的子),输出时依次判断每一个位置的值0还是其他值,然后调用函数输出棋子或者棋盘。
然后就要说到所调用的函数了。
我自定义了两个函数,一个shift函数,一个broad函数。
shift函数是在判断一个位置不为0后所调用的函数,所用到的是一个选择分支结构——switch函数来输出该位置的字符,在每一个case后均有一个setcolour函数,这样printf出来的字符颜色就会固定,也就保证了在走子时红子走到黑方棋盘时输出依然是红色。
board函数是在判断一个位置的值是0时调用的函数,由于每个位置的棋盘形状并不相同,所以需要对每个位置所对应的棋盘形状进行编写。
这样才能保证一个原来有棋子的位置棋子走之后在输出到该位置时还能够输出其对应的棋盘。
这两个函数虽然写的时候思路比较清晰,但编写的时候却很是麻烦,需要对每一个位置进行操作。
在输出时棋盘统一用黑色,而双方棋子则分别用黑色和红色。
在这两个函数中,由于前一段对指针的掌握不是很好,所以可以选用了指针的方法。
通过这次大作业,对指针也有了更好的理解。
二、棋子的移动
在移动棋子时,我采用了坐标的方法。
首先让玩家输入要移动的位置,然后输入要走到的位置,判断合法后(一是判断是否吃的是自己的子(即判断前者位置的值与后者位置的值是否在同一取值区间),二是判断走子是否满足规则(这一部分曾喆做的)),将前者的位置的值赋给后者位置,同时将前者位置值赋值为0,再次输出各个位置(在再次输出时我们采用了清屏的函数,使看起来比较舒服)。
三、当危险时显示被“将军”。
这一问题刚开始时毫无思路,要对每一位置进行判定确实比较困难。
后来一想,忽然灵光一现,“将军”局面的发生一般都是在对方走了一步之后才发生将军,所以只需要考虑最后一步时候造成的结果就可以了。
这就将这一步的实现变得相对简单了一点,在每走一步之后,将走之后的位置当做走之前的位置,把老将的位置当做走之后的位置,然后调用规则函数判断这一步是否满足走子规则(只是判断,并不走子),如果满足,说明能够吃到,这个时候就可以显示“将军”了。
编写的程序的完整复制
#include
#include
#include
voidsetcolor(intcolor)
{
HANDLEhc=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hc,0|color);
}
shift(inti)
{
switch(i)
{
case1:
setcolor(240);printf("车");break;
case2:
setcolor(240);printf("马");break;
case3:
setcolor(240);printf("象");break;
case4:
setcolor(240);printf("士");break;
case5:
setcolor(240);printf("帅");break;
case6:
setcolor(240);printf("炮");break;
case7:
setcolor(240);printf("兵");break;
case8:
setcolor(252);printf("車");break;
case9:
setcolor(252);printf("馬");break;
case10:
setcolor(252);printf("相");break;
case11:
setcolor(252);printf("仕");break;
case12:
setcolor(252);printf("将");break;
case13:
setcolor(252);printf("砲");break;
case14:
setcolor(252);printf("卒");break;
}
}
board(intx,inty)
{
if(x==1&&y==1){setcolor(240);printf("┌");}
if(x==1&&y==2){setcolor(240);printf("┬");}
if(x==1&&y==3){setcolor(240);printf("┬");}
if(x==1&&y==4){setcolor(240);printf("┬");}
if(x==1&&y==5){setcolor(240);printf("┬");}
if(x==1&&y==6){setcolor(240);printf("┬");}
if(x==1&&y==7){setcolor(240);printf("┬");}
if(x==1&&y==8){setcolor(240);printf("┬");}
if(x==1&&y==9){setcolor(240);printf("┐");}
if(x==2&&y==1){setcolor(240);printf("├");}
if(x==2&&y==2){setcolor(240);printf("┼");}
if(x==2&&y==3){setcolor(240);printf("┼");}
if(x==2&&y==4){setcolor(240);printf("┼");}
if(x==2&&y==5){setcolor(240);printf("╳");}
if(x==2&&y==6){setcolor(240);printf("┼");}
if(x==2&&y==7){setcolor(240);printf("┼");}
if(x==2&&y==8){setcolor(240);printf("┼");}
if(x==2&&y==9){setcolor(240);printf("┤");}
if(x==3&&y==1){setcolor(240);printf("├");}
if(x==3&&y==2){setcolor(240);printf("╬");}
if(x==3&&y==3){setcolor(240);printf("┼");}
if(x==3&&y==4){setcolor(240);printf("┼");}
if(x==3&&y==5){setcolor(240);printf("┼");}
if(x==3&&y==6){setcolor(240);printf("┼");}
if(x==3&&y==7){setcolor(240);printf("┼");}
if(x==3&&y==8){setcolor(240);printf("╬");}
if(x==3&&y==9){setcolor(240);printf("┤");}
if(x==4&&y==1){setcolor(240);printf("├");}
if(x==4&&y==2){setcolor(240);printf("┼");}
if(x==4&&y==3){setcolor(240);printf("┼");}
if(x==4&&y==4){setcolor(240);printf("┼");}
if(x==4&&y==5){setcolor(240);printf("┼");}
if(x==4&&y==6){setcolor(240);printf("┼");}
if(x==4&&y==7){setcolor(240);printf("┼");}
if(x==4&&y==8){setcolor(240);printf("┼");}
if(x==4&&y==9){setcolor(240);printf("┤");}
if(x==5&&y==1){setcolor(240);printf("├");}
if(x==5&&y==2){setcolor(240);printf("┴");}
if(x==5&&y==3){setcolor(240);printf("┴");}
if(x==5&&y==4){setcolor(240);printf("┴");}
if(x==5&&y==5){setcolor(240);printf("┴");}
if(x==5&&y==6){setcolor(240);printf("┴");}
if(x==5&&y==7){setcolor(240);printf("┴");}
if(x==5&&y==8){setcolor(240);printf("┴");}
if(x==5&&y==9){setcolor(240);printf("┤");}
if(x==6&&y==1){setcolor(240);printf("├");}
if(x==6&&y==2){setcolor(240);printf("┬");}
if(x==6&&y==3){setcolor(240);printf("┬");}
if(x==6&&y==4){setcolor(240);printf("┬");}
if(x==6&&y==5){setcolor(240);printf("┬");}
if(x==6&&y==6){setcolor(240);printf("┬");}
if(x==6&&y==7){setcolor(240);printf("┬");}
if(x==6&&y==8){setcolor(240);printf("┬");}
if(x==6&&y==9){setcolor(240);printf("┤");}
if(x==7&&y==1){setcolor(240);printf("├");}
if(x==7&&y==2){setcolor(240);printf("┼");}
if(x==7&&y==3){setcolor(240);printf("┼");}
if(x==7&&y==4){setcolor(240);printf("┼");}
if(x==7&&y==5){setcolor(240);printf("┼");}
if(x==7&&y==6){setcolor(240);printf("┼");}
if(x==7&&y==7){setcolor(240);printf("┼");}
if(x==7&&y==8){setcolor(240);printf("┼");}
if(x==7&&y==9){setcolor(240);printf("┤");}
if(x==8&&y==1){setcolor(240);printf("├");}
if(x==8&&y==2){setcolor(240);printf("╬");}
if(x==8&&y==3){setcolor(240);printf("┼");}
if(x==8&&y==4){setcolor(240);printf("┼");}
if(x==8&&y==5){setcolor(240);printf("┼");}
if(x==8&&y==6){setcolor(240);printf("┼");}
if(x==8&&y==7){setcolor(240);printf("┼");}
if(x==8&&y==8){setcolor(240);printf("╬");}
if(x==8&&y==9){setcolor(240);printf("┤");}
if(x==9&&y==1){setcolor(240);printf("├");}
if(x==9&&y==2){setcolor(240);printf("┼");}
if(x==9&&y==3){setcolor(240);printf("┼");}
if(x==9&&y==4){setcolor(240);printf("┼");}
if(x==9&&y==5){setcolor(240);printf("╳");}
if(x==9&&y==6){setcolor(240);;printf("┼");}
if(x==9&&y==7){setcolor(240);printf("┼");}
if(x==9&&y==8){setcolor(240);printf("┼");}
if(x==9&&y==9){setcolor(240);printf("┤");}
if(x==10&&y==1){setcolor(240);printf("└");}
if(x==10&&y==2){setcolor(240);printf("┴");}
if(x==10&&y==3){setcolor(240);printf("┴");}
if(x==10&&y==4){setcolor(240);printf("┴");}
if(x==10&&y==5){setcolor(240);printf("┴");}
if(x==10&&y==6){setcolor(240);printf("┴");}
if(x==10&&y==7){setcolor(240);printf("┴");}
if(x==10&&y==8){setcolor(240);printf("┴");}
if(x==10&&y==9){setcolor(240);printf("┘");}
}
firstvalue(int(*p)[10],int(*q)[10])
{
inti,j;
for(i=1;i<=10;i++)
for(j=1;j<=10;j++)
{
*(*(p+i)+j)=0;
*(*(q+i)+j)=0;
}
*(*(p+1)+1)=1;*(*(q+1)+1)=1;
*(*(p+1)+2)=2;*(*(q+1)+2)=2;
*(*(p+1)+3)=3;*(*(q+1)+3)=3;
*(*(p+1)+4)=4;*(*(q+1)+4)=4;
*(*(p+1)+5)=5;*(*(q+1)+5)=5;
*(*(p+1)+6)=4;*(*(q+1)+6)=4;
*(*(p+1)+7)=3;*(*(q+1)+7)=3;
*(*(p+1)+8)=2;*(*(q+1)+8)=2;
*(*(p+1)+9)=1;*(*(q+1)+9)=1;
*(*(p+3)+2)=6;*(*(q+3)+2)=6;
*(*(p+3)+8)=6;*(*(q+3)+8)=6;
for(j=1;j<=9;j=j+2)
{*(*(p+4)+j)=7;*(*(q+4)+j)=7;}
for(j=1;j<=9;j=j+2)
{*(*(p+7)+j)=14;*(*(q+7)+j)=14;}
*(*(p+8)+2)=13;*(*(q+8)+2)=13;
*(*(p+8)+8)=13;*(*(q+8)+8)=13;
*(*(p+10)+1)=8;*(*(q+10)+1)=8;
*(*(p+10)+2)=9;*(*(q+10)+2)=9;
*(*(p+10)+3)=10;*(*(q+10)+3)=10;
*(*(p+10)+4)=11;*(*(q+10)+4)=11;
*(*(p+10)+5)=12;*(*(q+10)+5)=12;
*(*(p+10)+9)=8;*(*(q+10)+9)=8;
*(*(p+10)+8)=9;*(*(q+10)+8)=9;
*(*(p+10)+7)=10;*(*(q+10)+7)=10;
*(*(p+10)+6)=11;*(*(q+10)+6)=11;
}
intcheckche(intk,intt,intm,intn,int(*p)[10])
{
inti,j=1;
if(k>m)
{
i=k;k=m;m=i;
}
if(t>n)
{
i=t;t=n;n=i;
}
if(k==m)
{
for(i=t+1;i { if(*(*(p+k)+i)! =0) { j=-1;break; } } } if(t==n) { for(i=k+1;i { if(*(*(p+i)+n)! =0) { j=-1;break; } } } if(k! =m&&t! =n) j=-1; returnj; } intcheckma(intk,intt,intm,intn,int(*p)[10]) { inti,j=1; inth,x; if((k-m)*(k-m)+(t-n)*(t-n)! =5) { j=-1; } else { if(fabs(k-m)==1) { x=(t+n)/2; if(*(*(p+k)+x)! =0) { j=-1; } } if(fabs(t-n)==1) { x=(k+m)/2; if(*(*(p+x)+t)! =0) j=-1; }} returnj; } intcheckxiang(intk,intt,intm,intn,int(*p)[10]) { intj=1,x,y; if(k<=5) { if(m>5) j=-1; } if(k>5) { if(m<5) j=-1; } if(fabs(k-m)! =2&&fabs(t-n)! =2) j=-1; else { x=(k+m)/2;y=(t+n)/2; if(*(*(p+x)+y)! =0) j=-1; } returnj; } intcheckshi(intk,intt,intm,intn,int(*p)[10]) { intj=1,x; if(fabs(k-m)! =1||fabs(t-n)! =1) j=-1; if(k<=3) { if(m>3||n<4||n>6) j=-1; } if(k>=8) { if(m<8||n<4||n>6) j=-1; } returnj; } intcheckshuai(intk,intt,intm,intn,int(*p)[10]) { intj=1; if(k==m&&fabs(t-n)! =1||fabs(k-m)! =1&&t==n) j=-1; if(k! =m&&t! =n) j=-1; returnj; } intcheckpao(intk,intt,intm,intn,int(*p)[10]) { intx=0,i,j=1,f; if(*(*(p+m)+n)==0) f=0; if(*(*(p+k)+t)<=7&&f==0) { if(*(*(p+m)+n)>=8) j=-1; } if(*(*(p+k)+t)>=8&&f==0) { if(*(*(p+m)+n)<=7&&*(*(p+m)+n)>0) j=-1; } if(k>m) { i=k;k=m;m=i; } if(t>n) { i=t;t=n;n=i; } if(k==m) { for(i=t+1;i { if(*(*(p+k)+i)! =0) x++; } } if(t==n) { for(i=k+1;i { if(*(*(p+i)+t)! =0) x++; } } if(x>=2) j=-1; if(x==1&&f==0) j=-1; if(k! =m&&t! =n) j=-1; returnj; } intcheckbing(intk,intt,intm,intn,int(*p)[10]) { intj=1,i; if(k==m&&fabs(n-t)! =1||fabs(m-k)! =1&&t==n) j=-1; if(*(*(p+k)+t)==7) { if(k>m) j=-1; if(k<=5&&t! =n) j=-1; if(k>=6&&fabs(m-k)+fabs(t-n)>=2) j=-1; } if(*(*(p+k)+t)==14) { if(k>=6&&t! =n) j=-1; if(k j=-1; if(k<6&&fabs(m-k)+fabs(t-n)>=2) j=-1; } returnj; } intcheckwin(int(*p)[10]) { inti,j,h=0,x=0; for(i=1;i<=3;i++) for(j=4;j<=6;j++) { if(*(*(p+i)+j)==5) { h=1; } } for(i=8;i<=10;i++) for(j=4;j<=6;j++) if(*(*(p+i)+j)==12) { x=1; } if(h==0&&x==1) { print
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中国象棋