模拟中国象棋

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;
}
上一篇下一篇

猜你喜欢

热点阅读