ABS五子棋(win7+win10)

· · 个人记录

//win10版本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<time.h>
#include<conio.h>
#include<windows.h>
#include<ctime>
using namespace std;
struct coordinate{
    int X,Y;
}Coor1[626],Coor2[626];
char Getin=' ';
int Map[25][25],Sum1,Sum2;
int Map1[25][25]; 
void No(){
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO CursorInfo;
    GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
    CursorInfo.bVisible = false; //隐藏控制台光标
    SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
}
void _Coordinate_(int x,int y){
    HANDLE winHandle;//句柄
    COORD pos = {x,y};
    winHandle = GetStdHandle(STD_OUTPUT_HANDLE);
    //设置光标位置 
    SetConsoleCursorPosition(winHandle,pos); 
}
int Hrong(int x,int y,int n){
    if(Map[x][y]==n)    return 5;
}
void Nturn(){
    int x1[10],y1[10];
    for(int i=Sum1-1;i>=0;i--){
        int x=Coor2[i].X,y=Coor2[i].Y,Emc=0;
        for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
        while(Map[x1[0]][y1[0]]==2){    x1[0]++;y1[0]++;Emc++;}
        if(Emc==2&&Map[x-1][y-1]==0&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=5+3*Hrong(x1[0]+1,y1[0]+1,2);}
        if(Emc==3&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=50+90*Hrong(x1[0]+1,y1[0]+1,2);}
        if(Emc==4&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=500;}
        Emc=0;
        while(Map[x1[1]][y1[1]]==2){    x1[1]--;y1[1]++;Emc++;}
        if(Emc==2&&Map[x+1][y-1]==0&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=5+3*Hrong(x1[1]-1,y1[1]+1,2);}
        if(Emc==3&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=50+90*Hrong(x1[1]-1,y1[1]+1,2);}
        if(Emc==4&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=500;}
        Emc=0;
        while(Map[x1[2]][y1[2]]==2){    x1[2]++;y1[2]--;Emc++;}
        if(Emc==2&&Map[x-1][y+1]==0&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=5+3*Hrong(x1[2]+1,y1[2]-1,2);}
        if(Emc==3&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=50+90*Hrong(x1[2]+1,y1[2]-1,2);}
        if(Emc==4&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=500;}
        Emc=0; 
        while(Map[x1[3]][y1[3]]==2){    x1[3]--;y1[3]--;Emc++;}
        if(Emc==2&&Map[x+1][y+1]==0&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=5+3*Hrong(x1[3]-1,y1[3]-1,2);}
        if(Emc==3&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=50+90*Hrong(x1[3]-1,y1[3]-1,2);}
        if(Emc==4&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=500;}
        Emc=0;
        while(Map[x1[4]][y1[4]]==2){    x1[4]++;Emc++;}
        if(Emc==2&&Map[x-1][y]==0&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=5+3*Hrong(x1[4]+1,y1[4],2);}
        if(Emc==3&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=50+90*Hrong(x1[4]+1,y1[4],2);}
        if(Emc==4&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=500;}
        Emc=0;
        while(Map[x1[5]][y1[5]]==2){    x1[5]--;Emc++;}
        if(Emc==2&&Map[x+1][y]==0&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=5+3*Hrong(x1[5]-1,y1[5],2);}
        if(Emc==3&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=50+90*Hrong(x1[5]-1,y1[5],2);}
        if(Emc==4&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=500;}
        Emc=0;
        while(Map[x1[6]][y1[6]]==2){    y1[6]--;Emc++;}
        if(Emc==2&&Map[x][y+1]==0&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=5+3*Hrong(x1[6],y1[6]-1,2);}
        if(Emc==3&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=50+90*Hrong(x1[6],y1[6]-1,2);}
        if(Emc==4&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=500;}
        Emc=0;
        while(Map[x1[7]][y1[7]]==2){    y1[7]++;Emc++;}
        if(Emc==2&&Map[x][y-1]==0&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=5+3*Hrong(x1[7],y1[7]+1,2);}
        if(Emc==3&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=50+90*Hrong(x1[7],y1[7]+1,2);}
        if(Emc==4&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=500;}
    }
}
void Uturn(){
    int x1[10],y1[10];
    for(int i=Sum1-1;i>=0;i--){
        int x=Coor1[i].X,y=Coor1[i].Y,Emc=0;
        for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
        while(Map[x1[0]][y1[0]]==1){    x1[0]++;y1[0]++;Emc++;}
        if(Emc==2&&Map[x-1][y-1]==0&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=5+4*Hrong(x1[0]+1,y1[0]+1,1);}
        if(Emc==3&&Map[x-1][y-1]==0&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=45+2*Hrong(x1[0]+1,y1[0]+1,1);}
        if(Emc==4&&Map[x-1][y-1]==2&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=55;}
        Emc=0;
        while(Map[x1[1]][y1[1]]==1){    x1[1]--;y1[1]++;Emc++;}
        if(Emc==2&&Map[x+1][y-1]==0&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=5+4*Hrong(x1[1]-1,y1[1]+1,1);}
        if(Emc==3&&Map[x+1][y-1]==0&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=45+2*Hrong(x1[1]-1,y1[1]+1,1);}
        if(Emc==4&&Map[x+1][y-1]==2&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=55;}
        Emc=0;
        while(Map[x1[2]][y1[2]]==1){    x1[2]++;y1[2]--;Emc++;}
        if(Emc==2&&Map[x-1][y+1]==0&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=5+4*Hrong(x1[2]+1,y1[2]-1,1);}
        if(Emc==3&&Map[x-1][y+1]==0&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=45+2*Hrong(x1[2]+1,y1[2]-1,1);}
        if(Emc==4&&Map[x-1][y+1]==2&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=55;}
        Emc=0; 
        while(Map[x1[3]][y1[3]]==1){    x1[3]--;y1[3]--;Emc++;}
        if(Emc==2&&Map[x+1][y+1]==0&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=5+4*Hrong(x1[3]-1,y1[3]-1,1);}
        if(Emc==3&&Map[x+1][y+1]==0&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=45+2*Hrong(x1[3]-1,y1[3]-1,1);}
        if(Emc==4&&Map[x+1][y+1]==2&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=55;}
        Emc=0;
        while(Map[x1[4]][y1[4]]==1){    x1[4]++;Emc++;}
        if(Emc==2&&Map[x-1][y]==0&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=5+4*Hrong(x1[4]+1,y1[4],1);}
        if(Emc==3&&Map[x-1][y]==0&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=45+2*Hrong(x1[4]+1,y1[4],1);}
        if(Emc==4&&Map[x-1][y]==2&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=55;}
        Emc=0;
        while(Map[x1[5]][y1[5]]==1){    x1[5]--;Emc++;}
        if(Emc==2&&Map[x+1][y]==0&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=5+4*Hrong(x1[5]-1,y1[5],1);}
        if(Emc==3&&Map[x+1][y]==0&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=45+2*Hrong(x1[5]-1,y1[5],1);}
        if(Emc==4&&Map[x+1][y]==2&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=55;}
        Emc=0;
        while(Map[x1[6]][y1[6]]==1){    y1[6]--;Emc++;}
        if(Emc==2&&Map[x][y+1]==0&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=5+4*Hrong(x1[6],y1[6]-1,1);}
        if(Emc==3&&Map[x][y+1]==0&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=45+2*Hrong(x1[6],y1[6]-1,1);}
        if(Emc==4&&Map[x][y+1]==2&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=55;}
        Emc=0;
        while(Map[x1[7]][y1[7]]==1){    y1[7]++;Emc++;}
        if(Emc==2&&Map[x][y-1]==0&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=5+4*Hrong(x1[7],y1[7]+1,1);}
        if(Emc==3&&Map[x][y-1]==0&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=45+2*Hrong(x1[7],y1[7]+1,1);}
        if(Emc==4&&Map[x][y-1]==2&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=55;}
    }
} 
void ESET(){
    for(int i=2;i<23;i++)
        for(int j=2;j<23;j++){
            if(Map[i][j]==0&&Map[i+1][j]!=0&&Map[i-1][j]==Map[i+1][j]&&(Map[i+2][j]==0||Map[i+2][j]==Map[i+1][j])&&(Map[i-2][j]==0||Map[i-2][j]==Map[i-1][j]))
                Map1[i][j]+=10;
            if(Map[i][j]==0&&Map[i][j+1]!=0&&Map[i][j-1]==Map[i][j+1]&&(Map[i][j+2]==0||Map[i][j+2]==Map[i][j+1])&&(Map[i][j-2]==0||Map[i][j-2]==Map[i][j-1]))
                Map1[i][j]+=10;
            if(Map[i][j]==0&&Map[i+1][j+1]!=0&&Map[i-1][j-1]==Map[i+1][j+1]&&(Map[i+2][j+2]==0||Map[i+2][j+2]==Map[i+1][j+1])&&(Map[i-2][j-2]==0||Map[i-2][j-2]==Map[i-1][j-1]))
                Map1[i][j]+=10;
            if(Map[i][j]==0&&Map[i-1][j+1]!=0&&Map[i+1][j-1]==Map[i-1][j+1]&&(Map[i-2][j+2]==0||Map[i-2][j+2]==Map[i-1][j+1])&&(Map[i+2][j-2]==0||Map[i+2][j-2]==Map[i+1][j-1]))
                Map1[i][j]+=10;
        }
} 
void AI(){
    if(Sum1==0){
        Map[12][12]=2;
        Coor2[Sum2].X=12;
        Coor2[Sum2++].Y=12;
        return;
    }
    for(int i=0;i<25;i++)
        for(int j=0;j<25;j++)
            Map1[i][j]=0;
    int x1[10],y1[10],Ax,Ay,Max=0;
    ESET();
    Uturn();
    Nturn();
    for(int i=Sum1-1;i>=0;i--){
        int x=Coor1[i].X,y=Coor1[i].Y,Emc[10]={0};
        for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
        while(Map[x1[0]][y1[0]]==1){    x1[0]++;y1[0]++;Emc[0]++;}
        while(Map[x1[1]][y1[1]]==1){    x1[1]--;y1[1]++;Emc[1]++;}
        while(Map[x1[2]][y1[2]]==1){    x1[2]++;y1[2]--;Emc[2]++;}
        while(Map[x1[3]][y1[3]]==1){    x1[3]--;y1[3]--;Emc[3]++;}
        while(Map[x1[4]][y1[4]]==1){    x1[4]++;Emc[4]++;}
        while(Map[x1[5]][y1[5]]==1){    x1[5]--;Emc[5]++;}
        while(Map[x1[6]][y1[6]]==1){    y1[6]--;Emc[6]++;}
        while(Map[x1[7]][y1[7]]==1){    y1[7]++;Emc[7]++;}
        for(int j=0;j<8;j++)
            if(Map[x1[j]][y1[j]]==0)    Map1[x1[j]][y1[j]]+=Emc[j]; 
    }
    for(int i=Sum2-1;i>=0;i--){
        int x=Coor2[i].X,y=Coor2[i].Y,Emc[10]={0};
        for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
        while(Map[x1[0]][y1[0]]==2){    x1[0]++;y1[0]++;Emc[0]+=2;}
        while(Map[x1[1]][y1[1]]==2){    x1[1]--;y1[1]++;Emc[1]+=2;}
        while(Map[x1[2]][y1[2]]==2){    x1[2]++;y1[2]--;Emc[2]+=2;}
        while(Map[x1[3]][y1[3]]==2){    x1[3]--;y1[3]--;Emc[3]+=2;}
        while(Map[x1[4]][y1[4]]==2){    x1[4]++;Emc[4]+=2;}
        while(Map[x1[5]][y1[5]]==2){    x1[5]--;Emc[5]+=2;}
        while(Map[x1[6]][y1[6]]==2){    y1[6]--;Emc[6]+=2;}
        while(Map[x1[7]][y1[7]]==2){    y1[7]++;Emc[7]+=2;}
        for(int j=0;j<8;j++)
            if(Map[x1[j]][y1[j]]==0)    Map1[x1[j]][y1[j]]+=Emc[j];
    }
    for(int i=0;i<25;i++)
        for(int j=0;j<25;j++)
            if(Map1[i][j]>Max){
                Max=Map1[i][j];
                Ax=i;
                Ay=j;
            }
    Map[Ax][Ay]=2;
    Coor2[Sum2].X=Ax;
    Coor2[Sum2++].Y=Ay;
    return;
}
void Win(){
    int x1[10],y1[10],Max1=0,Max2=0;
    for(int i=0,e=0;i<Sum1;i++){
        int x=Coor1[i].X,y=Coor1[i].Y;
        for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
        while(Map[x1[0]][y1[0]]==1){    x1[0]++;y1[0]++;e++;}
        Max1=max(e,Max1);
        e=0;
        while(Map[x1[1]][y1[1]]==1){    x1[1]--;y1[1]++;e++;}
        Max1=max(e,Max1);
        e=0;
        while(Map[x1[2]][y1[2]]==1){    x1[2]++;y1[2]--;e++;}
        Max1=max(e,Max1);
        e=0;
        while(Map[x1[3]][y1[3]]==1){    x1[3]--;y1[3]--;e++;}
        Max1=max(e,Max1);
        e=0;
        while(Map[x1[4]][y1[4]]==1){    x1[4]++;e++;}
        Max1=max(e,Max1);
        e=0;
        while(Map[x1[5]][y1[5]]==1){    x1[5]--;e++;}
        Max1=max(e,Max1);
        e=0;
        while(Map[x1[6]][y1[6]]==1){    y1[6]--;e++;}
        Max1=max(e,Max1);
        e=0;
        while(Map[x1[7]][y1[7]]==1){    y1[7]++;e++;}
        Max1=max(e,Max1);
        e=0;
        if(Max1>=5){
            cout<<"电脑就是给智障,你赢了!!!"; 
            getchar();
            exit(0);
        }
    }
    for(int i=0,e=0;i<Sum2;i++){
        int x=Coor2[i].X,y=Coor2[i].Y;
        for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
        while(Map[x1[0]][y1[0]]==2){    x1[0]++;y1[0]++;e++;}
        Max2=max(e,Max2);
        e=0;
        while(Map[x1[1]][y1[1]]==2){    x1[1]--;y1[1]++;e++;}
        Max2=max(e,Max2);
        e=0;
        while(Map[x1[2]][y1[2]]==2){    x1[2]++;y1[2]--;e++;}
        Max2=max(e,Max2);
        e=0;
        while(Map[x1[3]][y1[3]]==2){    x1[3]--;y1[3]--;e++;}
        Max2=max(e,Max2);
        e=0;
        while(Map[x1[4]][y1[4]]==2){    x1[4]++;e++;}
        Max2=max(e,Max2);
        e=0;
        while(Map[x1[5]][y1[5]]==2){    x1[5]--;e++;}
        Max2=max(e,Max2);
        e=0;
        while(Map[x1[6]][y1[6]]==2){    y1[6]--;e++;}
        Max2=max(e,Max2);
        e=0;
        while(Map[x1[7]][y1[7]]==2){    y1[7]++;e++;}
        Max2=max(e,Max2);
        e=0;
        if(Max2>=5){
            cout<<"你就是给智障,电脑赢了!!!";
            getchar();
            exit(0); 
        }
    }
}
void start(bool a){
    char in=0;
    int X=12,Y=12;
    bool Flag=1;
    system("mode con cols=50 lines=26");
    if(a){
        while(in!='\n'){
            _Coordinate_(0,0);
            for(int i=0;i<25;i++){
                for(int j=0;j<25;j++){
                    if(i==X&&j==Y){cout<<"╳ ";continue;}
                    if(Map[i][j]==0){cout<<"╋ ";continue;}
                }
                cout<<"\n";
            }
            in=getch();
            if(in=='w') X--;
            if(in=='s') X++;
            if(in=='a') Y--;
            if(in=='d') Y++;
            if(in==' '){Map[X][Y]=1;Coor1[Sum1].X=X;Coor1[Sum1++].Y=Y;break;}
        }
    }while(1){
        _Coordinate_(0,0);
        if(Flag)    AI();
        for(int i=0;i<25;i++){
            for(int j=0;j<25;j++){
                if(i==X&&j==Y){cout<<"╳ ";continue;}
                if(Map[i][j]==2){cout<<"○";continue;}
                if(Map[i][j]==1){cout<<"●";continue;}
                if(Map[i][j]==0){cout<<"╋ ";continue;}
            }
        cout<<"\n";
        }if(Flag)   Win();
        in=getch();
        Flag=0; 
        if(in=='w'){X--;Flag=0;}
        if(in=='s'){X++;Flag=0;} 
        if(in=='a'){Y--;Flag=0;} 
        if(in=='d'){Y++;Flag=0;} 
        if(in==' '){
            if(Map[X][Y])   Flag=0;
            else{
                Map[X][Y]=1;
                Flag=1;
                Coor1[Sum1].X=X;
                Coor1[Sum1++].Y=Y;
            }
        }
    }
}
void manu1(){
    _Coordinate_(0,0);
    cout<<"■■■■■■■■■■\n";
    cout<<"■   1.先手       ■\n";
    cout<<"■   2.后手       ■\n"; 
    cout<<"■■■■■■■■■■";
    while(1){
        char in=getch();
        if(in=='1') start(1);
        if(in=='2') start(0);
    }
}
void manu(){
    system("cls");
    cout<<"■■■■■■■■■■\n";
    cout<<"■   abs五子棋    ■\n";
    cout<<"■   1.开局       ■\n";
    cout<<"■■■■■■■■■■";
    while(1){
        char in=getch();
        if(in=='1') manu1();
    }
}
int main(){
    system("mode con cols=20 lines=4");
    No();
    manu();
    return 0;
}