美文网首页
模拟中国象棋

模拟中国象棋

作者: fo0Old | 来源:发表于2017-07-01 18:28 被阅读0次

    象棋

    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;
    }
    

    相关文章

      网友评论

          本文标题:模拟中国象棋

          本文链接:https://www.haomeiwen.com/subject/pmrgcxtx.html