五子棋

· · 个人记录

欢迎使用五子棋程序!

源代码:

#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
using namespace std;
struct gamestatus
{
    int g[20][20];
    int step;
};
gamestatus g;
int iq=2;
int wx=1,wy=1;
int bx=10,by=10;
int winner;
inline int bigrand()
{
    return rand()*32768+rand();
}
inline int randrange(int l,int r)
{
    return bigrand()%(r-l+1)+l;
}
void gotoxy(int x, int y)
{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void drawmap()
{
    printf("■■■■■■■■■■■■■■■■■■■■■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■                                      ■\n");
    printf("■■■■■■■■■■■■■■■■■■■■■\n");
}
long long score()
{
    long long sc=0;
    int cnt1,cnt2;
    for(int i=1;i<=19;i++)
    {
        for(int j=1;j<=15;j++)
        {
            cnt1=cnt2=0;
            if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
            if(g.g[i][j+1]==1) cnt1++;if(g.g[i][j+1]==2) cnt2++;
            if(g.g[i][j+2]==1) cnt1++;if(g.g[i][j+2]==2) cnt2++;
            if(g.g[i][j+3]==1) cnt1++;if(g.g[i][j+3]==2) cnt2++;
            if(g.g[i][j+4]==1) cnt1++;if(g.g[i][j+4]==2) cnt2++;
            if(cnt1==0 && cnt2==0) continue;
            if(cnt1!=0 && cnt2!=0) continue;
            if(cnt1==0) sc-=pow(iq,cnt2*2);
            if(cnt2==0) sc+=pow(iq,cnt1*2-1);
        }
    }
    for(int j=1;j<=19;j++)
    {
        for(int i=1;i<=15;i++)
        {
            cnt1=cnt2=0;
            if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
            if(g.g[i+1][j]==1) cnt1++;if(g.g[i+1][j]==2) cnt2++;
            if(g.g[i+2][j]==1) cnt1++;if(g.g[i+2][j]==2) cnt2++;
            if(g.g[i+3][j]==1) cnt1++;if(g.g[i+3][j]==2) cnt2++;
            if(g.g[i+4][j]==1) cnt1++;if(g.g[i+4][j]==2) cnt2++;
            if(cnt1==0 && cnt2==0) continue;
            if(cnt1!=0 && cnt2!=0) continue;
            if(cnt1==0) sc-=pow(iq,cnt2*2);
            if(cnt2==0) sc+=pow(iq,cnt1*2-1);
        }
    }
    for(int i=1;i<=15;i++)
    {
        for(int j=1;j<=15;j++)
        {
            cnt1=cnt2=0;
            if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
            if(g.g[i+1][j+1]==1) cnt1++;if(g.g[i+1][j+1]==2) cnt2++;
            if(g.g[i+2][j+2]==1) cnt1++;if(g.g[i+2][j+2]==2) cnt2++;
            if(g.g[i+3][j+3]==1) cnt1++;if(g.g[i+3][j+3]==2) cnt2++;
            if(g.g[i+4][j+4]==1) cnt1++;if(g.g[i+4][j+4]==2) cnt2++;
            if(cnt1==0 && cnt2==0) continue;
            if(cnt1!=0 && cnt2!=0) continue;
            if(cnt1==0) sc-=pow(iq,cnt2*2);
            if(cnt2==0) sc+=pow(iq,cnt1*2-1);
        }
    }
    for(int i=5;i<=19;i++)
    {
        for(int j=1;j<=15;j++)
        {
            cnt1=cnt2=0;
            if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
            if(g.g[i-1][j+1]==1) cnt1++;if(g.g[i-1][j+1]==2) cnt2++;
            if(g.g[i-2][j+2]==1) cnt1++;if(g.g[i-2][j+2]==2) cnt2++;
            if(g.g[i-3][j+3]==1) cnt1++;if(g.g[i-3][j+3]==2) cnt2++;
            if(g.g[i-4][j+4]==1) cnt1++;if(g.g[i-4][j+4]==2) cnt2++;
            if(cnt1==0 && cnt2==0) continue;
            if(cnt1!=0 && cnt2!=0) continue;
            if(cnt1==0) sc-=pow(iq,cnt2*2);
            if(cnt2==0) sc+=pow(iq,cnt1*2-1);
        }
    }
    return sc+bigrand()%(iq*iq);
}
void drop(int x,int y,int turn)
{
    gotoxy(x*2,y);
    printf(turn==1 ? "○" : "●");
    g.g[x][y]=turn;
    g.step++;
    gotoxy(0,0);
}
void blkgo()
{
    int x,y;
    long long mx=-0x8000000000000000;
    for(int i=1;i<=19;i++)
    {
        for(int j=1;j<=19;j++)
        {
            if(g.g[i][j]!=0) continue;
            g.g[i][j]=1;
            long long _sc=score();
            if(_sc>mx)
            {
                mx=_sc;x=i;y=j;
            }
            g.g[i][j]=0;
        }
    }
    if(g.step==0) x=y=10;
    drop(x,y,1);
    bx=x;
    by=y;
}
void whtgo()
{
    while(1)
    {
        int x=rand()%19+1,y=rand()%19+1;
        if(g.g[x][y]==0)
        {
            wx=x;wy=y;
            gotoxy(wx*2,wy);
            printf("·");
            break;
        }
    }
    gotoxy(0,0);
    while(1)
    {
        if(_kbhit())
        {
            int key=_getch();
            if(key==' ')
            {
                if(g.g[wx][wy]==0)
                {
                    drop(wx,wy,2);
                    return;
                }
            }
            if(tolower(key)=='q')
            {
                for(int i=1;i<=10;i++)
                {
                    gotoxy(bx*2,by);
                    printf("☆");
                    gotoxy(0,0);
                    Sleep(500);
                    gotoxy(bx*2,by);
                    printf("○");
                    gotoxy(0,0);
                    Sleep(500);
                }
            }
            if(key==0 || key==224)
            {
                key=_getch();
                bool f=true;
                if(key==75)
                {
                    if(wx<=1) f=false;
                }
                if(key==77)
                {
                    if(wx>=19) f=false;
                }
                if(key==72)
                {
                    if(wy<=1) f=false;
                }
                if(key==80)
                {
                    if(wy>=19) f=false;
                }
                if(f)
                {
                    if(key==75)
                    {
                        gotoxy(wx*2,wy);
                        if(g.g[wx][wy]==0) printf("  ");
                        if(g.g[wx][wy]==2) printf("●");
                        if(g.g[wx][wy]==1) printf("○");
                        wx--;
                        gotoxy(wx*2,wy);
                        printf("·");
                    }
                    if(key==77)
                    {
                        gotoxy(wx*2,wy);
                        if(g.g[wx][wy]==0) printf("  ");
                        if(g.g[wx][wy]==2) printf("●");
                        if(g.g[wx][wy]==1) printf("○");
                        wx++;
                        gotoxy(wx*2,wy);
                        printf("·");
                    }
                    if(key==72)
                    {
                        gotoxy(wx*2,wy);
                        if(g.g[wx][wy]==0) printf("  ");
                        if(g.g[wx][wy]==2) printf("●");
                        if(g.g[wx][wy]==1) printf("○");
                        wy--;
                        gotoxy(wx*2,wy);
                        printf("·");
                    }
                    if(key==80)
                    {
                        gotoxy(wx*2,wy);
                        if(g.g[wx][wy]==0) printf("  ");
                        if(g.g[wx][wy]==2) printf("●");
                        if(g.g[wx][wy]==1) printf("○");
                        wy++;
                        gotoxy(wx*2,wy);
                        printf("·");
                    }
                }
            }
            gotoxy(0,0);
        }
    }
}
int gamestatus()
{
    int cnt1,cnt2;
    for(int i=1;i<=19;i++)
    {
        for(int j=1;j<=15;j++)
        {
            cnt1=cnt2=0;
            if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
            if(g.g[i][j+1]==1) cnt1++;if(g.g[i][j+1]==2) cnt2++;
            if(g.g[i][j+2]==1) cnt1++;if(g.g[i][j+2]==2) cnt2++;
            if(g.g[i][j+3]==1) cnt1++;if(g.g[i][j+3]==2) cnt2++;
            if(g.g[i][j+4]==1) cnt1++;if(g.g[i][j+4]==2) cnt2++;
            if(cnt1==5) return 1;
            if(cnt2==5) return 2;
        }
    }
    for(int j=1;j<=19;j++)
    {
        for(int i=1;i<=15;i++)
        {
            cnt1=cnt2=0;
            if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
            if(g.g[i+1][j]==1) cnt1++;if(g.g[i+1][j]==2) cnt2++;
            if(g.g[i+2][j]==1) cnt1++;if(g.g[i+2][j]==2) cnt2++;
            if(g.g[i+3][j]==1) cnt1++;if(g.g[i+3][j]==2) cnt2++;
            if(g.g[i+4][j]==1) cnt1++;if(g.g[i+4][j]==2) cnt2++;
            if(cnt1==5) return 1;
            if(cnt2==5) return 2;
        }
    }
    for(int i=1;i<=15;i++)
    {
        for(int j=1;j<=15;j++)
        {
            cnt1=cnt2=0;
            if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
            if(g.g[i+1][j+1]==1) cnt1++;if(g.g[i+1][j+1]==2) cnt2++;
            if(g.g[i+2][j+2]==1) cnt1++;if(g.g[i+2][j+2]==2) cnt2++;
            if(g.g[i+3][j+3]==1) cnt1++;if(g.g[i+3][j+3]==2) cnt2++;
            if(g.g[i+4][j+4]==1) cnt1++;if(g.g[i+4][j+4]==2) cnt2++;
            if(cnt1==5) return 1;
            if(cnt2==5) return 2;
        }
    }
    for(int i=5;i<=19;i++)
    {
        for(int j=1;j<=15;j++)
        {
            cnt1=cnt2=0;
            if(g.g[i][j]==1) cnt1++;if(g.g[i][j]==2) cnt2++;
            if(g.g[i-1][j+1]==1) cnt1++;if(g.g[i-1][j+1]==2) cnt2++;
            if(g.g[i-2][j+2]==1) cnt1++;if(g.g[i-2][j+2]==2) cnt2++;
            if(g.g[i-3][j+3]==1) cnt1++;if(g.g[i-3][j+3]==2) cnt2++;
            if(g.g[i-4][j+4]==1) cnt1++;if(g.g[i-4][j+4]==2) cnt2++;
            if(cnt1==5) return 1;
            if(cnt2==5) return 2;
        }
    }
    return 0;
}
int main()
{
    while(1)
    {
        system("cls");
        memset(g.g,0,sizeof(g.g));
        g.step=0;
        srand(time(NULL));
        drawmap();
        while(1)
        {
            blkgo();
            if(gamestatus()==1)
            {
                winner=1;break;
            }
            if(gamestatus()==2)
            {
                winner=2;break;
            }
            whtgo();
            if(gamestatus()==1)
            {
                winner=1;break;
            }
            if(gamestatus()==2)
            {
                winner=2;break;
            }
            Sleep(100);
        }
        Sleep(5000);
        system("cls");
        printf(winner==1 ? "Winner : Computer" : "Winner : You");
        Sleep(3000);
    }
}