二维数组构造C语言象棋

#include"stdio.h"
#include"stdlib.h"
#include"math.h"
void display(int table[][10])
{
system("color F0");
 int i,j;
 printf("    甲方:车 马 象 士 将 炮 卒    乙方:車 馬 相 仕 帅 砲 兵\n\n");
 printf("          1     2     3     4     5     6     7     8     9\n\n");
 for (i=1;i<=10;i++)
 {
  printf("%5d   ",i);
  for (j=1;j<=9;j++)
  {
   // display the top side
   if (table[i][j]==0) printf("  + ");
   else if (table[i][j]==1) printf(" 车 ");
   else if (table[i][j]==2) printf(" 马 ");
   else if (table[i][j]==3) printf(" 象 ");
   else if (table[i][j]==4) printf(" 士 ");
   else if (table[i][j]==5) printf(" 将 ");
   else if (table[i][j]==6) printf(" 炮 ");
   else if (table[i][j]==7) printf(" 卒 ");
   // display the bottom side
   else if (table[i][j]==-1) printf(" 車 ");
   else if (table[i][j]==-2) printf(" 馬 ");
   else if (table[i][j]==-3) printf(" 相 ");
   else if (table[i][j]==-4) printf(" 仕 ");
   else if (table[i][j]==-5) printf(" 帅 ");
   else if (table[i][j]==-6) printf(" 砲 ");
   else if (table[i][j]==-7) printf(" 兵 ");
   else printf("程序崩溃啦~");
   if (j<9) printf("--");
  }
  printf("\n");
  if (i<10 && i!=5) printf("          |     |     |     |     |     |     |     |     |\n");
  if (i==5) printf("\n");
 }
}
int rule(int x1,int y1,int x2,int y2,int table[][10]);
int che(int x1,int y1,int x2,int y2,int table[][10]);
int ma(int x1,int y1,int x2,int y2,int table[][10]);
int xiang(int x1,int y1,int x2,int y2,int table[][10]);
int shi(int x1,int y1,int x2,int y2,int table[][10]);
int shuai(int x1,int y1,int x2,int y2,int table[][10]);
int pao(int x1,int y1,int x2,int y2,int table[][10]);
int bing(int x1,int y1,int x2,int y2,int table[][10]);
void main()
{
int table[11][10];
 int i,j;
 int x1,y1,x2,y2;
 int order=0;
 //  creat the blank layout
 for (i=1;i<=10;i++)
  for (j=1;j<=9;j++)
   table[i][j]=0;
 for (j=1;j<=5;j++)
  table[1][j]=j;
 for (j=6,i=1;j<=9;j++)
  table[1][j]=5-i++;
 table[3][2]=6;
 table[3][8]=6;
 for (j=1;j<=9;j++)
  if (j%2==1)
   table[4][j]=7;
 for (j=1;j<=5;j++)
  table[10][j]=-1*j;
 for (j=6,i=-1;j<=9;j++)
  table[10][j]=-5-i--;
 table[8][2]=-6;
 table[8][8]=-6;
 for (j=1;j<=9;j++)
  if (j%2==1)
   table[7][j]=-7;
 // creat finished
 display(table);
while(1)
{
int result; 
while(1)
{
printf("\n请输入您要移动的棋子位置:");
scanf("%d%d",&x1,&y1);
if(x1>10||x1<1||y1>9||y1<1||table[x1][y1]==0) printf("该位置没有棋子\n");
else {if(order%2==0&&table[x1][y1]>0) printf("请乙方走棋\n");
       else if(order%2==1&&table[x1][y1]<0) printf("请甲方走棋\n");
    else{order++;printf("%d",order);break;} }
}

while(1)
{
printf("请输入您要将棋子移动到哪:");
scanf("%d%d",&x2,&y2);
result=rule(x1,y1,x2,y2,table);
if(result==1) {table[x2][y2]=table[x1][y1];table[x1][y1]=0;display(table);break;}
else if(result==99) printf("棋子移到外面去了\n");
else continue;
}

}
}
int rule(int x1,int y1,int x2,int y2,int table[][10])
{
if(x2<1||x2>10||y2<1||2>9) return 99;
else if(table[x1][y1]==1||table[x1][y1]==-1) {if(che(x1,y1,x2,y2,table)==1) return 1;
                                              else return 0;}
else if(table[x1][y1]==2||table[x1][y1]==-2) {if(ma(x1,y1,x2,y2,table)==1) return 1;
                                              else return 0;}
else if(table[x1][y1]==3||table[x1][y1]==-3) {if(xiang(x1,y1,x2,y2,table)==1) return 1;
                                              else return 0;}
else if(table[x1][y1]==4||table[x1][y1]==-4) {if(shi(x1,y1,x2,y2,table)==1) return 1;
                                              else return 0;}
else if(table[x1][y1]==5||table[x1][y1]==-5) {if(shuai(x1,y1,x2,y2,table)==1) return 1;
                                              else return 0;}
else if(table[x1][y1]==6||table[x1][y1]==-6) {if(pao(x1,y1,x2,y2,table)==1) return 1;
                                              else return 0;}
else if(table[x1][y1]==7||table[x1][y1]==-7) {if(bing(x1,y1,x2,y2,table)==1) return 1;
                                              else return 0;}
else{printf("程序崩溃.......\n");return 0;}

}
int che(int x1,int y1,int x2,int y2,int table[][10])
{
int i,flag=1;
if(x1==x2)//横
{
 if(y1>y2) {for(i=y2+1;i<y1;i++) {if(table[x1][i]!=0) {flag=0;break;}}}
    else{for(i=y1+1;i<y2;i++) {if(table[x1][i]!=0) {flag=0;break;}}}
}
if(y1==y2)//竖
{
 if(x1>x2) {for(i=x2+1;i<x1;i++) {if(table[i][y1]!=0) {flag=0;break;}}}
    else{for(i=x1+1;i<x2;i++) {if(table[i][y1]!=0) {flag=0;break;}}}
}
if(x1!=x2&&y1!=y2) {printf("车不能斜着走\n");return 0;}
if(table[x2][y2]*table[x1][y1]>0) {printf("自己不能吃掉自己呀\n");return 0;}
if(flag==0){printf("车移动的时候不能有其它的棋子\n");return 0;}
return 1;
}

