改程序在VC++环境中使用没有问题
#include<stdio.h>
#include<math.h>
#include <windows.h>
void display(int table[][10]);
int checkRule(int x1,int y1,int x2,int y2,int table[][10]);
int checkche(int x1,int y1,int x2,int y2,int table[][10]);
int checkma(int x1,int y1,int x2,int y2,int table[][10]);
int checkxiang(int x1,int y1,int x2,int y2,int table[][10]);
int checkshi(int x1,int y1,int x2,int y2,int table[][10]);
int checkshuai(int x1,int y1,int x2,int y2,int table[][10]);
int checkpao(int x1,int y1,int x2,int y2,int table[][10]);
int checkbing(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;
// 调用 win32 API 函数改变输出颜色
HANDLE consolehwnd;
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
// 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,win1=1,win2=1;
while(1)
{
printf("\n请输入您要移动的棋子位置(例如输入 3 4 代表第三行第四列) :");
SetConsoleTextAttribute(consolehwnd,FOREGROUND_BLUE);
scanf("%d%d",&x1,&y1);
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY);
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++;
break;
}
}
}
while(1)
{
printf("请输入您要将棋子移动到哪(例如输入 3 4 代表第三行第四列) :");
SetConsoleTextAttribute(consolehwnd,FOREGROUND_BLUE);
scanf("%d%d",&x2,&y2);
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY);
result=checkRule(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;
}
for (i=1;i<=10;i++)
{
for (j=1;j<=9;j++)
{
if (table[i][j]==5) win1=0;
if (table[i][j]==-5) win2=0;
}
}
if (win1==1)
{
printf("恭喜绿方,绿方取得胜利!\n");
break;
}
if (win2==1)
{
printf("恭喜红方,红方取得胜利!\n");
break;
}
}
}
void display(int table[][10])
{
int i,j;
// 调用 win32 API 函数改变输出颜色
HANDLE consolehwnd;
consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY);
printf("\n 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(" + ");
SetConsoleTextAttribute(consolehwnd,FOREGROUND_RED);
if (table[i][j]==1) printf(" 车 ");
if (table[i][j]==2) printf(" 马 ");
if (table[i][j]==3) printf(" 象 ");
if (table[i][j]==4) printf(" 士 ");
if (table[i][j]==5) printf(" 将 ");
if (table[i][j]==6) printf(" 炮 ");
if (table[i][j]==7) printf(" 卒 ");
// display the bottom side
SetConsoleTextAttribute(consolehwnd,FOREGROUND_GREEN);
if (table[i][j]==-1) printf(" 車 ");
if (table[i][j]==-2) printf(" 馬 ");
if (table[i][j]==-3) printf(" 相 ");
if (table[i][j]==-4) printf(" 仕 ");
if (table[i][j]==-5) printf(" 帅 ");
if (table[i][j]==-6) printf(" 砲 ");
if (table[i][j]==-7) printf(" 兵 ");
SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY);
if (j<9) printf("--");
}
printf("\n");
if (i<10 && i!=5) printf(" | | | | | | | | |\n");
if (i==5) printf("\n");
}
}
int checkRule(int x1,int y1,int x2,int y2,int table[][10])
{
if (x2<1 || x2>10 || y2<1 || y2>9) return 99;
else
if (table[x1][y1]==1 || table[x1][y1]==-1)
{
if (checkche(x1,y1,x2,y2,table)==1) return 1;
else return 0;
}
else
if (table[x1][y1]==2 || table[x1][y1]==-2)
{
if (checkma(x1,y1,x2,y2,table)==1) return 1;
else return 0;
}
else
if (table[x1][y1]==3 || table[x1][y1]==-3)
{
if (checkxiang(x1,y1,x2,y2,table)==1) return 1;
else return 0;
}
else
if (table[x1][y1]==4 || table[x1][y1]==-4)
{
if (checkshi(x1,y1,x2,y2,table)==1) return 1;
else return 0;
}
else
if (table[x1][y1]==5 || table[x1][y1]==-5)
{
if (checkshuai(x1,y1,x2,y2,table)==1) return 1;
else return 0;
}
else
if (table[x1][y1]==6 || table[x1][y1]==-6)
{
if (checkpao(x1,y1,x2,y2,table)==1) return 1;
else return 0;
}
else
if (table[x1][y1]==7 || table[x1][y1]==-7)
{
if (checkbing(x1,y1,x2,y2,table)==1) return 1;
else return 0;
}
else
{
printf("莫非程序崩溃了。。。 :(\n");
return 0;
}
}
int checkche(int x1,int y1,int x2,int y2,int table[][10])
{
int i,flag=1;
if (x1!=x2 && y1!=y2)
{
printf("车不能斜着走呀,重新输入吧\n");
return 0;
}
if (table[x2][y2]*table[x1][y1]>0)
{
printf("自己不能吃掉自己呀,检查后重新输入吧\n");
return 0;
}
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 (flag==0)
{
printf("车移动的时候中间不能有其他的棋子呀,请重新输入\n");
return 0;
}
return 1;
}
int checkma(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-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+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;
}
}
return 1;
}
int checkxiang(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][y1]>0 && x2>5)||(table[x1][y1]<0 && x2<5))
{
printf("相(象)不能渡过楚河汉界呀,重新输入吧\n");
return 0;
}
else if (table[(x1+x2)/2][(y1+y2)/2]!=0)
{
printf("您要移动的路径上有其他棋挡着呢,不能移动,重新输入吧\n");
return 0;
}
else if (table[x2][y2]*table[x1][y1]>0)
{
printf("自己不能吃掉自己呀,检查后重新输入吧\n");
return 0;
}
else return 1;
}
int checkshi(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");
return 0;
}
else if ((abs(x2-x1)>=2)||(abs(y2-y1)>=2))
{
printf("士或者仕不能一次走多格呀,请重新输入。\n");
return 0;
}
else return 1;
}
int checkshuai(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");
return 0;
}
else if ((abs(x2-x1)>=2)||(abs(y2-y1)>=2))
{
printf("将或者帅不能一次走多格呀,请重新输入。\n");
return 0;
}
else return 1;
}
int checkpao(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[x2][y2]*table[x1][y1]>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++; //flag2 : 支架的个数
}
}
}
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 checkbing(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;
}
}
}
}