模拟中国象棋
2017-07-01 本文已影响0人
fo0Old
象棋
AC代码:
const int n=10,m=9;
char a[12][12];
int abs(int x)
{
if(x>=0)return x;
else return -x;
}
void prt(void)
{
for(int i=1; i<=n; i++)
printf("%s\n",a[i]+1);
}
int win(int user)
{
bool flag0=false,flag1=false;
int Ex,Ey,ex,ey;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
if(a[i][j]=='e')
ex=i,ey=j,flag0=true;
if(a[i][j]=='E')
Ex=i,Ey=j,flag1=true;
}
if(flag0 && !flag1)return 0;
if(!flag0 && flag1)return 1;
if(Ey==ey)
{
for(int i=Ex+1; i<ex; i++)
if(a[i][ey]!='.')return -1;
return 1-user;
}
return -1;
}
bool che(int user,int x1,int y1,int x2,int y2)
{
if(x1==x2)
{
for(int i=min(y1,y2)+1; i<max(y1,y2); i++)
if(a[x1][i]!='.')return false;
a[x1][y1]='.';
if(!user)a[x2][y2]='a';
else a[x2][y2]='A';
return true;
}
if(y1==y2)
{
for(int i=min(x1,x2)+1; i<max(x1,x2); i++)
if(a[i][y1]!='.')return false;
a[x1][y1]='.';
if(!user)a[x2][y2]='a';
else a[x2][y2]='A';
return true;
}
return false;
}
bool ma(int user,int x1,int y1,int x2,int y2)
{
if(x1+2==x2 && (y1+1==y2 || y1-1==y2))
{
if(a[x1+1][y1]!='.')return false;
a[x1][y1]='.';
if(!user)a[x2][y2]='b';
else a[x2][y2]='B';
return true;
}
if(x1-2==x2 && (y1+1==y2 || y1-1==y2))
{
if(a[x1-1][y1]!='.')return false;
a[x1][y1]='.';
if(!user)a[x2][y2]='b';
else a[x2][y2]='B';
return true;
}
if(y1+2==y2 && (x1+1==x2 || x1-1==x2))
{
if(a[x1][y1+1]!='.')return false;
a[x1][y1]='.';
if(!user)a[x2][y2]='b';
else a[x2][y2]='B';
return true;
}
if(y1-2==y2 && (x1+1==x2 || x1-1==x2))
{
if(a[x1][y1-1]!='.')return false;
a[x1][y1]='.';
if(!user)a[x2][y2]='b';
else a[x2][y2]='B';
return true;
}
return false;
}
bool xiang(int user,int x1,int y1,int x2,int y2)
{
if((user==0 && x2<=5) || (user==1 && x2>=6))
return false;
if(abs(x1-x2)==2 && abs(y1-y2)==2)
{
if(a[(x1+x2)/2][(y1+y2)/2]!='.')
return false;
a[x1][y1]='.';
if(!user)a[x2][y2]='c';
else a[x2][y2]='C';
return true;
}
return false;
}
bool shi(int user,int x1,int y1,int x2,int y2)
{
if(y2>6 || y2<4)return false;
if(abs(x1-x2)!=1 || abs(y1-y2)!=1)
return false;
if((user==0 && x2>=8 && x2<=10)
|| (user==1 && x2>=1 && x2<=3))
{
a[x1][y1]='.';
if(!user)a[x2][y2]='d';
else a[x2][y2]='D';
return true;
}
return false;
}
bool wang(int user,int x1,int y1,int x2,int y2)
{
if(y2>6 || y2<4)return false;
if(abs(x1-x2)+abs(y1-y2)!=1)
return false;
if((user==0 && x2>=8 && x2<=10)
|| (user==1 && x2>=1 && x2<=3))
{
a[x1][y1]='.';
if(!user)a[x2][y2]='e';
else a[x2][y2]='E';
return true;
}
return false;
}
bool pao(int user,int x1,int y1,int x2,int y2)
{
int cont=0;
if(x1==x2)
{
for(int i=min(y1,y2)+1; i<max(y1,y2); i++)
if(a[x1][i]!='.')cont++;
if(cont>=2)return false;
if((cont==0 && a[x2][y2]!='.')
|| (cont==1 && a[x2][y2]=='.'))
return false;
a[x1][y1]='.';
if(!user)a[x2][y2]='f';
else a[x2][y2]='F';
return true;
}
if(y1==y2)
{
for(int i=min(x1,x2)+1; i<max(x1,x2); i++)
if(a[i][y1]!='.')cont++;
if(cont>=2)return false;
if((cont==0 && a[x2][y2]!='.')
||(cont==1 && a[x2][y2]=='.'))
return false;
a[x1][y1]='.';
if(!user)a[x2][y2]='f';
else a[x2][y2]='F';
return true;
}
return false;
}
bool bing(int user,int x1,int y1,int x2,int y2)
{
if(user==0)
{
if(x1>=6)
{
if(x1-1==x2 && y1==y2)
{
a[x1][y1]='.';
a[x2][y2]='g';
return true;
}
else return false;
}
else
{
if(abs(x1-x2)+abs(y1-y2)!=1)
return false;
if(x1+1==x2)return false;
a[x1][y1]='.';
a[x2][y2]='g';
return true;
}
}
if(user==1)
{
if(x1<=5)
{
if(x1+1==x2 && y1==y2)
{
a[x1][y1]='.';
a[x2][y2]='G';
return true;
}
else return false;
}
else
{
if(abs(x1-x2)+abs(y1-y2)!=1)
return false;
if(x1-1==x2)return false;
a[x1][y1]='.';
a[x2][y2]='G';
return true;
}
}
return false;
}
bool mov(int user,int x1,int y1,int x2,int y2)
{
if(x1>n || x1<=0 || x2>n || x2<=0)return false;
if(y1>m || y1<=0 || y2>m || y2<=0)return false;
if(user==0 && a[x2][y2]>='a' && a[x2][y2]<='g')
return false;
if(user==1 && a[x2][y2]>='A' && a[x2][y2]<='G')
return false;
if(x1==x2 && y1==y2)return false;
if(a[x1][y1]=='a' || a[x1][y1]=='A')
return che(user,x1,y1,x2,y2);
if(a[x1][y1]=='b' || a[x1][y1]=='B')
return ma(user,x1,y1,x2,y2);
if(a[x1][y1]=='c' || a[x1][y1]=='C')
return xiang(user,x1,y1,x2,y2);
if(a[x1][y1]=='d' || a[x1][y1]=='D')
return shi(user,x1,y1,x2,y2);
if(a[x1][y1]=='e' || a[x1][y1]=='E')
return wang(user,x1,y1,x2,y2);
if(a[x1][y1]=='f' || a[x1][y1]=='F')
return pao(user,x1,y1,x2,y2);
if(a[x1][y1]=='g' || a[x1][y1]=='G')
return bing(user,x1,y1,x2,y2);
}
int main()
{
for(int i=1; i<=n; i++)
scanf("%s",a[i]+1);
int step,now=0;
scanf("%d",&step);
while(step--)
{
int user=0,x1,y1,x2,y2;
scanf("%d%d%d%d%d",&user,&x1,&y1,&x2,&y2);
x1++,y1++,x2++,y2++;
if(user!=now)
{
printf("Nemaleswang wrong 1\n");
continue;
}
if((user==0 && a[x1][y1]>='A' && a[x1][y1]<='G')
|| (user==1 && a[x1][y1]>='a' && a[x1][y1]<='g')
|| a[x1][y1]=='.')
{
printf("Nemaleswang wrong 2\n");
continue;
}
if(!mov(user,x1,y1,x2,y2))
{
printf("Nemaleswang wrong 3\n");
continue;
}
int winner=win(user);
if(winner!=-1)
{
printf("%d win!\n",winner);
prt();
return 0;
}
now=1-now;
}
return 0;
}