做了一周,用def C++搞了个实现双人对抗的象棋小程序,泻药,已经是在笑带学生惹。欢迎白嫖,欢迎各位大佬指点问题,欢迎提问,原理是用一个二维数组当棋盘,玩家输入来控制棋子的移动,下棋方式是输入两个坐标,用逗号隔开,系统判断输入的位置是否符合该棋子的移动逻辑。胜利条件是吃掉对方的将,演示如下
开局先输入两位玩家的名字,准备好了输入1就开始游戏,输入0还能重新更改名字(这里不演示了),第二位输入的玩家先手,当然也可以在开始游戏的时候输入‘q’ ,先手的玩家自动跳过一回合,轮到下一位玩家开始下棋
棋盘显示棋子种类个数,以及谁的回合,控制的是哪一方的棋子比较直观显示出来
输入的格式如下,比如我(帥阵营)开局想炮二平五(架中炮)应该这样输入
从8行2列坐标,移动到8行5列坐标(注意!!不支持中文逗号)。此时棋盘是这样的,其实我也想做炮二平五的中文输入...下次一定吧,等1.1版本呗(说真的
而在二维数组中的储存是这样的
我做了一个debug的函数可以随时把这个二维数组输出出来,主要作用还是在开发的时候看看坐标有没有错,棋子是否移动了位置而又发出警报,移动位置有没有到达预期之类的错误
这个debug函数主要作用,把这个二维数组的储存的字符串都输出出来,原理如下:
int debug(int size1,char size[size1+1][size1])//测试函数
{
int i,j;//行列
for(i=0;i<10;i++)//棋盘行
{
for(j=0;j<9;j++)//棋盘列
{
printf("%c ",size[i][j]);
}
printf("n");
}
}
而输出到棋盘上,还要进行美化,美化的部分结构方法如下:
原理就是,打个比方,我检测到了这里有一粒石头,于是我向上面报告说这里有一块大蛋糕,这样,原本不好看的东西,就因为我们而让他变好看了。
红芝鸟玩家跳马
答火鸡玩家也跳马,注意,虽然傌在行为10的坐标,此时输入会多出来一个三位数,但是这是没问题的,演示如下
系统会自动分辨出坐标是几位数,并作出判断你想要移动的方式
吃子的判定如下,先让对面方跳个象
稍微提一下,每个棋子我都做了相应的移动限制,不合理的移动会有提示的
炮吃兵(这里只是作为演示,现实中可别这样学我下棋)输入演示如下
棋盘变化如下
此时下方棋子数也跟着变少了
此时将军了是吧,此时我们让红鸟玩家走一步闲棋来进行我们的胜利判定
OK已经胜利了,此时输入1,重新开始一局新游戏,输入0结束游戏
这里就不展开了,代码如下,欢迎白嫖,有问题也欢迎一起讨论丫
#include#include #include typedef struct Player//定义玩家信息 { char name[16];//姓名 int coinCount;//棋子数量 int s;//将,士,象,马,炮,车 ,兵 int i; int x; int m; int c; int p; int b; int first;//先手后手 int camp;//阵营,将,帥 }play; play Player[2];//定义两个玩家 char size[10][9];//定义b p c m x i s 棋子的棋盘 int main() { printf("-----欢迎使用象棋小程序-----n"); int sizePu(int size1,char size[size1+1][size1]);//输出当前棋盘 int sizeNew(int size1,char size[size1+1][size1]);//新棋盘 int sizeCol(int size1,char size[size1+1][size1],char coin[10]);//下棋控制的棋子 int length(char coin[]);//判断长度的方法 int camps(int i);//判断阵营 int i,j;//临时变量 行,列 for(i=0;i<2;i++)//输入姓名,开始游戏 { printf("请输入第%d位玩家姓名:",i+1); scanf("%s",Player[i].name); printf("%s玩家做好准备!!nn",Player[i].name); } //区分阵营 Player[0].camp=0;//将 Player[1].camp=1;//帥 do{//做开始游戏准备 i=0; printf("------现在开始游戏吗?(1 or 0)------n"); scanf("%d",&i); if(i==0) { for(j=0;j<2;j++)//输入姓名,开始游戏 { printf("n请重新输入第%d位玩家姓名:",j+1); scanf("%s",Player[j].name); printf("%s玩家做好准备!!nn",Player[j].name); Player[j].coinCount=16; } } else if(i!=1&&i!=0)printf("请重新输入n"); }while(i!=1); printf("------------------------首局--------------------------nn"); //int debug(int size1,char size[size1+1][size1]);//测试函数 //debug(9,size);//测试函数 int star=0;//游戏进行条件 int player=1;//1,2玩家循环输入 char coin[10];//玩家输入 int trans;//交换先后手 int p1=0,p2=0;//游戏比分 int game=0;//游戏局数 printf("n--------------------%s玩家先手----------------------n",Player[player].name); Player[0].first=0;//先手1,后手0 Player[1].first=1;//先手1,后手0 sizeNew(9,size);//整理棋盘 sizePu(9,size);//输出棋盘 do{//比赛判断 printf("n%s玩家回合n",Player[player].name);//下棋开始 printf("你的棋局是:");//局势判断 camps(Player[player].camp);//判断阵营 printf("n你的步骤为(上步坐标,下步坐标):");//输入提示 scanf("%s",coin);//读取玩家输入 if(coin[0]=='q')//跳过这个玩家的回合 Debug快速下棋用 { camps(Player[player].camp);//判断阵营 printf("玩家跳过本回合下一步n"); player++; if(player==2)//使player循环,1,2玩家 player=0; trans=Player[0].first; Player[0].first=Player[1].first; Player[1].first=trans;//交换1,2玩家先后顺序,全局变量 sizePu(9,size);//输出棋盘 continue; } if(length(coin)<5||length(coin)>7) { printf("n请重新输入n"); continue; } if(sizeCol(9,size,coin)==1)//下棋控制的棋子) { printf("坐标出错,请重新输入n"); continue; } player++; if(player==2)//使player循环,1,2玩家 player=0; trans=Player[0].first; Player[0].first=Player[1].first; Player[1].first=trans;//交换1,2玩家先后顺序,全局变量 sizePu(9,size);//输出棋盘 for(i=0;i<2;i++)//判断胜负 { if(Player[i].s==0)//将被吃了 { sizePu(9,size);//输出棋盘 if(i==0)//帥 { //Player[i].camp=3; //Player[i+1].camp=1; printf("nn----------------------%s玩家胜利----------------------nn",Player[i+1].name); } else if(i==1)//将 { //Player[i].camp=2; //Player[i-1].camp=0; printf("nn----------------------%s玩家胜利----------------------nn",Player[i-1].name); } game+=1;//玩了一把游戏 printf("n-------------------------是否继续游戏?-------------------------n"); printf("n------------------- 1 or 0 ---------------------n"); int k=0;//判断输入合法性 do{ scanf("%s",coin);//读取玩家输入 if(coin[0]=='1')//开始新回合 { k=1; sizeNew(9,size);//整理棋盘 sizePu(9,size);//输出棋盘 } else if(coin[0]=='0') { k=1; printf("游戏结束"); star=1; } else printf("n请重新输入:"); }while(k!=1); } } }while(star!=1);//游戏结束 printf("n感谢你的游玩"); return 0; } int sizeNew(int size1,char size[size1+1][size1])//新棋盘的布局 { int i,j;//行,列 for(i=0;i<10;i++) { for(j=0;j<9;j++) { switch(i) { case 0: { //玩家1 switch(j) {//车,马,象,士,帅,士,象,马,车 (第1排 case 0:size[i][j]='c'; break; case 1:size[i][j]='m'; break; case 2:size[i][j]='x'; break; case 3:size[i][j]='i'; break; case 4:size[i][j]='s'; break; case 5:size[i][j]='i'; break; case 6:size[i][j]='x'; break; case 7:size[i][j]='m'; break; case 8:size[i][j]='c'; }break; } case 2: { switch(j) {//炮(第2排 case 1:size[i][j]='p'; break; case 7:size[i][j]='p'; break; default:size[i][j]='+'; } }break; case 3: { switch(j) {//兵(第4排 case 0:size[i][j]='b'; break; case 2:size[i][j]='b'; break; case 4:size[i][j]='b'; break; case 6:size[i][j]='b'; break; case 8:size[i][j]='b'; break; default:size[i][j]='+'; } }break; //玩家2 case 6: { switch(j) {//兵(第6排 case 0:size[i][j]='B'; break; case 2:size[i][j]='B'; break; case 4:size[i][j]='B'; break; case 6:size[i][j]='B'; break; case 8:size[i][j]='B'; break; default:size[i][j]='+'; } }break; case 7: { switch(j) {//炮(第7排 case 1:size[i][j]='P'; break; case 7:size[i][j]='P'; break; default:size[i][j]='+'; } }break; case 9: { //玩家1 switch(j) {//车,马,象,士,帅,士,象,马,车 (第9排 case 0:size[i][j]='C'; break; case 1:size[i][j]='M'; break; case 2:size[i][j]='X'; break; case 3:size[i][j]='I'; break; case 4:size[i][j]='S'; break; case 5:size[i][j]='I'; break; case 6:size[i][j]='X'; break; case 7:size[i][j]='M'; break; case 8:size[i][j]='C'; }break; } default:size[i][j]='+'; } } } } int sizePu(int size1,char size[size1+1][size1])//输出当前棋盘 ,美化输出 { int i,j;//行,列 int sizes();//判断棋子的类型 大小写 int sizee();//判断棋子的后手类型 int later;//后手变量 int first;//先手变量 first=sizes();//判断谁先手 later=sizee();//判断谁后手 for(i=0;i<2;i++)//清空输入 { Player[i].coinCount=0;//将,士,象,马,炮,车 ,兵 Player[i].s=0; Player[i].i=0; Player[i].x=0; Player[i].m=0; Player[i].c=0; Player[i].p=0; Player[i].b=0; } if((Player[first].camp==0)||(Player[first].camp==2))//将 { printf("|"); for(i=0;i<9;i++) { printf("---%d--",i+1); } printf("|n");//1-9坐标位置 for(i=0;i<10;i++) { printf("|"); for(j=0;j<9;j++) { switch(size[i][j]) {//黑棋 case 'b':printf("-(卒)-");Player[first].b+=1;break; case 'p':printf("-(砲)-");Player[first].p+=1;break; case 'c':printf("-(車)-");Player[first].c+=1;break; case 'm':printf("-(馬)-");Player[first].m+=1;break; case 'x':printf("-(象)-");Player[first].x+=1;break; case 'i':printf("-(士)-");Player[first].i+=1;break; case 's':printf("-(将)-");Player[first].s+=1;break; //红棋 case 'B':printf("-(兵)-");Player[later].b+=1;break; case 'P':printf("-(炮)-");Player[later].p+=1;break; case 'C':printf("-(车)-");Player[later].c+=1;break; case 'M':printf("-(傌)-");Player[later].m+=1;break; case 'X':printf("-(相)-");Player[later].x+=1;break; case 'I':printf("-(仕)-");Player[later].i+=1;break; case 'S':printf("-(帥)-");Player[later].s+=1;break; default: printf("---%c--",size[i][j]); } } printf("|%dn",i+1); if(i<9&&i!=4) { printf("| | | | | | | | | | |n");//棋盘 printf("| | | | | | | | | | |n"); } else if(i==4) { printf("| | 楚河 | 汉界 | |n");//棋盘 printf("| | | | |n"); } } printf("|"); for(i=0;i<9;i++) { printf("---%d--",i+1); } printf("|n");//1-9坐标位置 //输出棋子个数量 printf("n%d将,%d士,%d象,%d車,%d馬,%d砲,%d卒n", Player[first].s,Player[first].i,Player[first].x, Player[first].c,Player[first].m,Player[first].p,Player[first].b); printf("n%d帥,%d仕,%d相,%d车,%d傌,%d炮,%d兵n", Player[later].s,Player[later].i,Player[later].x, Player[later].c,Player[later].m,Player[later].p,Player[later].b); } else if((Player[first].camp==1)||(Player[first].camp==3))//帥 { printf("|"); for(i=0;i<9;i++) { printf("---%d--",i+1); } printf("|n");//1-9坐标位置 for(i=0;i<10;i++) { printf("|"); for(j=0;j<9;j++) { switch(size[i][j]) {//黑棋 case 'b':printf("-(卒)-");Player[later].b+=1;break; case 'p':printf("-(砲)-");Player[later].p+=1;break; case 'c':printf("-(車)-");Player[later].c+=1;break; case 'm':printf("-(馬)-");Player[later].m+=1;break; case 'x':printf("-(象)-");Player[later].x+=1;break; case 'i':printf("-(士)-");Player[later].i+=1;break; case 's':printf("-(将)-");Player[later].s+=1;break; //红棋 case 'B':printf("-(兵)-");Player[first].b+=1;break; case 'P':printf("-(炮)-");Player[first].p+=1;break; case 'C':printf("-(车)-");Player[first].c+=1;break; case 'M':printf("-(傌)-");Player[first].m+=1;break; case 'X':printf("-(相)-");Player[first].x+=1;break; case 'I':printf("-(仕)-");Player[first].i+=1;break; case 'S':printf("-(帥)-");Player[first].s+=1;break; default: printf("---%c--",size[i][j]); } } printf("|%dn",i+1); if(i<9&&i!=4) { printf("| | | | | | | | | | |n");//棋盘 printf("| | | | | | | | | | |n"); } else if(i==4) { printf("| | 楚河 | 汉界 | |n");//棋盘 printf("| | | | |n"); } } printf("|"); for(i=0;i<9;i++) { printf("---%d--",i+1); } printf("|n");//1-9坐标位置 //输出棋子个数量 printf("n%d帥,%d仕,%d相,%d车,%d傌,%d炮,%d兵n", Player[first].s,Player[first].i,Player[first].x, Player[first].c,Player[first].m,Player[first].p,Player[first].b); printf("n%d将,%d士,%d象,%d車,%d马,%d砲,%d卒n", Player[later].s,Player[later].i,Player[later].x, Player[later].c,Player[later].m,Player[later].p,Player[later].b); } } int debug(int size1,char size[size1+1][size1])//测试函数 { int i,j; for(i=0;i<10;i++) { for(j=0;j<9;j++) { printf("%c ",size[i][j]); } printf("n"); } } int sizeCol(int size1,char size[size1+1][size1],char coin[10])//下棋控制的棋子 { int x[3],y[3];//棋子的坐标 int xy[2];//1,2坐标 int i=0,j=0;//临时变量 int sizeMove(int size1,char size[size1+1][size1],int x[2]);//控制棋子的移动,x为两个坐标 if(1) {//判断输入是否合法 x[0]=0;x[1]=0,x[2]=0,y[1]=0,y[2]=0,y[0]=0;//置零 for(;i<3;i++)//对输入的读取 { switch(coin[i]) {//记录前两个棋子 case ',':break; case '0':x[i]=0;break; case '1':x[i]=1;break; case '2':x[i]=2;break; case '3':x[i]=3;break; case '4':x[i]=4;break; case '5':x[i]=5;break; case '6':x[i]=6;break; case '7':x[i]=7;break; case '8':x[i]=8;break; case '9':x[i]=9;break; } } if(coin[2]!=',')//对i进行判断,是否处理完x的坐标 i=3; else i=2; for(;coin[i]!=' ';i++) { switch(coin[i]) {//记录后两个棋子 case ',':break; case '0':y[j]=0;j++;break; case '1':y[j]=1;j++;break; case '2':y[j]=2;j++;break; case '3':y[j]=3;j++;break; case '4':y[j]=4;j++;break; case '5':y[j]=5;j++;break; case '6':y[j]=6;j++;break; case '7':y[j]=7;j++;break; case '8':y[j]=8;j++;break; case '9':y[j]=9;j++;break; } } } printf("n玩家走棋:"); if(x[2]==0&&x[0]!=0&&x[1]!=0) { printf("%d,%d—>",x[0],x[1]);//10初始的移动坐标 xy[0]=x[0]*10+x[1];//让坐标变成2位数 } else if(x[1]==0&&x[0]==1&&x[2]!=0) { printf("%d%d,%d—>",x[0],x[1],x[2]);//100初始的移动坐标 xy[0]=x[0]*100+x[1]*10+x[2];//让坐标变成2位数 } if(y[2]==0&&y[0]!=0&&y[1]!=0) { printf("%d,%dn",y[0],y[1]);//10变化的移动坐标 xy[1]=y[0]*10+y[1];//让坐标变成2位数 } else if(y[1]==0&&y[0]==1&&y[2]!=0) { printf("%d%d,%dn",y[0],y[1],y[2]);//100变化的移动坐标 xy[1]=y[0]*100+y[1]*10+y[2];//让坐标变成2位数 } else return 1;//坐标错误 if(sizeMove(9,size,xy)==0) { //int debug(int size1,char size[size1+1][size1]);//测试函数 //debug(9,size);//测试函数 return 1;//出错 } //printf("%d,%d,%d%d,%d,%dn",x[0],x[1],x[2],y[0],y[1],y[2]);//从一个坐标跳到另外一个坐标 return 0; } int sizeMove(int size1,char size[size1+1][size1],int x[2])//控制棋子的移动,x为两个坐标 { int camps(int i);//判断阵营 int sizes();//判断棋子的类型 大小写 int end=0; int k,i[2],j[2],camp; for(k=0;k<2;k++)//对坐标进行拆开 { if(x[k]>=100) { i[k]=10; j[k]=x[k]-100; } else if(x[k]<=100) { i[k]=x[k]/10; j[k]=x[k]%10; } } //交换元素 char c1=size[i[0]-1][j[0]-1];//映射真实坐标 char c2=size[i[1]-1][j[1]-1];//映射真实坐标 camp=sizes(); switch(Player[camp].camp)//判断大小写 阵营 { case 0://0是判断将 { switch(c1)//映射真实坐标 {//车,马,象,士,帅,士,象,马,车 case 'c':{ int c(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(c(9,size,i,j,'c')==1) return 0;//出错 break; } case 'm':{ int m(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(m(9,size,i,j,'m')==1) return 0;//出错 break; } case 'x':{ int x(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(x(9,size,i,j,'x')==1) return 0;//出错 break; } case 'i':{ int i1(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(i1(9,size,i,j,'i')==1) return 0;//出错 break; } case 's':{ int s(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(s(9,size,i,j,'s')==1) return 0;//出错 break; } case 'b':{ int b(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(b(9,size,i,j,'b')==1) return 0;//出错 break; } case 'p':{ int p(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(p(9,size,i,j,'p')==1) return 0;//出错 break; } default: { printf("请控制"); camps(Player[camp].camp); printf("的棋子n"); return 0;///返回0 } } }break; case 1://1是判断帥 { switch(c1)//映射真实坐标 {//车,马,象,士,帅,士,象,马,车 case 'C':{ int c(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(c(9,size,i,j,'C')==1) return 0;//出错 break; } case 'M':{ int m(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(m(9,size,i,j,'M')==1) return 0;//出错 break; } case 'X':{ int x(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(x(9,size,i,j,'X')==1) return 0;//出错 break; } case 'I':{ int i1(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(i1(9,size,i,j,'I')==1) return 0;//出错 break; } case 'S':{ int s(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(s(9,size,i,j,'S')==1) return 0;//出错 break; } case 'B':{ int b(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(b(9,size,i,j,'B')==1) return 0;//出错 break; } case 'P':{ int p(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy为坐标 if(p(9,size,i,j,'P')==1) return 0;//出错 break; } default: { printf("请控制"); camps(Player[camp].camp); printf("的棋子n"); return 0;//返回0 } } }break; } return 1; } int length(char coin[])//判断输入的长度的方法,以及输入的合法性 { int i,j=0,doc=0,num; for(i=0;coin[i]!=' ';i++) { num=coin[i]; j++; if(coin[i]==',') { doc=1;//要有逗号 } if(num<=48&&num>=57)//防止越界 return 0; } if(doc==1) return j; else return 0; } int camps(int i)//判断阵营 { if(i==0) { printf("“将”"); return 1; } if(i==1) { printf("“帥”"); return 0; } if(i==2) { printf("“⊙”"); return 1; } if(i==3) { printf("“〇”"); return 0; } } int sizes()//判断棋子的先手类型 { int i; for(i=0;i<2;i++) { if(Player[i].first==1) { return i;//返回一个先手的值 } } } int sizee()//判断棋子的后手类型 { int i; for(i=0;i<2;i++) { if(Player[i].first==0) { return i;//返回一个后手的值 } } } int b(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//兵 V { int sizes();//判断棋子的类型 大小写 int sizee();//判断棋子的后手类型 int later;//后手变量 int first;//先手变量 first=sizes();//判断谁先手 later=sizee();//判断谁后手 int chuhan(int x,char c1);//楚河汉界 int len(int size1,char size[size1+1][size1],int x[2], int y[2]);//移动距离 if((y[0]==y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]==x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//兵的路径合法 { if(len(9,size,x,y)!=1)//判断兵走的距离 { sized(9,size,x[0]-1,y[0]-1); printf("不能走大于1的距离n"); return 1; } switch(c1) { case 'b': { if(chuhan(x[1],c1)==1)//没过河 { if(y[1]!=y[0])//不能横走 { sized(9,size,x[0]-1,y[0]-1); printf("未过河不能平n"); return 1; } } if(x[1] x[0]) { sized(9,size,x[0]-1,y[0]-1); printf("不能退n"); return 1; } if(size[x[1]-1][y[1]-1]=='+')//判断走棋还是吃 { size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; return 0; } else if(size[x[1]-1][y[1]-1]!='+') { switch(size[x[1]-1][y[1]-1]) { case 'b':break; case 'p':break; case 'c':break; case 'm':break; case 'x':break; case 'i':break; case 's':break; default: { //size[x[0]-1][y[0]-1]=c1;//恢复棋子 printf("n不能吃自己的棋子n"); return 1; } } printf("玩家:%s ",Player[first].name);//玩家1名字 sized(9,size,x[0]-1,y[0]-1);//输出棋子 printf(" 吃 ");//玩家名字 printf("玩家:%s ",Player[later].name);//玩家2名字 sized(9,size,x[1]-1,y[1]-1);//输出棋子 printf("n");// } break; } } size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; } else return 1; return 0; } int p(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//炮 V { int sizes();//判断棋子的类型 大小写 int sizee();//判断棋子的后手类型 int later;//后手变量 int first;//先手变量 first=sizes();//判断谁先手 later=sizee();//判断谁后手 int jump;//判断跳跃的棋子 jump=cp(9,size,x,y); int cp(int size1,char size[size1+1][size1],int x[2], int y[2]);//车炮移动判定 void sized(int size1,char size[size1+1][size1],int i,int j);//返回棋子的值 if((y[0]==y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]==x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//炮的路径合法 { if(jump>=2)//判断车中间棋子 { sized(9,size,x[0]-1,y[0]-1); printf("不能跨多于两个棋子移动n"); return 1; } switch(c1) { case 'p': { if(size[x[1]-1][y[1]-1]=='+'&&jump==0)//判断走棋还是吃 { size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; return 0; } else if(size[x[1]-1][y[1]-1]!='+'&&jump==1) { switch(size[x[1]-1][y[1]-1]) { case 'B':break; case 'P':break; case 'C':break; case 'M':break; case 'X':break; case 'I':break; case 'S':break; default: { printf("n不能吃自己的棋子n"); return 1; } } printf("玩家:%s ",Player[first].name);//玩家1名字 sized(9,size,x[0]-1,y[0]-1);//输出棋子 printf(" 吃了 ");//玩家名字 printf("玩家:%s ",Player[later].name);//玩家2名字 sized(9,size,x[1]-1,y[1]-1);//输出棋子 printf("n");// } else //if(jump==1&&size[x[1]-1][y[1]-1]=='+') { sized(9,size,x[0]-1,y[0]-1); printf("移动非法n"); return 1; } break; } case 'P': { if(size[x[1]-1][y[1]-1]=='+'&&jump==0)//判断走棋还是吃 { size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; return 0; } else if(size[x[1]-1][y[1]-1]!='+'&&jump==1) { switch(size[x[1]-1][y[1]-1]) { case 'b':break; case 'p':break; case 'c':break; case 'm':break; case 'x':break; case 'i':break; case 's':break; default: { //size[x[0]-1][y[0]-1]=c1;//恢复棋子 printf("n不能吃自己的棋子n"); return 1; } } printf("玩家:%s ",Player[first].name);//玩家1名字 sized(9,size,x[0]-1,y[0]-1);//输出棋子 printf(" 吃 ");//玩家名字 printf("玩家:%s ",Player[later].name);//玩家2名字 sized(9,size,x[1]-1,y[1]-1);//输出棋子 printf("n");// } else //if(jump==1&&size[x[1]-1][y[1]-1]=='+') { sized(9,size,x[0]-1,y[0]-1); printf("移动非法n"); return 1; } break; } } size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; } else return 1; return 0; } int c(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//车 V { int sizes();//判断棋子的类型 大小写 int sizee();//判断棋子的后手类型 int later;//后手变量 int first;//先手变量 first=sizes();//判断谁先手 later=sizee();//判断谁后手 int cp(int size1,char size[size1+1][size1],int x[2], int y[2]);//车炮移动判定 void sized(int size1,char size[size1+1][size1],int i,int j);//返回棋子的值 if((y[0]==y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]==x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//车的路径合法 { if(cp(9,size,x,y)!=0)//判断车中间棋子 { sized(9,size,x[0]-1,y[0]-1); printf("不能跨棋子移动n"); return 1; } switch(c1) { case 'c': { if(size[x[1]-1][y[1]-1]=='+')//判断走棋还是吃 { size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; return 0; } else if(size[x[1]-1][y[1]-1]!='+') { switch(size[x[1]-1][y[1]-1]) { case 'B':break; case 'P':break; case 'C':break; case 'M':break; case 'X':break; case 'I':break; case 'S':break; default: { printf("n不能吃自己的棋子n"); return 1; } } printf("玩家:%s ",Player[first].name);//玩家1名字 sized(9,size,x[0]-1,y[0]-1);//输出棋子 printf(" 吃了 ");//玩家名字 printf("玩家:%s ",Player[later].name);//玩家2名字 sized(9,size,x[1]-1,y[1]-1);//输出棋子 printf("n");// } break; } case 'C': { if(size[x[1]-1][y[1]-1]=='+')//判断走棋还是吃 { size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; return 0; } else if(size[x[1]-1][y[1]-1]!='+') { switch(size[x[1]-1][y[1]-1]) { case 'b':break; case 'p':break; case 'c':break; case 'm':break; case 'x':break; case 'i':break; case 's':break; default: { //size[x[0]-1][y[0]-1]=c1;//恢复棋子 printf("n不能吃自己的棋子n"); return 1; } } printf("玩家:%s ",Player[first].name);//玩家1名字 sized(9,size,x[0]-1,y[0]-1);//输出棋子 printf(" 吃 ");//玩家名字 printf("玩家:%s ",Player[later].name);//玩家2名字 sized(9,size,x[1]-1,y[1]-1);//输出棋子 printf("n");// } break; } } size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; } else return 1; return 0; } int m(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//马 V { int sizes();//判断棋子的类型 大小写 int sizee();//判断棋子的后手类型 int later;//后手变量 int first;//先手变量 first=sizes();//判断谁先手 later=sizee();//判断谁后手 int len(int size1,char size[size1+1][size1],int x[2], int y[2]);//移动距离 void sized(int size1,char size[size1+1][size1],int i,int j);//返回棋子的值 if((x[0]==x[1])||(y[0]==y[1])) { sized(9,size,x[0]-1,y[0]-1); printf("走“日”字n"); return 1; } if((y[0]!=y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]!=x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//马路径合法 { if(len(9,size,x,y)!=333)//判断马走的距离 { sized(9,size,x[0]-1,y[0]-1); printf("走“日”字n"); return 1; } //马脚的判断 if(x[0]>x[1])//上+左右移动 { if(y[0]>y[1])//上+左移动 { if((y[0]-y[1]==2)&&(size[x[0]-1][y[0]-2]!='+')) { sized(9,size,x[0]-1,y[0]-1); printf("脚n"); return 1; } else if((y[0]-y[1]==1)&&(size[x[0]-2][y[0]-1]!='+')) { sized(9,size,x[0]-1,y[0]-1); printf("脚n"); return 1; } } else if(y[0] y[1])//下+左移动 { if((y[0]-y[1]==2)&&(size[x[0]-1][y[0]-2]!='+')) { sized(9,size,x[0]-1,y[0]-1); printf("脚n"); return 1; } else if((y[0]-y[1]==1)&&(size[x[0]][y[0]-1]!='+')) { sized(9,size,x[0]-1,y[0]-1); printf("脚n"); return 1; } } else if(y[0] =1)||(x[0]!=x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//象路径合法 { if(len(9,size,x,y)!=222)//判断象走的距离 { sized(9,size,x[0]-1,y[0]-1); printf("走“田”字n"); return 1; } if(x[0]>x[1])//判断象脚 象往上跳 { if(y[0]>y[1])//判断象脚 象往上跳 象往左跳 { if(size[x[1]][y[1]]!='+') { sized(9,size,x[0]-1,y[0]-1); printf("脚n"); return 1; } } else if(y[0] y[1])//判断象脚 象往下跳 象往左跳 { if(size[x[0]][y[1]]!='+') { sized(9,size,x[0]-1,y[0]-1); printf("脚n"); return 1; } } else if(y[0] =1)||(x[0]!=x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//士路径合法 { if((x[0]==x[1])||(y[0]==y[1])) { sized(9,size,x[0]-1,y[0]-1); printf("非法s移动"); return 1; } if(len(9,size,x,y)!=111)//判断士走的距离 { sized(9,size,x[0]-1,y[0]-1); printf("不能走大于1的距离n"); return 1; } if((jiugong(x,y,c1))!=1)//判断九宫 { sized(9,size,x[0]-1,y[0]-1); printf("不能出九宫n"); return 1; } switch(c1) { case 'i': { if(size[x[1]-1][y[1]-1]=='+')//判断走棋还是吃 { size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; return 0; } else if(size[x[1]-1][y[1]-1]!='+') { switch(size[x[1]-1][y[1]-1]) { case 'B':break; case 'P':break; case 'C':break; case 'M':break; case 'X':break; case 'I':break; case 'S':break; default: { printf("n不能吃自己的棋子n"); return 1; } } printf("玩家:%s ",Player[first].name);//玩家1名字 sized(9,size,x[0]-1,y[0]-1);//输出棋子 printf(" 吃了 ");//玩家名字 printf("玩家:%s ",Player[later].name);//玩家2名字 sized(9,size,x[1]-1,y[1]-1);//输出棋子 printf("n");// } break; } case 'I': { if(size[x[1]-1][y[1]-1]=='+')//判断走棋还是吃 { size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; return 0; } else if(size[x[1]-1][y[1]-1]!='+') { switch(size[x[1]-1][y[1]-1]) { case 'b':break; case 'p':break; case 'c':break; case 'm':break; case 'x':break; case 'i':break; case 's':break; default: { //size[x[0]-1][y[0]-1]=c1;//恢复棋子 printf("n不能吃自己的棋子n"); return 1; } } printf("玩家:%s ",Player[first].name);//玩家1名字 sized(9,size,x[0]-1,y[0]-1);//输出棋子 printf(" 吃 ");//玩家名字 printf("玩家:%s ",Player[later].name);//玩家2名字 sized(9,size,x[1]-1,y[1]-1);//输出棋子 printf("n");// } break; } } size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; return 0; } else { sized(9,size,x[0]-1,y[0]-1); printf("路径非法n"); return 1; } return 0; } int s(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//将 V { int sizes();//判断棋子的类型 大小写 int sizee();//判断棋子的后手类型 int later;//后手变量 int first;//先手变量 first=sizes();//判断谁先手 later=sizee();//判断谁后手 int jiugong(int x[2], int y[2],char c1);//九宫 int len(int size1,char size[size1+1][size1],int x[2], int y[2]);//移动距离 void sized(int size1,char size[size1+1][size1],int i,int j);//返回棋子的值 if((y[0]==y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]==x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//将的路径合法 { if(len(9,size,x,y)!=1)//判断将走的距离 { sized(9,size,x[0]-1,y[0]-1); printf("不能走大于1的距离n"); return 1; } if((jiugong(x,y,c1))!=1)//判断九宫 { sized(9,size,x[0]-1,y[0]-1); printf("不能出九宫n"); return 1; } switch(c1) { case 's': { if(size[x[1]-1][y[1]-1]=='+')//判断走棋还是吃 { size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; return 0; } else if(size[x[1]-1][y[1]-1]!='+') { switch(size[x[1]-1][y[1]-1]) { case 'B':break; case 'P':break; case 'C':break; case 'M':break; case 'X':break; case 'I':break; case 'S':break; default: { printf("n不能吃自己的棋子n"); return 1; } } printf("玩家:%s ",Player[first].name);//玩家1名字 sized(9,size,x[0]-1,y[0]-1);//输出棋子 printf(" 吃了 ");//玩家名字 printf("玩家:%s ",Player[later].name);//玩家2名字 sized(9,size,x[1]-1,y[1]-1);//输出棋子 printf("n");// } break; } case 'S': { if(size[x[1]-1][y[1]-1]=='+')//判断走棋还是吃 { size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; return 0; } else if(size[x[1]-1][y[1]-1]!='+') { switch(size[x[1]-1][y[1]-1]) { case 'b':break; case 'p':break; case 'c':break; case 'm':break; case 'x':break; case 'i':break; case 's':break; default: { //size[x[0]-1][y[0]-1]=c1;//恢复棋子 printf("n不能吃自己的棋子n"); return 1; } } printf("玩家:%s ",Player[first].name);//玩家1名字 sized(9,size,x[0]-1,y[0]-1);//输出棋子 printf(" 吃 ");//玩家名字 printf("玩家:%s ",Player[later].name);//玩家2名字 sized(9,size,x[1]-1,y[1]-1);//输出棋子 printf("n");// } break; } } size[x[1]-1][y[1]-1]=c1;//下棋 size[x[0]-1][y[0]-1]='+'; } else return 1; return 0; } void sized(int size1,char size[size1+1][size1],int i,int j)//返回棋子的值 { switch(size[i][j]) {//黑棋 case 'b':printf("(卒)");break; case 'p':printf("(砲)");break; case 'c':printf("(車)");break; case 'm':printf("(馬)");break; case 'x':printf("(象)");break; case 'i':printf("(士)");break; case 's':printf("(将)");break; //红棋 case 'B':printf("(兵)");break; case 'P':printf("(炮)");break; case 'C':printf("(车)");break; case 'M':printf("(傌)");break; case 'X':printf("(相)");break; case 'I':printf("(仕)");break; case 'S':printf("(帥)");break; default: printf("%c",size[i][j]); } } int cp(int size1,char size[size1+1][size1],int x[2], int y[2])//车炮移动判定 { int i,j;//从i到j,累+ int coin;//棋子+1 coin=0; if(x[0]==x[1]) { i=y[0]-1;//初始坐标 j=y[1]-1;//变化坐标 int i1=x[0]-1; if(i>j) { i-=1; for(;i>j;i--) { if(size[i1][i]!='+') coin++; } } else if(i j) { i-=1; for(;i>j;i--) { if(size[i][i1]!='+') coin++; } } else if(i j) { for(;i>j;i--) { len++; } } else if(i j) { for(;i>j;i--) { len++; } } else if(i =4&&y[1]<=6)&&(x[1]>=1&&x[1]<=3)) return 1; break; } case 'S':{//将出界 if((y[1]>=4&&y[1]<=6)&&(x[1]>=8&&x[1]<=10)) return 1; break; } case 'i':{//士出界 if((y[1]>=4&&y[1]<=6)&&(x[1]>=1&&x[1]<=3)) return 1; break; } case 'I':{//士出界 if((y[1]>=4&&y[1]<=6)&&(x[1]>=8&&x[1]<=10)) return 1; break; } } return 0; }



