#include<bits/stdc++.h>
using namespace std;
int a[10][10];  // 棋盘大小  9*9 ;
int x[8]={1,1,1,-1,-1,-1,0,0};
int y[8]={1,-1,0,1,-1,0,-1,1}; // 方向
bool X(int x,int y){ // 防御用  检测是否是玩家的子并且判断是否合法
    if(x>=1 && x<=9 && y>=1 && y<=9 && a[x][y]==1) return 1;
    return 0;
}
bool Y(int x,int y){ // 攻击用  检测是否是电脑的子并且判断是否合法
    if(x>=1 && x<=9 && y>=1 && y<=9 && a[x][y]==2) return 1;
    return 0;
}
int check1(int number){ //  检验玩家是否number个一排
    int w=0;
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            for(int pos=0;pos<8;pos++){
                int c=0;
                for(int k=0;k<number;k++){
                    if(X(i+k*x[pos],j+k*y[pos])) c++;
                }
                if(c==number) w++;
            }
        }
    }
    return w;
}
int check2(int number){  //  检验电脑是否number个一排
    int w=0;
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            for(int pos=0;pos<8;pos++){
                int c=0;
                for(int k=0;k<number;k++){
                    if(Y(i+k*x[pos],j+k*y[pos])) c++;
                }
                if(c==number) w++;
            }
        }
    }
    return w;
}
int check11(int number){   // 玩家是否 *oooo*   返回个数
    int w=0;
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            for(int pos=0;pos<8;pos++){
                int c=0;
                for(int k=1;k<=number;k++){
                    if(X(i+k*x[pos],j+k*y[pos])) c++;
                }
                if(c==number && Y(i,j) && Y(i+(number+1)*x[pos],j+(number+1)*y[pos]) ) w++;
            }
        }
    } return w;
}
int check21(int number){   // 电脑是否 o****o  中间number 个* 返回个数
    int w=0;
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            for(int pos=0;pos<8;pos++){
                int c=0;
                for(int k=1;k<=number;k++){
                    if(Y(i+k*x[pos],j+k*y[pos])) c++;
                }
                if(c==4 && X(i,j) && X(i+(number+1)*x[pos],j+(number+1)*y[pos]) ) w++;
            }
        }
    }
    return w;
}

void solve(int x,int y) {  // 评估函数   // 先攻击 再防守  // 后评估是否进攻 防御
    long long b[10][10]; // 用函数的值来判定电脑填哪个位置.
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            b[i][j]=5-fabs(5-i)+5-fabs(5-j);
        }
    }
    cout<<"  ";
    for(int i=1;i<=9;i++){cout<<i<<" ";} cout<<endl;
    for(int i=1;i<=9;i++){
        cout<<i<<" ";
        for(int j=1;j<=9;j++){
           cout<<b[i][j]<<" ";
        }cout<<endl;
    }cout<<endl;
    // 攻击评分
     for(int i=1;i<=9;i++){  // 检验自己是否下这个点就赢了
        for(int j=1;j<=9;j++){
            if(a[i][j]) continue;
            a[i][j]=2;  if(check2(5)) {   a[i][j]=2; cout<<" 电脑停放位置 "<<i<<" "<<j<<endl; /* cout<<" 能够直接赢 "<<endl; */ return ;  } a[i][j]=0;
        }
    }

    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            if(a[i][j]) continue;
            int num1,num2;
            num1=check2(4); a[i][j]=2;    num2=check2(4);       a[i][j]=0;  b[i][j]+=(num2-num1)*1000000000 ;// **** // 检验自己是否4个一串
            num1=check21(4);a[i][j]=2;    num2=check21(4);      a[i][j]=0;  b[i][j]-=(num2-num1)*1000000000;//  -++++-
            num1=check2(3); a[i][j]=2;    num2=check2(3);       a[i][j]=0;  b[i][j]+=(num2-num1)*10000000; // *** // 检验自己是否3个一串
            num1=check21(3);a[i][j]=2;    num2=check21(3);      a[i][j]=0;  b[i][j]-=(num2-num1)*10000000;//  -+++-
            num1=check2(2); a[i][j]=2;    num2=check2(3);       a[i][j]=0;  b[i][j]+=(num2-num1)*100000; // ** // 检验自己是否两个一串
            num1=check21(2);a[i][j]=2;    num2=check21(2);      a[i][j]=0;  b[i][j]-=(num2-num1)*100000;//  -++-
        }
    }
    // 防守  防守对面直接死
    for(int i=1;i<=9;i++){  // 检验对手是否下这个点就赢了
        for(int j=1;j<=9;j++){
            if(a[i][j]) continue;
            a[i][j]=1;  if(check1(5)) {  a[i][j]=2;  cout<<" 电脑停放位置 "<<i<<" "<<j<<endl;return ;  }   a[i][j]=0;          // ooooo
        }
    }
    // 防守评分
    for(int i=1;i<=9;i++){  // 检验对手是否4个一串
        for(int j=1;j<=9;j++){
            if(a[i][j]) continue;
            int num1,num2;
            num1=check1(4); a[i][j]=1;    num2=check1(4);       a[i][j]=0;  b[i][j]+=(num2-num1)*100000000; // **** // 检验自己是否4个一串
            num1=check11(4);a[i][j]=1;    num2=check11(4);      a[i][j]=0;  b[i][j]-=(num2-num1)*100000000;//  -++++-
            num1=check1(3); a[i][j]=1;    num2=check1(3);       a[i][j]=0;  b[i][j]+=(num2-num1)*1000000; // *** // 检验自己是否3个一串
            num1=check11(3);a[i][j]=1;    num2=check11(3);      a[i][j]=0;  b[i][j]-=(num2-num1)*1000000;//  -+++-
            num1=check1(2); a[i][j]=1;    num2=check1(3);       a[i][j]=0;  b[i][j]+=(num2-num1)*10000; // ** // 检验自己是否两个一串
            num1=check11(2);a[i][j]=1;    num2=check11(2);      a[i][j]=0;  b[i][j]-=(num2-num1)*10000;//  -++-
        }
    }
    int num=0;
    int aa,bb;
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            if(a[i][j]==0&&b[i][j]>num){
                num=b[i][j];
                aa=i;
                bb=j;
            }
        }
    }
    cout<<" 电脑停放位置 "<<aa<<" "<<bb<<endl;
    a[aa][bb]=2; return ;
}
void show(){
    cout<<"  ";
    for(int i=1;i<=9;i++){cout<<i<<" ";} cout<<endl;
    for(int i=1;i<=9;i++){
        cout<<i<<" ";
        for(int j=1;j<=9;j++){
            if(a[i][j]==0) cout<<". ";
            if(a[i][j]==1) cout<<"o "; // 玩家
            if(a[i][j]==2) cout<<"* "; // 电脑
        }cout<<endl;
    }cout<<endl;
}
int main(){
    cout<<" 人机对抗博弈 玩家先手 "<<endl;
    show();
    while(1){
        cout<<"-------------------"<<endl;
        int x,y;
        while(1){
            cout<<" 玩家停放位置 ";
            cin>>x>>y;
            if(a[x][y] || x>9 || x<=0 || y>9 || y<=0) { cout<<" 此位置已被占领 请重新输入 "<<endl; }
            else {  break; }
        }
        a[x][y]=1;
        bool k=0; k=check1(5);  if(k){ show(); cout<<" 玩家胜利  游戏结束 "<<endl; break; }
        solve(x,y);
                  k=check2(5);  if(k){ show(); cout<<" 电脑胜利  游戏结束 "<<endl; break; }
        show();
    }
}
12-22 01:31