int ma(int x1,int y1,int x2,int y2,int table[][10])
{
 if(table[x1][y1]<0) if(table[x2][y2]<0){printf("不能自己吃自己!!!\n"); return 0;}
 else if(table[x1][y1]>0) if(table[x2][y2]>0){printf("不能自己吃自己!!!\n"); return 0;}
 if(((x1-2==x2)&&(y1-1==y2))||((x1-2==x2)&&(y1+1==y2))) {if(table[x1-1][y1]==0) return 1;else {printf("别腿了!!!\n");return 0;}}//上方
    if(((x1+2==x2)&&(y1-1==y2))||((x1+2==x2)&&(y1+1==y2))) {if(table[x1+1][y1]==0) return 1;else {printf("别腿了!!!\n");return 0;}}//下方
 if(((x1-1==x2)&&(y1-2==y2))||((x1+1==x2)&&(y1-2==y2))) {if(table[x1][y1-1]==0) return 1;else {printf("别腿了!!!\n");return 0;}}//左方
 if(((x1-1==x2)&&(y1+2==y2))||((x1+1==x2)&&(y1+2==y2))) {if(table[x1][y1+1]==0) return 1;else {printf("别腿了!!!\n");return 0;}}//右方
 return 1;
}

int xiang(int x1,int y1,int x2,int y2,int table[][10])
{
 if((abs(x2-x1))!=2||(abs(y2-y1))!=2) {printf("相只能走田\n"); return 0;}
    else if(table[(x1+x2)/2][(y1+y2)/2]!=0) {printf("相别腿了\n");return 0;}
    else if((table[x1][y1]>0&&x2>5)||(table[x1][y1]<0&&x2<5)) {printf("相不能渡楚河汉界!\n");return 0;}
 else if(table[x2][y2]*table[x1][y1]>0) {printf("不能吃掉自己!\n");}
    return 1;
}

