Uva 220 Othello

又是一个黑白棋的大模拟,这种棋类模拟通常分为多个函数实现能大大减少代码量。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

#define N 15

char mat[N][N],player[2],com[4];
bool state;

typedef struct node{
    int x,y;
};

bool judge(int x,int y){
     if(x>=0&&y>=0&&x<=7&&y<=7) return true;
     else return false;
}


node leg[100];

int gox[8]={0,0,-1,1,1,1,-1,-1},goy[8]={-1,1,0,0,-1,1,-1,1};


int ret(char a){
    if(a=='W') return 0;
    if(a=='B') return 1;
    else return -1;
}


node Move(int a,int b){
     int x,y;
     bool flag;
     for(int i=0;i<8;i++){
        x=a+gox[i];
        y=b+goy[i];
        flag=false;
        if(judge(x,y)){
            if(~ret(mat[y][x])){//如果下一格不为空
            if(state^ret(mat[y][x])){//如果下一格是敌方棋子
               while(1){
                x=x+gox[i];
                y=y+goy[i];
                if(judge(x,y)){
                    if(~ret(mat[y][x])){
                        if(!(state^ret(mat[y][x]))){
                            flag=true;
                            break;
                        }
                    }
                    else break;
                }
                else break;
               }
               if(flag){
                x=a;
                y=b;
                while(1){
                x=x+gox[i];
                y=y+goy[i];
                if(!(state^ret(mat[y][x]))){
                    break;
                }
                else{
                    if(state){
                        mat[y][x]='B';
                    }
                    else mat[y][x]='W';
                }
               }
               }
            }
            }
        }
     }
     if(state){
        mat[b][a]='B';
     }
     else mat[b][a]='W';
     node rnt;
     rnt.x=0;
     rnt.y=0;
     for(int i=0;i<8;i++){
        for(int j=0;j<8;j++){
            if(mat[i][j]=='W') rnt.y++;
            if(mat[i][j]=='B') rnt.x++;
        }
     }
     return rnt;
}

void deal(char *a){
     int x,y;
     int n=0;
     node ans;
     bool flag,flag2;
     if(a[0]=='L'||a[0]=='M'){
        for(int i=0;i<8;i++){
            for(int j=0;j<8;j++){
                    x=j;
                    y=i;
                    flag=false;
                    if(ret(mat[i][j])!=-1) continue;
                for(int k=0;k<8;k++){
                        if(flag) break;
                        x=j+gox[k];
                        y=i+goy[k];
                        if(judge(x,y)){//判断该方向上的下一个点是否在棋盘内
                            if(~ret(mat[y][x])){//判断下一格是否为空
                            if(state^ret(mat[y][x])){//判断下一个点是否是敌方的点
                                while(1){//寻找己方的点
                                  x+=gox[k];
                                  y+=goy[k];
                                  if(judge(x,y)){
                                    if(~ret(mat[y][x])){
                                     if(!(state^ret(mat[y][x]))){//如果是己方的点
                                        flag=true;//该位置合法
                                        break;
                                     }
                                    }
                                    else break;
                                  }
                                  else  break;
                                }
                            }
                            else continue;
                            }
                        }
                }
                if(flag){//如果位置合法,存储
                    leg[n].x=j;
                    leg[n++].y=i;
                }
            }
        }
        if(a[0]=='L'){
            if(n){
            for(int i=0;i<n;i++){
                printf("(%d,%d)",leg[i].y+1,leg[i].x+1);
                if(i==n-1) printf("\n");
                else printf(" ");
            }
            }
            else printf("No legal move.\n");
        }
        else{
            flag=false;
            y=a[1]-'1';
            x=a[2]-'1';
            for(int i=0;i<n;i++){
                if(leg[i].x==x&&leg[i].y==y){
                    flag=true;
                    break;
                }
            }
            if(flag){
                ans=Move(x,y);
                printf("Black - %2d White - %2d\n",ans.x,ans.y);
            }
            else{
                state^=1;
                ans=Move(x,y);
                printf("Black - %2d White - %2d\n",ans.x,ans.y);
            }
            state^=1;
        }
     }
     else if(a[0]=='Q'){
        for(int i=0;i<8;i++){
            printf("%s\n",mat[i]);
        }
     }
}

int main()
{
    int T;
    cin>>T;
    getchar();
    while(T--){
        for(int i=0;i<8;i++){
            gets(mat[i]);
        }
        gets(player);
        if(player[0]=='W') state=0;
        else state=1;
        while(1){
            gets(com);
            deal(com);
            if(com[0]=='Q') break;
        }
        if(T)
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值