uva220 Othello

黑白棋

题意就是模拟下棋,

L:查询当前合法的下子位置,若无,特殊输出,若有,输出在一行。

MXX:先判当前棋手是否有合法的下子位置,若无自动换人,然后下子,再换人(再换人这部分题目里没有说但是根据测试数据2可以推断出来)。

        若有合法位置,下子,换人。

        两种都要输出下子结束后双方棋的个数,注意格式为“Black - %2d White - %2d”

Q:结束当前棋局并打印棋盘。

注意输出格式。

注意每个棋盘之间有空行,第一个之前没有空行,最后一个之后也没有空行。

其实不难,就是很烦。

上代码

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;
int maze[11][11];
int cur;
int dir[8][2]={{1,0},{0,1},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
bool ma[11][11];

void numm(){
    int b=0,w=0;
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            if(maze[i][j]==1)w++;
            if(maze[i][j]==-1)b++;
        }
    }

    printf("Black - %2d White - %2d\n",b,w);


}

bool lista(){
    bool f=false;
    memset(ma,false,sizeof(ma));
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            if(maze[i][j]!=cur)continue;
            for(int k=0;k<8;k++){
                int x=i+dir[k][0];
                int y=j+dir[k][1];
                if(maze[x][y]!=cur*(-1))continue;
                while(true){
                    x+=dir[k][0];
                    y+=dir[k][1];
                    if(x<1||x>8||y<1||y>8)break;
                    if(maze[x][y]==0){
                            f=true;
                            ma[x][y]=true;
                            break;
                    }
                    if(maze[x][y]==cur)break;
                    if(maze[x][y]==cur*(-1))continue;
                }
            }
        }
    }
    return f;
}

void mova(int a,int b){
    maze[a][b]=cur;
    for(int k=0;k<8;k++){
        int x=a+dir[k][0];
        int y=b+dir[k][1];
        if(maze[x][y]!=cur*(-1))continue;
         while(true){
                    x+=dir[k][0];
                    y+=dir[k][1];
                    if(x<1||x>8||y<1||y>8)break;
                    if(maze[x][y]==0)break;
                    if(maze[x][y]==cur){
                        int xx=a,yy=b;
                        while(xx!=x||yy!=y){
                            xx+=dir[k][0];
                            yy+=dir[k][1];
                            maze[xx][yy]=cur;
                        }
                        break;
                    }
                    if(maze[x][y]==cur*(-1))continue;
        }
    }

}

void movee(int a,int b){
    bool u=lista();
    if(u){
        mova(a,b);
        numm();
        cur*=-1;
    }else {
        cur*=-1;
        mova(a,b);
        numm();
        cur*=-1;
    }
}


void printma(){
    bool l=false;
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            if(ma[i][j]&&l){
                   printf(" (%d,%d)",i,j);
            }
            if(ma[i][j]&&!l){
                    printf("(%d,%d)",i,j);
                    l=true;
            }
        }
    }
    printf("\n");
}
void print(){
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            if(maze[i][j]==0)printf("-");
            if(maze[i][j]==1)printf("W");
            if(maze[i][j]==-1)printf("B");
        }
        printf("\n");
    }
}

void inita(){
    memset(maze,0,sizeof(maze));
    cur=0;
}
int main()
{
    int N;
    char c;
    cin>>N;
    bool h=false;
    while(N--){
        if(h)printf("\n");
        h=true;
        inita();
        for(int i=1;i<=8;i++){
            for(int j=1;j<=8;j++){
                cin>>c;
                if(c=='-')maze[i][j]=0;
                if(c=='B'){
                        maze[i][j]=-1;
                }
                if(c=='W'){
                        maze[i][j]=1;
                }
            }
        }
        cin>>c;
        if(c=='B')cur=-1;
        if(c=='W')cur=1;
        while(true){
            cin>>c;
            if(c=='Q'){
                    print();
                    break;
            }
            if(c=='L'){
                   if( lista())printma();
                   else printf("No legal move.\n");
            }
            if(c=='M'){
                int a,b;
                cin>>c;
                a=c-'0';
                cin>>c;
                b=c-'0';
                movee(a,b);
            }
        }

    }
    return 0;
}

你可能感兴趣的:(紫书)