int shi(int x1,int y1,int x2,int y2,int table[][10])
{
 if((x2<8||x2>10||y2<4||y2>6)&&(x2<1||x2>3||y2<4||y2>6)) {printf("士不能移出九宫区域\n");return 0;}
    else if(!((abs(x2-x1)==1)&&(abs(y2-y1)==1))) {printf("士只能斜着走!\n");return 0;}
 else if(table[x2][y2]*table[x1][y1]>0) {printf("自己不能吃掉自己!\n");}
 else if((abs(x2-x1)>=2)||(abs(y2-y1)>=2)) {printf("士不能走多格!\n");return 0;}
    return 1;

}

int shuai(int x1,int y1,int x2,int y2,int table[][10])
{
 if((x2<8||x2>10||y2<4||y2>6)&&(x2<1||x2>3||y2<4||y2>6)) {printf("将不能移出九宫区域\n");return 0;}
    else if((abs(x2-x1)==1)&&(abs(y2-y1)==1)) {printf("将不能能斜着走!\n");return 0;}
 else if(table[x2][y2]*table[x1][y1]>0) {printf("自己不能吃掉自己!\n");}
 else if((abs(x2-x1)>=2)||(abs(y2-y1)>=2)) {printf("将不能走多格!\n");return 0;}
    return 1;
}

int pao(int x1,int y1,int x2,int y2,int table[][10])
{
int i,flag=0;
if(table[x1][y1]*table[x2][y2]>=0)
{
 if(x1!=x2&&y1!=y2) {printf("炮不能斜着走!\n");return 0;}
 if(table[x1][y1]*table[x2][y2]>0) {printf("自己不能吃掉自己\n");return 0;}
 if(x1==x2) {if(y1>y2) {for(i=y2;i<y1;i++) {if(table[x1][i]!=0) {flag=1;
             break;}}}else{for(i=y1+1;i<y2;i++) {if(table[x1][i]!=0)
    {flag=1;break;}}}}
    if(y1==y2) {if(x1>x2) {for(i=x2;i<x1;i++) {if(table[i][y1]!=0) {flag=1;
             break;}}}else{for(i=x1+1;i<x2;i++) {if(table[i][y1]!=0)
    {flag=1;break;}}}}
 if(flag==1) {printf("????\n");return 0;}
}
else{flag=0; if(x1!=x2&&y1!=y2) {printf("炮不能斜着走!\n");return 0;}
      else{if(x1==x2){if(y1>y2){for(i=y2+1;i<y1;i++) {if(table[x1][i]!=0)
          flag++;}}else{for(i=y1+1;i<y2;i++) {if(table[x1][i]!=0)
          flag++;}}}
            if(y1==y2) {if(x1>x2) {for(i=x2+1;i<x1;i++) {if(table[i][y1]!=0)
   flag++;}}else{for(i=x1+1;i<x2;i++) {if(table[i][y1]!=0)
   flag++;}}}}
if(flag==1) return 1;
else if(flag==0) {printf("没有支架没法吃掉对方的棋子\n");return 0;}
else{printf("你不能用多个棋子做炮的支架\n");return 0;}
}
return 1;
}

int bing(int x1,int y1,int x2,int y2,int table[][10])
{
if(table[x1][y1]>0) {if(table[x2][y2]>0){printf("不能自己吃自己\n");return 0;}
                      if(x1<6){if((y1==y2)&&(x2-x1==1)) return 1;
       else{printf("兵过河前只能向前走!\n");return 0;}}
                      else{if(((y1==y2)&&(x2-x1==1))||((y1-y2==1)&&(x2==x1))||((y2-y1==1)&&(x2==x1)))
       return 1;else{printf("兵过河只能向前走或平移\n");return 0;}}
     }
else{if(table[x2][y2]<0){printf("不能自己吃自己!!!\n");return 0;}
     if(x1>5){if((y1==y2)&&(x1-x2==1)) return 1;
     else{printf("兵过河前只能向前走,请重新输入\n"); return 0;}}
  else{if(((y1==y2)&&(x1-x2==1))||((y1-y2==1)&&(x2==x1))||((y2-y1==1)&&(x2==x1)))
  return 1;else{printf("兵过河后只能向前走或者平移,不能后退,请重新输入\n");return 0;}}
 }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值